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

时间:2013-04-07 23:34:37

标签: java database jdbc connection

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

Connection con = MyDAO.getConnection();
JdbcRowSet jrs = new JdbcRowSetImpl(con);

两个问题:

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

这是其中一个警告。当我尝试在代码中使用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);

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

  • 假设我已经有了JdbcRowSet的实例。虽然它没有连接,但我已经有了一个Connection对象,但是没有访问身份验证凭据的权限,即我有对象,但是没有用于建立新连接的user_id或密码。

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

1 个答案:

答案 0 :(得分:4)

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

Is it a bad practice to use Sun's proprietary Java classes?

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

final JDBCRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();

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

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

并非没有避免internal proprietary API消息没有。正如我所说,所有可能性的JDBCRowSetImpl类将继续存在。事实上,Java 7文档几乎可以暗示:

  

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

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