JDBC是JAVA操作資料庫的基本技術,並不是唯一技術。
Hibernate、TopLink等OR Mapping操作資料庫的技術都是建立JDBC技術之上的,實際來說,他們的效能和JDBC是有很大差距的,但反過來說,如果JDBC用不好,還不如hibernate呢。暫且不說這些孰優孰劣的話了,再次主要是對Java的基礎技術做個總結,以加深認識。
一、JDBC的基本原理JDBC是Java操作資料庫的技術規範。
他實際上定義了一組標準的操作資料庫的介面。為了能讓Java操作資料庫,必須要有實現了JDBC這些介面的類,不同的資料庫廠商為了讓Java語言能操作自己的資料庫,都提供了對JDBC介面的實現——這些實現了JDBC介面的類打成一個jar包,就是我們平時看到的資料庫驅動。由於不同的資料庫操作資料的機制不一樣,因此JDBC的具體實現也就千差萬別,但是你作為java程式員,你只和Java JDBC的介面打交到,才不用理會他們怎麼實現的!呵呵,現在知道JDBC驅動是怎麼回事了。當然,這些類可以自己去寫——如果你很牛!
二、JDBC編程的步驟為了說明這個步驟
假設你要通過java程式執行一個sql查詢,你需要按照如下的步驟去走:
1、建立指定資料庫的URL這個URL實際上還是統一資源定位器,裡麵包含了一些串連資料庫的資訊:資料庫類型、連接埠、驅動類型、串連方式、資料庫伺服器的ip(或名字)、資料庫名(有的是別名)等。其格式如下:
jdbc:subProtocol:subName://DBserverIP:port/DatabaseName例如mysql的一個url:jdbc:mysql://192.168.3.143:3306/zfvims
2、載入驅動類到JVM記憶體地區中有兩種方法:一種是用Class.forName()方法載入指定的驅動程式。
一種是將驅動程式添加到java.lang.System的屬性jdbc.drivers中。
最後說明一點,有時候添加到系統的CLASSPATH環境變數是不行的,原因是在使用JDBC介面操作資料庫前,JVM還沒有載入上驅動。
Class.forName("com.mysql.jdbc.Driver")
3、、通過DriverManager類管理驅動、建立資料庫連接。
DriverManager類作用於程式員和JDBC驅動程式之間,提供註冊管理驅動建立串連細節等方法,它所有成員均為靜態。通過其getConnection方法會建立一個JDBC Connection對象。
Connection conn=DriverManager.registerDriver("jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password");
4、Connection類——資料庫連接這裡所說的Connection類實際上是實現了JDBC的Connection介面的類,這個類一般都是jdbc驅動程式實現了。Connection類表示了資料庫連接,通過其對象可以擷取一個擷取資料庫和表等資料庫物件的詳細資料。但更多的是通過這個串連更進一步去向資料庫發送SQL語句去執行,下面會講到。
資料庫的串連的建立是很耗費資源和時間的,因此在不用串連的情況下要通過其close()方法將串連關閉,以釋放系統資源。
5、Statement類——發送並執行(靜態)SQL語句通過Connection對象的createStatement()方法可以建立一個Statement對象,通過該對象的方法可以(發送)並執行一個靜態sql語句。如果要執行動態sql(sql串中有參數),那麼就用PreparedStatement類,用法和Statement類似。
Statement stmt=con.createStatement()
6、ResultSet類——結果集當你執行一條sql查詢後,就會產生一個查詢結果。ResultSet就表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句產生。ResultSet 對象具有指向其當前資料行的指標。通過ResultSet對象不但可以結果集資料,還可以擷取結果集表的列名、資料類型等資訊。
ResultSet rs=stmt.executeQuery(sql)
7、關閉資料庫連接當對sql操作完成後,應該關閉資料庫連接,這樣避免因為串連未關閉而耗費系統資源,如果每次都不關閉,多次操作將建立多個串連,最終資料庫連接會達到最大限度,或者耗盡系統的資源,從而導致應用崩潰。因此要注意關閉資源,尤其是資料庫連接。
三、JDBC編程最基本的執行個體
下面通過一個執行一條簡單的MySQL查詢來說名上面的JDBC編程的一般方法和步驟。
public class TestJDBC(){
public static Connection getConnectionByJDBC() {
Connection conn = null;
try {
//裝載驅動類
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("裝載驅動異常!");
e.printStackTrace();
}
try {
//建立JDBC串連
conn = DriverManager.getConnection(""jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password");
} catch (SQLException e) {
System.out.println("連結資料庫異常!");
e.printStackTrace();
}
return conn;
}
public static String test() {
String sqlx = "select t.code,t.name from province t order by t.code asc";
try {
//建立一個JDBC聲明
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
//執行查詢
ResultSet = stmt.executeQuery(sqlx);
while (rs.next()) {
String code = rs.getString("code");
String name = rs.getString("name");
System.out.println(code+name);
}
} catch (SQLException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
//預防性關閉串連(避免異常發生時在try語句塊關閉串連沒有執行)
try {
if (conn != null) conn.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
public static void main(String args[]) {
new TestJDBC().test();
}
}
四、JDBC的陷阱
1、conn一定要在finally語句塊進行關閉。
2、Statement、ResultSet儘可能縮小其變數範圍。
3、Statement可以使用多次,定義多個。一個Statement對象只和一個ResultSet對象關聯,並且是最後一次查詢。
4、ResultSet在Connection、ResultSet關閉後自動關閉。