技术开发 频道

JDBC4.0具有哪些新特性



【IT168 技术文档】

    在 Java SE 6 所提供的诸多新特性和改进中,值得一提的是为 Java 程序提供数据库访问机制的 JDBC 版本升级到了 4.0, 这个以 JSR-221 为代号的版本 , 提供了更加便利的代码编写机制及柔性 , 并且支持更多的数据类型 . 在本文中,我们将从编码的易用性及柔性的角度探讨 JDBC 4.0 所带来的新特性及改进。
JDBC 4.0 的新特性

 

JDBC 4.0 文档列举了 20 个改进及新特性 , 大小不等 . 本文无法做到尽述其详 , 为此笔者根据其功能特点及应用领域将其分为下述四类:

 

1.     驱动及连接管理

 

2.     异常处理

 

3.     数据类型支持

 

4.     API 的变化

 

下面按照上述四类展开详述:

 

驱动及连接管理

 

驱动及连接的使用和结果集管理 JDBC 的很多地方都发生了显著的变化

 

连接数据库变得更加容易

 

    如果您曾经有过 JDBC 开发的经验 , 那么我确信您还保存着一份建立数据库连接所必须的工作列表 . 而列表中的第一项即加载一个合适的驱动程序 . 您是否想过这个步骤应该被改进呢 ? 在此版 JDBC 中做到了 . 您不必再显式地加载 Class.forName . 当您的程序首次试图连接数据库时 , DriverManager 自动加载驱动到当前应用的 CLASSPATH . 这是 JDBC 的一个比较大的改动 .

 

尽管 DriverManager 现在可以自动地加载驱动 , 建立一个 DataSource 对象 仍是获取连接的推荐的方法 . 因为可以在配置中将数据源指向不同的数据库, DataSource 更具透明性和灵活性。 这样就可以访问另一个数据库实例不需更改现有的任意一行代码 , 甚至数据库的驱动完全不同也没有关系 .

 

ResultSet 的使用变得更为灵活

 

    ResultSet 接口的层次结构当前为编程的灵活性提供了一些新的机制 . RowSet 子接口滚动、可提交并可离线编辑的 ResultSet . WebRowSet 子接口提供了从数据库表中获取数据 , 并将其序列化为 XML 文档 , 抑或是将 XML 解析成 result set 的能力 . 尽管上个版本的 JDBC 也提供了 RowSet 接口层次 ,当前的版本对于 SQLXML 数据类型支持得更好 ( 稍后讨论 ) ,这些特性是的 JDBC 编程更加容易且具灵活性 .

 

提供了更多的 API

 

    本版 JDBC 提供了更多的 API 以实现访问 SQL:2003 具备的新特性 . 此外 , 为了更好的操纵修改数据, JDBC 也增添了许多的方法。 .

 

    现在我们来看一些代码并讨论下面 Example1 类的输出结果 . 它将连接嵌入式的 Apache Derby 数据库并在控制台上显示输出结果 . 尽管 JDBC 4.0 已推出几个月了 , 笔者发现只有 Apache Derby 提供了支持 JDBC 4.0 规范的驱动 ( 截至 2007 3 ). 本文的所有例子均用 JDK 1.6 Apache Derby 数据库 10.2.2.0 开发 .

public class Example1 { public static void main(String[] args) { ... String dbName = "example1"; String tableName = "stu1"; ds = new EmbeddedDataSource40(); ds.setDatabaseName(dbName); String connectionURL = "jdbc:derby:"+dbName+";create=true"; try { con = ds.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("select * from "+tableName); int colCount= rs.getMetaData().getColumnCount(); for (int j=0; j< colCount; j++){ System.out.print(rs.getMetaData().getColumnName(j+1) + "\t"); } while (rs.next()) { System.out.print("\n"); for (int i = 0; i < colCount; i++) { System.out.print(rs.getString(i + 1) + "\t"); } } } catch (SQLException e) { e.printStackTrace(); } finally{ //close connections } } }

如果在 example1 数据库的 stu1 表中有数据的话 , 编译并运行 Example1.java 将在控制台获得以下输出:

 

 

ID    NAME            COURSE

 

1001  John Doe        Statistics    

 

1002  Jack McDonalds  Linear Algebra

 

 

如果想看 DriverManager 如何自动加载 JDBC 驱动 , 可以将 Example1 中的: con=ds.getConnection() 替换为: con=DriverManager.getConnection(connectionURL) . 该类将产生相同的输出。正如您所看到的,再也不用显式地调用 Class.forName() .

 


异常处理

 

怎样辨别一个 Java 程序的健壮与否呢 ? 在我看来,异常处理机制是重要的考虑因素之一 . 一个健壮的 Java 程序可以很好地处理异常 , 并给予程序在发生异常时恢复的能力 . 而一个不健壮的程序将导致输出错误的结果甚至导致整个应用的崩溃 !

 

JDBC 4.0 增加了一些简单而有力的异常处理机制 , 其中值得一提的是链式异常,如果这个异常链存在的话,即可应用增强了的 for - each 循环来获取异常链 ,. 下面的 Example2 类的局部结构展示了如何应用这种新的方法处理链式异常:

public class Example2 { public static void main(String[] args) { String dbName = "example"; String tableName = "student4"; try { con = ds.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("select * from " + tableName); } catch (SQLException sx) { for(Throwable e : sx ) { System.err.println("Error encountered: " + e); } } finally{ //close connections } } }

运行 Example2.java , 注意 student4 并不是数据库中实际存在的表 . 将在下列调用中产生链式异常:

 

 

rs = stmt.executeQuery("select * from " + tableName);

 

 

在实际的应用中,需要捕捉到这些异常 , 检测并进行相应的处理 . 在本例中,笔者仅将其在控制台输出 . 以下是输出代码:

 

 

for(Throwable e : sx ) {

 

  System.err.println("Error encountered: " + e);

 

}

 

 

以下是类 Example2 输出的结果 :

 

 

Error encountered: java.sql.SQLSyntaxErrorException:

 

   Table/View 'STUDENT4' does not exist.

 

Error encountered: java.sql.SQLException:

 

   Table/View 'STUDENT4' does not exist.

 

Exception in thread "main" java.lang.NullPointerException

 

   at ex.Examlpe2.main(Examlpe2.java:51)

 

 

通过应用 JDBC 4.0, 您现在不需太多代码即可以获取及遍历异常链 . 在以往的版本中 , 您在遍历异常链时,必须手工的调用 getNextException 方法才能得到相同的效果 .

 

0