Connection 对象可以与构造函数之外的 JDBC RowSet 实例一起使用吗?

sco*_*ttb 1 java database connection jdbc

我知道可以使用传递给其构造函数的 Connection 对象创建 JDBC RowSet 实例,例如:

Connection con = MyDAO.getConnection();
JdbcRowSet jrs = new JdbcRowSetImpl(con);
Run Code Online (Sandbox Code Playgroud)

两个问题:

  • 每次我构建包含 JdbcRowSetImpl 任何用途的项目时,我的 Java SE 7 都会抱怨。它说 JdbcRowSetImpl 是供应商特定的实现,它可能会从 JDK 的未来版本中删除。我觉得这很奇怪,因为 Java 教程继续在其 JDBC 部分使用 JdbcRowSetImpl。Oracle 真的打算从 JDK 中逐步淘汰工厂 RowSet 实现吗?如果没有,有没有办法停止警告消息?

这是警告之一。当我尝试在代码中使用 JdbcRowSet 构造函数或尝试导入包时会发生这种情况

C:\Users\Ribose\Documents\NetBeansProjects\CensusAssistant\src\org\kls\md\censusassistant\db\DB.java:170:
 warning: JdbcRowSetImpl is internal proprietary API and may be removed in a future release
            jrs = new JdbcRowSetImpl(con);
Run Code Online (Sandbox Code Playgroud)

我正在使用 NetBeans IDE 7.3 进行构建。RDBMS 是 HSQLDB 2.2.9。我有最新的 JDK SE 7。

  • 假设我已经有一个 JdbcRowSet 实例。虽然它没有连接,但我已经有一个 Connection 对象,但无法访问身份验证凭据,即我有对象,但不需要 user_id 或密码来建立新的连接。

我可以将现有的 Connection 对象与现有的 JdbcRowSet 实例一起使用吗?我发现的唯一一件事是 JdbcRowSetImpl 的构造函数可以接受一个 Connection 对象,但我想使用 Connection 而不必构造一个新的 RowSet 对象。这可能吗?

Per*_*ion 5

该类com.sun.rowset.JdbcRowSetImpl是 JDBC 接口的特定于 Sun 的实现,并且在不存在其他提供程序实现的情况下用作默认值。这个类实际上从 JDK 1.2 开始就已经存在,所以你可以肯定地说它会继续存在,但不能保证com.sun.*通常所有包都是这种情况——它们代表不应直接引用或实例化的内部实现。

使用 Sun 的专有 Java 类是一种不好的做法吗?

话虽如此,与其他动态库 [SAX、DOM、JAXB 等] 不同,在 Java 7 之前,没有真正好的方法可以在不创建提供者特定实例的情况下实例化 JDBC 行集,现在您可以使用工厂来创建提供者特定实例,在您的代码中没有显式绑定:

final JDBCRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
Run Code Online (Sandbox Code Playgroud)

此代码扫描适当提供程序的类路径,并使用找到的提供程序类首先实例化 RowSetFactory,然后实例化 JDBCRowSet(请注意,如果找不到其他提供程序,它将回退到默认的 Sun 实现)。这是从 Java 7 开始创建 JDBC 行集的首选方式。

我可以将现有的 Connection 对象与现有的 JdbcRowSet 实例一起使用吗?

并非没有避免internal proprietary API消息 no。正如我所说,JDBCRowSetImpl 类在所有可能性中都会继续存在。事实上,Java 7 文档几乎提到了以下内容:

JdbcRowSet 接口的参考实现 JdbcRowSetImpl 提供了默认构造函数的实现。使用默认值初始化新实例,可以根据需要设置新值

因此,如果您愿意忽略编译器警告,则可以使用默认实现来创建具有现有连接的行集。