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()時的錯誤
}
以上內(nèi)容轉(zhuǎn)自:http://zh.wikipedia.org/w/index.php?title=JDBC&variant=zh-hans

本BLOG用于個人學(xué)習(xí)總結(jié)!
目的在于記錄個人成長.
所有文字均屬于個人理解.
如有錯誤,望多指教!不勝感激!