Posted on 2009-06-21 22:13
Gavin.lee 閱讀(979)
評論(0) 編輯 收藏 所屬分類:
JDBC
在JDBC 中包括了兩個包:java.sql和javax.sql。
① java.sql 基本功能。
這個包中的類和接口主要針對基本的數據庫編程服務,如生成連接、執行語句以及準備語句和運行批處理查詢等。
同時也有一些高級的處理,比如批處理更新、事務隔離和可滾動結果集等。
② javax.sql 擴展功能。
它主要為數據庫方面的高級操作提供了接口和類。
如為連接管理、分布式事務和舊有的連接提供了更好的抽象,它引入了容器管理的連接池、分布式事務和行集等。
API 說明
Connection 與特定數據庫的連接(會話)。能夠通過getMetaData方法獲得數據庫提供的信息、
所支持的SQL語法、存儲過程和此連接的功能等信息。代表了數據庫。
Driver 每個驅動程序類必需實現的接口,每個數據庫驅動程序也都應該提供一個實現Driver接口的類。
DriverManager(Class) 管理一組JDBC驅動程序的基本服務。作為初始化的一部分,此接口會嘗試加載
在”jdbc.drivers”系統屬性中引用的驅動程序。只是一個輔助類,是工具。
Statement 用于執行靜態SQL語句并返回其生成結果的對象。
PreparedStatement 繼承Statement接口,表示預編譯的SQL語句的對象,SQL語句被預編譯并且存儲
在PreparedStatement對象中。然后可以使用此對象高效地多次執行該語句。
CallableStatement 用來訪問數據庫中的存儲過程。它提供了一些方法來指定語句所使用的輸入/輸出參數。
ResultSet 指的是查詢返回的數據庫結果集。
ResultSetMetaData 可用于獲取關于ResultSet對象中列的類型和屬性信息的對象。
注:除了標出的Class,其它均為接口。每個都是“java.sql.”包下的。
1. Statement —— SQL語句執行接口
代表了一個數據庫的狀態,在向數據庫發送相應的SQL語句時,都需要創建Statement接口或PreparedStatement接口。
在具體應用中,Statement主要用于操作不帶參數(可以直接運行)的SQL語句,比如刪除語句、添加或更新。
2. PreparedStatement:預編譯的Statement
第一步:通過連接獲得PreparedStatement對象,用帶占位符(?)的sql語句構造。
PreparedStatement pstm = con.preparedStatement(“select * from test where id=?”);
第二步:設置參數
pstm.setString(1,“ganbin”);//第一個字段是“ganbin”;需一個個字段寫
第三步:執行sql語句
Rs = pstm.excuteQuery();
statement發送完整的Sql語句到數據庫不是直接執行而是由數據庫先編譯,再運行。每次都需要編譯。
而PreparedStatement是先發送帶參數的Sql語句,由數據庫先編譯,再發送一組組參數值。(同構時不需重復編譯)
如果是同構的sql語句,PreparedStatement的效率要比statement高。而對于異構的sql則兩者效率差不多。
一般都用PreparedStatement代替Statement,因為它是類型安全的。Statement對參數類型不作檢查,故不夠安全。
同構:兩個Sql語句可編譯部分是相同的,只有參數值不同。
異構:整個sql語句的格式是不同的
注意點:1、使用預編譯的Statement編譯多條Sql語句一次執行
2、可以跨數據庫使用,編寫通用程序
3、能用預編譯時盡量用預編譯
4、如果第二個SQL語句與前一個是異構的,需要再次編譯“ps = con.prepareStatement(sql);“
3. ResultSet —— 結果集操作接口
ResultSet接口是查詢結果集接口,它對返回的結果集進行處理。ResultSet是程序員進行JDBC操作的必需接口。
4. ResultSetMetaData —— 元數據操作接口
ResultSetMetaData是對元數據進行操作的接口,可以實現很多高級功能。
Hibernate運行數據庫的操作,大部分都是通過此接口。可以認為,此接口是SQL查詢語言的一種反射機制。
ResultSetMetaData接口可以通過數組的形式,遍歷數據庫的各個字段的屬性,對于開發者來說,此機制的意義重大。
JDBC通過元數據(MetaData)來獲得具體的表的相關信息,例如,可以查詢數據庫中有哪些表,表有哪些字段,以及字段的
屬性等。MetaData中通過一系列getXXX將這些信息返回給我們。
數據庫元數據 Database MetaData 用connection.getMetaData()獲得;包含了關于數據庫整體元數據信息。
結果集元數據 ResultSet MetaData 用resultSet.getMetaData()獲得;比較重要的是獲得表的列名,列數等信息。
結果集元數據對象:ResultSetMetaData meta = rs.getMetaData();
字段個數:meta.getColomnCount();
字段名字:meta.getColumnName();
字段JDBC類型:meta.getColumnType();
字段數據庫類型:meta.getColumnTypeName();
數據庫元數據對象:DatabaseMetaData dbmd = con.getMetaData();
數據庫名:dbmd.getDatabaseProductName();
數據庫版本號:dbmd.getDatabaseProductVersion();
數據庫驅動名:dbmd.getDriverName();
數據庫驅動版本號:dbmd.getDriverVersion();
數據庫Url:dbmd.getURL();
該連接的登陸名:dbmd.getUserName();