JDBC 是 Java Database Connectivity 的縮寫,它是讓你的 Java 程式跟資料庫溝通的一組 API,透過這個統一的 API 介面,你可以連接各式不同的資料庫系統,對資料庫裡的資料做新增、刪除、修改、查詢等動作。
Java SE 7 裡支援 JDBC 4.1 的規格,跟JDBC 4.0 版比較起來,有兩個主要的改進。第一個就是前面也介紹過的 try-with-resource 語法的支援,第二就是新的 RowSetFactory 這個新的 API。
前面在介紹(第21到24天) try-with-resource 語法時,我們只介紹了 java.io 的部份(還有自創的類別),而 JDBC 4.1 裡的 java.sql.Connection[\b], [b]java.sql.ResultSet[\b], [b]java.sql.Statement[\b] 這三個介面(interface) 也都繼承了 [b]java.lang.AutoCloseable 介面,所以當你用到實作這三個介面的 SQL 物件時,也能將宣告這些物件的陳述式寫在 try-with-resource 的陳述式裡,這樣就不怕忘記關閉資料庫資源了。
範例:
package idv.jacky.ironman4.day29;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Day29Example1 {
public static void sampleQueryProcessing(Connection sampleCon) throws SQLException {
String sampleQuery = "select * from STUDENT";
try (Statement sampleStmt = sampleCon.createStatement()) {
ResultSet rs = sampleStmt.executeQuery(sampleQuery);
while (rs.next()) {
String studentName = rs.getString("NAME");
String studentAge = rs.getString("AGE");
System.out.printf(" NAME: %S, AGE: %s%n", studentName, studentAge);
}
}
}
}
RowSetFactory 是一組新的 API,早期沒有 RowSetFactory 時,我們必需把實作 RowSet 的類刟名稱寫死在程式碼裡(因為各家的資料庫都會提供自己的類別)。現在則可以透過 RowSetFactory 這個 API 來統一產生 RowSet 物件,而不需要去管到底是什麼類別實作的。這樣一來,你的程式就更有彈性,只需要更改系統的參數,例如在執行 Java 程式前,用命令列參數來設定:
java -Djavax.sql.rowset.RowSetFactory=com.sun.rowset.RowSetFactoryImpl
如此你就可以隨時抽換使用不同的實作類別,相當的方便。而當你不指定時,Java 會預設使用 com.sun.rowset.RowSetFactoryImpl。
範例:
package idv.jacky.ironman4.day29;
import java.sql.SQLException;
import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;
public class Day29Example2 {
public void sampleMethod(String sampleUserName, String samplePassword) throws SQLException {
RowSetFactory sampleRowSetFactory = null;
JdbcRowSet sampleRowSet = null;
try {
sampleRowSetFactory = RowSetProvider.newFactory();
sampleRowSet = sampleRowSetFactory.createJdbcRowSet();
sampleRowSet.setUrl("jdbc:sampleDriver:sampleAttribute");
sampleRowSet.setUsername(sampleUserName);
sampleRowSet.setPassword(samplePassword);
sampleRowSet.setCommand("select * from STUDENT");
sampleRowSet.execute();
} catch(Exception e) {
e.printStackTrace();
}
}
}