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

时间:2015-01-23 16:49:22

标签: java jdbc driver

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

4 个答案:

答案 0 :(得分:2)

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

您有正确的想法,但在java.sql包中实施interfaces。研究API文档以了解每种方法的目的,以便您以有意义的方式实现它。

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

答案 1 :(得分:0)

有关详细的演练,请参阅this Java World tutorial

基本上,您需要创建4个类:

  • 驱动程序
  • 连接
  • 声明
  • ResultSet

但是正如您将在该教程中看到的那样,它并不是那么简单。

答案 2 :(得分:0)

我处于类似情况。看到一个简约的示例很高兴,但我也没有找到一个示例。

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

要实现的主要界面是java.sql.Driver。 H2就是这样实现的:

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

该程序包中还有其他类:

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

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

答案 3 :(得分:0)

我写了一个“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)。这个连接方法应该检查 jdbc url 并决定它是否可以处理这个 url。如果是,则返回一个 Connection 对象,如果不是,则返回 null。

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

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

所以我必须实现:

  • Driver.connect(String, Properties)。因为这个方法返回一个 Connection 类
  • 连接构造函数
  • Connection.createStatement 方法。因为这会返回一个 Statement 类
  • 语句构造函数
  • Statement.executeQuery。因为这会返回一个 ResultSet 类
  • 结果集构造函数
  • ResultSet.getString(int)
  • ResultSet.next()

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

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

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

以下是来源: