一.事務(transaction)
原子操作:不可再分的操作,乙個操作不能再分成比它更細小的操作.
事務是針對原子操作的,要求原子操作不可再分,並且必須同時成功同時失敗。
事務就是把一些非原子操作,變成原子操作,由應用伺服器來提出要求,由資料庫伺服器來執行操作.
在jdbc中預設是自動提交的,如果要想使用事務,需要按以下步驟執行:
1.要呼叫con.setautocommite(false)方法,把自動提交(commit)置為false。
2.進行正常的資料庫操作
3.如果操作成功了可以選擇con.commit(),或者操作失敗時選擇con.roolback();
注意:開啟事務就要關閉自動提交,當不需要再使用事務的時候呼叫setautocommite(true).
二.事務併發產生的問題
三種併發產生的後果:
1,髒讀:乙個事務讀取到了另外乙個事務沒有提交的資料。
2,重複讀:乙個事務讀取到了另外乙個事務提交的資料。它是要保持在同一時間點上讀取到的資料相同,希望在一段時間內的資料是不變的。
3,幻讀:乙個事務讀取到了另外乙個事務提交的資料。用同樣的操作讀取兩次,得到的記錄數不相同。
三.事務隔離級別
五種控制級別:
transaction_none不使用事務。
transaction_read_uncommitted 允許髒讀。
transaction_read_committed防止髒讀,最常用的隔離級別,並且是大多數資料庫的預設隔離級別
transaction_repeatable_read可以防止髒讀和不可重複讀,
transaction_serializable可以防止髒讀,不可重複讀取和幻讀,(事務序列化)會降低資料庫的效率
以上的五個事務隔離級別都是在connection類中定義的靜態常量,使用settransactionisolation(int level) 方法可以設定事務隔離級別。
如:con.settransactionisolation(connection.repeatable_read);
四.jdbc2.0新特性
1.可滾動特性和可更新特性
jdbc1.0中是指游標的移動的方向和方式是單向,單步(相對)移動,功能比較簡單.
jdbc2.0中游標可以雙向,相對或者絕對移動.
可滾動結果集:這種結果集不但可以雙向滾動,相對定位,絕對定位,並且還可以修改資料資訊。
1)滾動特性
定位函式:
boolean absolute(int row),定位到指定的記錄位置。定位成功返回true,不成功返回false。
void afterlast() ,把游標移動到最後一條記錄的後面(邏輯位置)。
void beforefirst() ,把游標移動到第一條記錄的前面(邏輯位置)。
//由於第一條記錄的前面和最後一條記錄的後面這兩個位置肯定存在,所以無需判斷是否存在,返回值設為void.
boolean first(),把游標定位到第一條記錄。
boolean last(),把游標定位到最後一條記錄。
//當結果集為空的時候,這兩個方法會返回false.
boolean next(),此方法是使游標向下一條記錄移動。
boolean previous() ,此方法可以使游標向上一條記錄移動,前提是前面還有記錄。
boolean relative(int rows) ,相對定位方法,引數值可正可負,引數為正,游標從當前位置向後移動指定值條記錄,引數為負,游標從當前位置向前移動指定值條記錄。
判斷函式:
ifbeforefirst()判斷是否在在第一條記錄之前.
ifafterlast()判斷是否在在最後一條記錄之後.
iffirst()判斷是否為第一條記錄.
iflast()判斷是否為最後一條記錄.
要使用可滾動結果集時,需要一次設定更新特性與滾動特性,不能分開.
1.更新特性常量:
concur_read_only 唯讀結果集(預設)
concur_updatable 可更新結果集
2.滾動特性常量:
type_forward_only ,該常量表示指標只能向前移動的 resultset 物件的型別。(預設)
type_scroll_insensitive ,該常量指示可滾動但通常不受其他更改影響的 resultset 物件的型別。
type_scroll_sensitive ,該常量指示可滾動並且通常受其他更改影響的 resultset 物件的型別。
//敏感:資料庫改變,結果集改變.
語法:
statement st=null;
st=con.createstatement(reusltset.type_scroll_insensitive,resuleset.concur_updatable)
在建立statement的時候就要指定這兩個引數,使用statement,第乙個引數代表滾動特性常量,第二個代表更新特性常量
2)可更新特性
a.movetoinsertrow();記錄當前游標位置,將游標移到和結果集結構類似的緩衝區;
b.使用update***(int column,columntype value)方法來更新指定列資料;
c.使用insertrow() 方法插入記錄;
d.將游標指回原位,movetocurrentrow() 。
能否使用jdbc2.0 resultset的新特性,要看使用的資料庫驅動是否支援.
還有只能用於單錶且表中有主鍵字段(可能會是聯合主鍵),不能夠有表連線,會取
可更新操作必須滿足以下條件:
a.查詢只能引用一張表.
b.不能包含任何連線操作.
c.必須把完整的主鍵查到結果集裡面;
d.保證所有欄位為非空字段並且沒有預設值。
五.資料庫元資料:
databasemetadata dbmd = con.getmetadata();//得到資料庫元資料
dbmd.supportsresultsetconcurrency(resultset.type_forward_only,
resultset.concur_updatable);//判斷是否支援可更新操作
六.批量更新
優勢:
1.節省傳遞時間
2.併發處理
preparedstatement:
1.addbatch() 將一組引數新增到 preparedstatement物件內部
2.executebatch() 將一批引數提交給資料庫來執行,如果全部命令執行成功,則返回更新計數組成的陣列。
statement:
addbatch(string sql)方法會在批處理快取中加入一條sql語句
executebatch()執行批處理快取中的所有sql語句。
注意:preparedstatement中使用批量更新時,要先設定好引數後再使用addbatch()方法加入快取。
批量更新中只能使用更新或插入語句
七.sql3中的資料型別
array:陣列
sturct:結構
大物件:
blob:大的二進位制資料檔案物件。
clob:大的文字檔案物件。
優點:
1.理論上大小沒有上限,受制於資料庫表空間的大小.
2.流式讀取.
使用大物件的步驟:
1.先插入乙個空的佔位物件empty_blob()(oracle的函式):insert into t_blob values(?,?,empty_blob());
2.獲得大物件:select blob_data from t_blob where name = ? for update;
3.獲取流進行寫入:blob.setbinarystream(0);
4.通過流來獲取blob中儲存的資料:blob.getbinarystream()
jdbc學習筆記 三
一.事務 transaction 原子操作 不可再分的操作,乙個操作不能再分成比它更細小的操作.事務是針對原子操作的,要求原子操作不可再分,並且必須同時成功同時失敗。事務就是把一些非原子操作,變成原子操作,由應用伺服器來提出要求,由資料庫伺服器來執行操作.在jdbc中預設是自動提交的,如果要想使用事...
JDBC 學習筆記 三
jdbc 學習筆記 三 三 幾個重要介面 1 statement sql語句執行介面 statement介面代表了乙個資料庫的狀態,在向資料庫傳送相應的sql語句時,都需要建立statement介面或者preparedstatement介面。在具體應用中,statement主要用於操作不帶引數 可以...
JDBC學習筆記
size medium color red 本節jdbc的操作學習大致分為 color size size medium color red list 資料庫的裝載和連線 資料庫的增刪改查 資料庫的預編譯 資料庫的事務管理 list color size 下面直接上 了,還是 比較實在 以mysql...