探讨JDBC 4.0在设计和性能方面的改进
摘要 JDBC(Java数据库连接)4.0预计在2006年中期作为Java 6.0标准版的一部分正式发行。现在,我们大家都关心的问题是,如何利用这一新的规范来改进Java应用程序数据存取和交互方面的设计与性能。本文将与你一起探讨JDBC 4.0中引入的新特征,讨论它对一些现有问题的解决方案,并且通过具体示例展示它在设计和性能方面的改进。
自从核心Java语言的第一个公开发行版本起,JDBC(Java数据库连接)已经经历了十年的发展历程。它的当前版本4.0(将与Java标准版本6.0一起打包发行)提供了一组更为丰富的API,主要目的在于改进软件开发的设计和性能。
本文将重点讨论JDBC 4.0规范在设计和性能方面的改进。
一、 注释和泛型DataSet
在本文中,我假定你已经了解注释和泛型。其实,这两个概念是随着J2SE 5.0的发行一同引入的;与此同时,JDBC 4.0中引入了注释和泛型DataSet。这一变化的主要目的是为了简化SQL查询和SQL DML(数据操纵语言)语句的执行。
新一代API定义了一组Query和DataSet接口。这个Query接口定义了一组带有JDBC注释的方法。这些带有注释的方法描述了SQL select和update语句,并且指定应该如何把结果绑定到一个DataSet上。这个DataSet接口是一个通过泛型定义实现的参数化类型,也为结果集数据提供一种类型安全的定义。
所有的Query接口都继承自BaseQuery接口。你可以使用Connection.createQueryObject()或DataSource.createQueryObject()方法(这两个方法都使用一个Query接口类型作为它的参数)来具体实现这样的接口。
一个DataSet接口继承自java.util.List;该接口使用一个描述结果集数据列的数据库(该数据库是通过Query接口的一个注释的方法返回的)作为它的参数类型。在连接方式和非连接方式下都可以操作和使用DataSet。因此,根据使用的是连接方式还是非连接方式,这个DataSet也分别相应地实现为一个ResultSet或CachedRowSet。DataSet,作为java.util.List的一个子接口,允许使用Iterator模式通过java.util.Iterator接口存取其数据行。
你可以用两种方式来指定数据类或用户定义类(作为DataSet接口的一个参数类型)-作为一个结构或作为一个JavaBeans对象。无论哪一种方式都能够把结果集数据列绑定到用户定义的类定义上;但是,JavaBeans组件模型更漂亮些,并且更利于对象定义在另外的支持JavaBeans模型的框架中的重用。
列表1摘自本文示例中的代码片断,它展示了如何使用这种新型的API来创建和运行SQL查询:使用一个用户定义类定义结果集数据,并且把返回的结果集绑定到用户定义的描述中。
列表1.Employee用户定义类型与employeeQueries接口
pubic class Employee {
private int employeeId;
private String firstName;
private String lastName;
public int getEmployeeId() {
return employeeId;
}
public setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getFirstName() {
return firstName;
}
public setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public setLastName(String lastName) {
this.lastName = lastName;
}
}
interface EmployeeQueries extends BaseQuery {
@Select (sql="SELECT employeeId, firstName, lastName FROM employee")
DataSet<Employee> getAllEmployees ();
@Update (sql="delete from employee")
int deleteAllEmployees ();
}
Connection con = ...
EmployeeQueries empQueries = con.createQueryObject (EmployeeQueries.class);
DataSet<Employee> empData = empQueries.getAllEmployees ();