由于一些BI工具软件限制,我需要通过JDBC公开Web服务。
非常有限的支持需要很少的定义选择查询
据我所知,我需要在java.sql接口下实现所有类来实现它。有没有人做过类似的事情?
我们是否有一些自定义实现需要实现最低限度的代码。
答案 0 :(得分:2)
是的,我写了自定义驱动程序。
您有正确的想法,但在java.sql
包中实施interfaces
。研究API文档以了解每种方法的目的,以便您以有意义的方式实现它。
从您的简单驱动程序不支持的任何方法中抛出UnsupportedOperationException
。
答案 1 :(得分:0)
答案 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) 方法。
所以我必须实现:
我还在 src/main/resources/MET-INF/services/java.sql.Driver 中创建了一个服务提供程序文件,内容为 org.example.CsvDriver(我的驱动程序实现类名称)
我想,这些就足够了,但还不够。我的驱动程序加载了,但 DriverManager 没有找到它。
我还必须从我的 Driver 实现的静态初始值设定项中调用 DriverManager.registerDriver(INSTANCE),其中 INSTANCE 是我的 Driver 实现中的一个对象。在我看来这是多余的(因为我写了一个 java 服务来避免这种情况)。
以下是来源: