JDBC 筆記(3)

JDBC第三天
上午:
一.事務(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(sql,ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)
在創建Statement的時候就要指定這兩個參數,使用Statement,第一個參數代表滾動特性常量,第二個代表更新特性常量


2)可更新特性
a.moveToInsertRow();記錄當前遊標位置,將遊標移到和結果集結構類似的緩衝區;
b.使用updateXxx(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()方法加入緩存。
批量更新中只能使用更新或插入語句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章