在Java SE 6中有許多新的特性,其中一點就是將Java Database Connectivity(JDBC) API類庫升級到JDBC4.0。Java社區JSR-211規範中的JDBC4.0規範提供了更加易於管理的和靈活的數據庫操作,以及提供了對更加複雜數據類型的支持,例如XML類型的字段。本文章介紹一些JDBC4.0規範中的一些新特性的用法。
JDBC4.o規範中的新特性
JDBC4.0規範中列出了20種的新特性,這些特性中有一些是主要的,另外一些是相對次要一些的。這些特性在本篇文章中並不能夠一一介紹,所以將這些特性按照功能分爲如下的幾個方面。
1 驅動和連接管理
2 異常處理
3 數據類型的支持
4 API的一些變化
在下面的文章中對這些特性介紹給大家。
驅動和連接管理
使用連接和管理結果集是JDBC4.0中驅動和鏈接管理方面重要的變化。下面的三個方面將說明這些變化。
獲得數據庫鏈接變得更加的容易
如果你使用過JDBC編寫代碼,那麼你一定非常瞭解使用JDBC連接數據庫的步驟,在這些步驟中第一步要做的就是加載驅動程序。通過Class.forName("")方法來加載驅動程序。在JDBC4.0中你不需要做這個步驟了,也就是不需要通過Class.forName來加載驅動程序。當你的應用第一次連接數據庫的時候,DriverManager會自動的到類路徑下去搜索驅動程序。這個特點是JDBC4.0中最中的變化之一。
既然DriverManager可以自動的加載驅動程序,並且返回合適的DataSource對象,通過DataSource對象獲得和數據庫的連接。所以,在應用中如果你要其它的數據庫將變得很容易,你不需要對代碼做任何改動就可以獲得連接。加載不同的數據庫驅動的工作交給了DriverManager來完成。
使用ResultSet變得更加的靈活
在ResultSet接口中提了一些新的特性功能,使得編寫程序變得更加的靈活。RowSet子接口提供了可翻頁、可修改和離線可編輯的ResultSet。WebRowSet子接口提供了可以從數據庫表中讀取數據並序列化成XML文檔以及從XML文檔反序列化成ResultSet的功能。
更多的API的支持
更多的API支持增加到JDBC4.0規範中,來支持SQL2003規範。另外,根據接口中定義功能加入了一些新的方法,使得操作數據變得更加的容易。下面我們通過下面的代碼來討論對結果的處理。這段代碼將連接內置的一個Apache Derby數據庫並且將查詢結果在控制檯上顯示出來。即使JDBC4.0已經推出了幾個月了,但是目前對JDBC4.0規範支持的數據庫還不多,只有Derby數據有支持。下面所有的例子都是基於JDK1.6和Apache Derby10.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
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
異常處理
如何增加Java代碼的可靠性?在我看來,通過使用異常處理是最重要的方法之一。通過在程序中加入異常處理可以有效的提高Java代碼的可靠性和魯棒性。JDBC4.0中加入了一些簡單但是功能強大的異常處理特性。包括對異常鏈的支持以及對for-each加強性for循環中異常鏈處理的支持。下面的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
}
}
}
運行上面的程序,將表明指定爲student4,但是數據庫中並沒有這個表。所以程序將出現異常。異常發生的點是。
rs = stmt.executeQuery("select * from " + tableName);
一般情況下,出現了這樣的異常,你需要捕獲它,並做出處理。在這個例子中我們只是簡單將異常信息打印出來。
一般情況下,出現了這樣的異常,你需要捕獲它,並做出處理。在這個例子中我們只是簡單將異常信息打印出來。
for(Throwable e : sx ) {
System.err.println("Error encountered: " + e);
}
程序運行後的輸出是:
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)
通過以上的例子我們可以看出來,JDBC4.0提供了對異常鏈中異常的處理,包括對加強型循環的支持。並不是像以前那樣必須通過使用getNextException來獲得異常信息。
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)
通過以上的例子我們可以看出來,JDBC4.0提供了對異常鏈中異常的處理,包括對加強型循環的支持。並不是像以前那樣必須通過使用getNextException來獲得異常信息。
數據類型的支持
JDBC4.0版本提供了對新的數據類型的支持。特別的是對XML類型(SQLXML)的數據提供了支持。
SQLXML類型和XML的支持
SQLXML是Java程序中用來映射XML類型數據和SQL類型數據的類。XML類型是數據庫中的內置類型,用來存儲XML類型的數據。下面的Example3中,說明了如何從當前連接中獲得SQLXML對象並更新數據到表中。
public class Example3 {
public static void main(String[] args) {
...
con = ds.getConnection();
SQLXML sx= con.createSQLXML();
sx.setString("Math is Fun");
String psx ="insert into "+tableName+
" ( id, textbook) values(?,?) ";
PreparedStatement pstmt = con.prepareStatement(psx);
pstmt.setString(1,"1000");
pstmt.setSQLXML(2,sx);
pstmt.executeUpdate();
...
}
}
public static void main(String[] args) {
...
con = ds.getConnection();
SQLXML sx= con.createSQLXML();
sx.setString("Math is Fun");
String psx ="insert into "+tableName+
" ( id, textbook) values(?,?) ";
PreparedStatement pstmt = con.prepareStatement(psx);
pstmt.setString(1,"1000");
pstmt.setSQLXML(2,sx);
pstmt.executeUpdate();
...
}
}