技术开发 频道

JDBC4的新特性

    在 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() .

 


0
相关文章