JDBC編程的基本概念
用于JDBC編程的類都包含在java.sql和javax.sql包中
java.sql.DriverManager類用于選擇數據庫驅動程序和創建新的數據庫連接。
只有在驅動管理器中注冊過的驅動程序才可以被激活。
"jdbc.drivers"屬性包含一系列驅動程序的類名。驅動管理器會在啟動時注冊這些驅動。
System.setProperty("jdbc.drivers", "oracle.jdbc.driver.OracleDriver")
程序運行在Servlet引擎容器中時要通過加載驅動程序類來手動加載驅動程序,如Class.forName("oracle.jdbc.driver.OracleDriver");
調用DriverManager.getConnection方法獲得java.sql.Connection對象
驅動管理器遍歷當前所有已經注冊過的驅動程序,….
創建一個java.sql.Statement對象
Statement stat = conn.createStatement();
調用Statement類中的executeUpdate方法執行字符串中的SQL語句。
當執行查詢操作時可通過executeQuery方法返回一個java.sql.ResultSet對象,來每次一行地迭代遍歷所有查詢結果。執行SELECT查詢時必須使用executeQuery方法。
ResultSet rs = stat.executeQuery("SELECT * FROM Books")
每一個Connection對象都可以創建一個或一個以上的Statement對象,同一個Statement對象可以用于多個不相關的命令和查詢。但是,一個Statement對象最多只能打開一個結果集。
當使用完ResultSet、Statement、Connection對象時,應立即調用close()方法關閉連接對象。這些對象都使用了規模較大的數據結構,自行回收而不是等垃圾回收。
4.5 執行查詢操作
預備語句(Prepared Statement) java.sql.PreparedStatement
返回一個含預編譯語句的PreparedStatement對象,sql語句可以包含一個或多個?指明的占位符。
void setXxx(int n, Xxx x)
(Xxx is a type such as int, double, String, Date, etc.) sets the value of the nth parameter to x.
參數:第一個參數指的是需要賦值的宿主變量的位置,第二個參數指的是賦予宿主變量的值
4.6 可滾動和可更新的結果集
PreparedStatement stat = conn.preparedStatement(command,type,concurrency);
參數type的值:TYPE_FORWARD_ONLY(結果集不能滾動) TYPE_SCROLL_INSENSITIVE(結果集可以滾動,但對數據庫變化不敏感) TYPE_SCROLL_SENSITIVE(結果集可以滾動,且對數據庫變化敏感)
參數concurrency的值:CONCUR_READ_ONLY(結果集不能用于更新數據庫) CONCUR_UPDATABLE(結果集可以用于更新數據庫)
4.7 元數據
在SQL中描述數據庫或其組成部分的數據稱為元數據。包括三個類別:關于數據庫的元數據(java.sql.DatabaseMetaData)、 關于結果集的元數據(java.sql.ResultSetMetaData)、關于預備語句參數的元數據 (java.sql.ParameterMetaData)
4.8 行集
適用于無需始終保持與數據庫連接的應用或者將結果集移動到復雜應用的其他層。javax.sql.RowSet
RowSet接口繼承了resultset接口
一個被緩存的行集包含了一個結果集中所有的數據。javax.sql.CachedRowSet
CachedRowSet接口繼承了resultset接口
4.9 事務
當所有語句都順利執行之后,事務可以被提交,否則,如果其中某個語句遇到錯誤,那么事務將被回滾。默認情況下,數據庫的連接處于自動提交模式。一旦提交成功就無法進行回滾操作。
//You turn off autocommit mode with the command
conn.setAutoCommit(false);
//Now you create a statement object in the normal way:
Statement stat = conn.createStatement();
Call executeUpdate any number of times:
stat.executeUpdate(command1);
stat.executeUpdate(command2);
stat.executeUpdate(command3);
. . .
//When all commands have been executed, call the commit method:
conn.commit();
//However, if an error occurred, call
conn.rollback();
//Then, all commands until the last commit are automatically reversed. You typically issue a //rollback when your transaction was interrupted by a SQLException.
使用保存點(save point)可以讓事務只需回滾到保存點,而非事務的開始。java.sql.Savepoint
Statement stat = conn.createStatement(); // start transaction; rollback() goes here
stat.executeUpdate(command1);
Savepoint svpt = conn.setSavepoint(); // set savepoint; rollback(svpt) goes here
stat.executeUpdate(command2);
if (. . .) conn.rollback(svpt); // undo effect of command2
. . .
conn.commit();
//When you are done with a save point, you should release it:
stat.releaseSavepoint(svpt);
批量更新
Statement stat = conn.createStatement();
//Now, instead of calling executeUpdate, you call the addBatch method:
String command = "CREATE TABLE . . ."
stat.addBatch(command);
while (. . .)
{
command = "INSERT INTO . . . VALUES (" + . . . + ")";
stat.addBatch(command);
}
//Finally, you submit the entire batch:
int[] counts = stat.executeBatch();
4.10 高級連接管理
Java名字和目錄接口(JNDI)定位數據源。javax.sql.DataSource接口
4.11 LDAP概述
LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議),通常主要應用于目錄存儲,且該目錄包含了如用戶名、密碼和權限之類的數據。適用于應用數據遵從樹狀結構,且讀操作多于寫操作。
LDAP數據庫將所有數據存儲在一個樹狀結構中,樹中的每一項包含:
1、0個或0個以上屬性,每個屬性都有一個ID和一個值。
2、一個或一個以上的對象類,一個對象類定義了該元素上的一組屬性。
3、一個專有名稱,專有名稱是一組描述路徑的屬性序列,該路徑將該條目與樹的根連接在一起。