【发布时间】:2015-01-23 16:49:22
【问题描述】:
由于某些 BI 工具软件限制,我需要通过 JDBC 公开 Web 服务。
非常有限的支持需要很少定义的选择查询。
据我所知,我需要实现接口 java.sql 下的所有类来实现这一点。有没有人做过类似的事情?
我们是否有一些自定义实现需要实现最少的代码。
【问题讨论】:
-
好话题,但不清楚你在问什么。
由于某些 BI 工具软件限制,我需要通过 JDBC 公开 Web 服务。
非常有限的支持需要很少定义的选择查询。
据我所知,我需要实现接口 java.sql 下的所有类来实现这一点。有没有人做过类似的事情?
我们是否有一些自定义实现需要实现最少的代码。
【问题讨论】:
我写了一个“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) 方法。
所以我必须实现:
我还在 src/main/resources/MET-INF/services/java.sql.Driver 中创建了一个服务提供者文件,其内容为 org.example.CsvDriver(我的 Driver 实现类名)
我想,这些就足够了,但还不够。我的驱动程序已加载,但 DriverManager 没有找到它。
我还必须从我的 Driver 实现的静态初始化程序中调用 DriverManager.registerDriver(INSTANCE),其中 INSTANCE 是我的 Driver 实现中的一个对象。在我看来这是多余的(因为我写了一个 java 服务来避免这种情况)。
以下是来源:
【讨论】:
【讨论】:
我也遇到过类似的情况。很高兴看到一个简约的例子,但我也没有找到。
我的经验是,考虑到任何 API,研究现有的“类引用”实现都非常有用。对于 JDBC,H2 是一个很好的学习例子。
实现的主要接口是java.sql.Driver。这就是 H2 的实现方式:
https://github.com/h2database/h2database/ . . . /Driver.java
这个包中还有其他类:
https://github.com/h2database/h2database/ . . . /jdbc
H2是一款成熟复杂的软件,但代码还是可读可学习的。
【讨论】:
是的,我已经编写了自定义驱动程序。
你的想法是对的,但是在java.sql 包中实现interfaces。研究 API 文档以了解每种方法的用途,以便以有意义的方式实现它。
从您的简单驱动程序不支持的任何方法中抛出 UnsupportedOperationException。
【讨论】:
public class CsvConnection implements java.sql.Connection,由于接口依赖,驱动程序实际上会自己编写。
java.sql.Connection接口定义了54个方法。就像你说的,你可以通过简单地返回 null 或抛出 UnsupportedOperationException 来跳过大部分。