【问题标题】:Writing a custom jdbc driver in java a very basic one在 java 中编写自定义 jdbc 驱动程序是一个非常基本的驱动程序
【发布时间】:2015-01-23 16:49:22
【问题描述】:

由于某些 BI 工具软件限制,我需要通过 JDBC 公开 Web 服务。
非常有限的支持需要很少定义的选择查询。
据我所知,我需要实现接口 java.sql 下的所有类来实现这一点。有没有人做过类似的事情?
我们是否有一些自定义实现需要实现最少的代码。

【问题讨论】:

  • 好话题,但不清楚你在问什么。

标签: java jdbc driver


【解决方案1】:

我写了一个“csv-jdbc-driver”只是为了好玩。它远非生产质量代码,我的目标只是(为我自己)演示如何编写 jdbc 驱动程序。

以下是我的经验:

  • 正如其他人所写,从 java.sql 实现 4 个接口就足够了:Driver、Statement、Connection、ResultSet。

  • 要知道,应该用“真实代码”实现哪种方法,我必须知道,我想如何使用 csv 驱动程序。这是我的示例代码:

         try (
     Connection conn = DriverManager.getConnection("jdbc:csv:/home/peter/csvdir");
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT * FROM test.csv")
     ){
         while (rs.next()) System.out.println(rs.getString(1) + " - " + rs.getString(2));
     }
    

我给 DriverManager.getConnection 一个 jdbc url。在 url 中,我必须指定一个目录,其中包含不同的 csv 文件。 DriverManager getConnection 方法调用 Driver.connect(url, info)。这个 connect 方法应该检查 jdbc url 并决定它是否可以处理 url。如果是,则返回一个 Connection 对象,如果不是,则返回 null。

在 stms.executeQuery 中,我必须给出一个 SQL 选择,其中“表名”是 csv 文件的名称。 我不想实现 sql 解析器,所以这个 jdbc 驱动只考虑表名。

我还必须至少使用 ResultSet.next() 和 ResultSet.getString(int) 方法。

所以我必须实现:

  • Driver.connect(字符串,属性)。因为这个方法返回一个 Connection 类
  • 连接构造函数
  • Connection.createStatement 方法。因为这会返回一个 Statement 类
  • 语句构造函数
  • Statement.executeQuery。因为这会返回一个 ResultSet 类
  • ResultSet 构造函数
  • ResultSet.getString(int)
  • ResultSet.next()

我还在 src/main/resources/MET-INF/services/java.sql.Driver 中创建了一个服务提供者文件,其内容为 org.example.CsvDriver(我的 Driver 实现类名)

我想,这些就足够了,但还不够。我的驱动程序已加载,但 DriverManager 没有找到它。

我还必须从我的 Driver 实现的静态初始化程序中调用 DriverManager.registerDriver(INSTANCE),其中 INSTANCE 是我的 Driver 实现中的一个对象。在我看来这是多余的(因为我写了一个 java 服务来避免这种情况)。

以下是来源:

【讨论】:

    【解决方案2】:

    如需详细介绍,请参阅this Java World tutorial

    基本上你需要创建4个类:

    • 驱动程序
    • 连接
    • 声明
    • 结果集

    但正如您将在该教程中看到的那样,事情并没有那么简单。

    【讨论】:

    【解决方案3】:

    我也遇到过类似的情况。很高兴看到一个简约的例子,但我也没有找到。

    我的经验是,考虑到任何 API,研究现有的“类引用”实现都非常有用。对于 JDBC,H2 是一个很好的学习例子。

    实现的主要接口是java.sql.Driver。这就是 H2 的实现方式:

    https://github.com/h2database/h2database/ . . . /Driver.java

    这个包中还有其他类:

    https://github.com/h2database/h2database/ . . . /jdbc

    H2是一款成熟复杂的软件,但代码还是可读可学习的。

    【讨论】:

      【解决方案4】:

      是的,我已经编写了自定义驱动程序。

      你的想法是对的,但是在java.sql 包中实现interfaces。研究 API 文档以了解每种方法的用途,以便以有意义的方式实现它。

      从您的简单驱动程序不支持的任何方法中抛出 UnsupportedOperationException

      【讨论】:

      • 您能分享一些编写驱动程序的代码吗?
        如果在定义良好的简单 csv 文件上看到类似 SQL 的支持会很有趣。
      • 我可以分享我所做的,但老实说,对于 CSV 驱动程序,它对您没有用处。不过,这真的很容易,相信我。首先创建一个public class CsvConnection implements java.sql.Connection,由于接口依赖,驱动程序实际上会自己编写。
      • 如果您能告诉我们哪些方法是最少要实现的,那将会很有帮助。毕竟java.sql.Connection接口定义了54个方法。就像你说的,你可以通过简单地返回 null 或抛出 UnsupportedOperationException 来跳过大部分。
      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2021-05-28
      • 2016-09-22
      相关资源
      最近更新 更多