在 java 中编写自定义 jdbc 驱动程序一个非常基本的

Roc*_*lid 9 java jdbc driver

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

Pet*_*erB 16

我写了一个“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));
     }
    
    Run Code Online (Sandbox Code Playgroud)

我给 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 类
  • 语句构造函数
  • 语句.executeQuery。因为它返回一个 ResultSet 类
  • 结果集构造函数
  • 结果集.getString(int)
  • 结果集.next()

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

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

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

以下是来源:


Dáv*_*áth 9

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

我的经验是,考虑任何 API,研究现有的“类似参考”的实现都非常有用。就 JDBC 而言,H2是一个很好的研究示例。

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

https://github.com/h2database/h2database/ 。。。/驱动程序.java

这个包中还有其他类:

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

H2是一个成熟且复杂的软件,但代码仍然具有可读性和可研究性。

如果您好奇,这里是miniconnect项目(由我维护)的一个更简单的实现:

https://github.com/miniconnect/miniconnect/ 。。。/jdbc


gkn*_*ker 5

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

你的想法是正确的,但是要interfacesjava.sql包中实现。研究 API 文档以了解每种方法的用途,以便您能够以有意义的方式实现它。

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


bvd*_*vdb 5

有关良好的演练,请参阅此 Java World 教程

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

  • 司机
  • 联系
  • 陈述
  • 结果集

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

  • 这篇文章是 2002 年的,已经过时了。现在有[服务提供者声明](https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service_Provider)。 (2认同)