gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:05:29 25 4
gpt4 key购买 nike

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

最佳答案

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

  • 正如其他人所写,从 java.sql 实现 4 个接口(interface)就足够了: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 类
  • 结果集构造函数
  • 结果集.getString(int)
  • 结果集.next()

  • 我还在 src/main/resources/MET-INF/services/java.sql.Driver 中创建了一个服务提供程序文件,其内容为 org.example.CsvDriver (我的驱动程序实现类名)
    我想,这些就足够了,但不是。我的驱动程序已加载,但 DriverManager 没有找到它。
    我还必须从我的 Driver 实现的静态初始化程序中调用 DriverManager.registerDriver(INSTANCE),其中 INSTANCE 是我的 Driver 实现中的一个对象。在我看来这是多余的(因为我写了一个 java 服务来避免这种情况)。
    以下是来源:
  • https://github.com/peterborkuti/csv-jdbc-driver
  • https://github.com/peterborkuti/csv-jdbc-driver-example
  • 关于java - 在 java 中编写自定义 jdbc 驱动程序是一个非常基本的驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28114725/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com