JDBC API主要位于JDK中的java.sql包中(之后擴展的內容位于javax.sql包中),主要包括(斜體代表接口,需驅動程序提供者來具體實現):
- DriverManager:負責加載各種不同驅動程序(Driver),并根據不同的請求,向調用者返回相應的數據庫連接(Connection)。
- Driver:驅動程序,會將自身加載到DriverManager中去,并處理相應的請求并返回相應的數據庫連接(Connection)。
- Connection:數據庫連接,負責與進行數據庫間通訊,SQL執行以及事務處理都是在某個特定Connection環境中進行的。可以產生用以執行SQL的Statement。
- Statement:用以執行SQL查詢和更新(針對靜態SQL語句和單次執行)。
- PreparedStatement:用以執行包含動態參數的SQL查詢和更新(在服務器端編譯,允許重復執行以提高效率)。
- CallableStatement:用以調用數據庫中的存儲過程。
- SQLException:代表在數據庫連接的建立和關閉和SQL語句的執行過程中發生了例外情況(即錯誤)。
利用Class.forName()方法來加載JDBC驅動程序(Driver)至DriverManager:
Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );
然后,從DriverManager中,通過JDBC URL,用戶名,密碼來獲取相應的數據庫連接(Connection):
Connection conn = DriverManager.getConnection( "jdbc:somejdbcvendor:other data needed by some jdbc vendor", // URL "myLogin", // 用戶名 "myPassword" ); // 密碼
不同的JDBC驅動程序的URL是不同的,它永遠以“jdbc:”開始,但后面的內容依照驅動程序類型不同而各異。在獲取Connection之后,便可以建立Statement用以執行SQL語句。下面是一個插入(INSERT)的例子:
Statement stmt = conn.createStatement(); stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
查詢(SELECT)的結果存放于結果集(ResultSet)中,可以按照順序依次訪問:
Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" ); while ( rs.next() ) { int numColumns = rs.getMetaData().getColumnCount(); for ( int i = 1 ; i <= numColumns ; i++ ) { // 與大部分Java API中下標的使用方法不同,字段的下標從1開始 // 當然,還有其他很多的方式(ResultSet.getXXX())獲取數據 System.out.println( "COLUMN " + i + " = " + rs.getObject(i) ); } } rs.close(); stmt.close();
但是,通常,Java程序員們更傾向于使用PreparedStatement。下面的例子使用上例中的conn對象:
PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i = ? AND j = ?" ); // 使用問號作為參數的標示 // 進行參數設置 // 與大部分Java API中下標的使用方法不同,字段的下標從1開始,1代表第一個問號 // 當然,還有其他很多針對不同類型的類似的PreparedStatement.setXXX()方法 ps.setString(1, "Poor Yorick"); ps.setInt(2, 8008); // 結果集 rs = ps.executeQuery(); while ( rs.next() ) { int numColumns = rs.getMetaData().getColumnCount(); for ( int i = 1 ; i <= numColumns ; i++ ) { // 與大部分Java API中下標的使用方法不同,字段的下標從1開始 // 當然,還有其他很多的方式(ResultSet.getXXX())獲取數據 System.out.println( "COLUMN " + i + " = " + rs.getObject(i) ); } } catch (SQLException e) { // 異常處理 } finally { // 使用finally進行資源釋放 try { rs.close(); ps.close(); } catch( SQLException e){} // 異常處理:忽略close()時的錯誤 }
本BLOG用于個人學習總結!
目的在于記錄個人成長.
所有文字均屬于個人理解.
如有錯誤,望多指教!不勝感激!