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