1. 程式人生 > >JDBC高級特性(一)結果集,批量更新

JDBC高級特性(一)結果集,批量更新

事務 必須 -h eth mark cep tro cancel 相對定位

一、ResultSet的高級特性

1 可滾動ResultSet

1)向前和向後滾動

滾動特性

在JDBC初期版本號中, ResultSet僅能向前滾動

在JDBC興許版本號中, ResultSet默認能向前滾動或前後滾動

遲緩滾動:記錄集可前後滾動。不受數據庫數據更新影響

靈敏滾動:記錄集可前後滾動,受數據庫數據更新影響

由結果集類型設定

con.createStatement()

con.createStatement(結果集類型, 結果集並發類型)

con.createStatement(結果集類型, 結果集並發類型,結果集可保存性)

結果集特性設置:

語法
Statement stm = con.createStatement(int resultSetType, int resultSetConcurrency,int resultSetHoldability);
演示樣例:
//默認能夠前後滾動。記錄集類型:受數據庫數據改動影響。
//結果集並發類型:能夠更新的並發類型
//結果集可保存性:當前事務提交時結果集被關閉
Statement stm = con. createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
ResultSet.CLOSE_CURSORS_AT_COMMIT);
ResultSet rs = stm.executeQuery(“select * from student”);

技術分享

ResultSet結果集類型。結果集並發類型。結果集可保存性特性對PreparedStatament及CallableStatement相同適用
con.prepareStatement(SQL,結果集類型, 結果集並發類型)
con.prepareStatement(SQL。結果集類型, 結果集並發類型,結果集可保存性)

con.prepareCall(SQL。結果集類型, 結果集並發類型)
con.prepareCall(SQL。結果集類型, 結果集並發類型,結果集可保存性)

2 ResultSet定位

1)讓遊標指向某一行數據
2)結果集支持相對定位和絕對定位

結果集定位就是使遊標指向記錄集中的某一行數據

ResultSet支持絕對和相對定位

使用absolute()和next()方法進行遊標定位

演示樣例

sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
while(rs.next()){……..} //從第一行前開始向下移動

rs.absolute(5); //不管原來指向哪裏。直接指向第五行

結果集定位的方法:

技術分享

3 可更新ResultSet

1)結果集存放查詢結果,默認不可更新
2)通過connection獲得statement對象時可設置參數決定是否可通過結果集更新數據

結果集存放查詢結果,默認不可更新

通過connection獲得statement對象時可設置結果集並發類型參數決定是否可通過結果集更新數據

假設結果集並發類型設置為CONCUR_UPDATABLE就能夠通過結果集改動數據

設置後。能夠在結果集中對數據進行更新、刪除和插入

使用結果集改動數據時,先定位光標位置然後運行更新、刪除或插入數據

更新行:

語法
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”,value);
resultSetVar.updateRow(); //兩個方法要配合使用
cancelRowUpdates(); //取消更新。必須在updateRow()之前使用
演示樣例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.last(); //定位
rs.updateString("name",“oracle");
rs.updateString(3,“oracle”); //updateXXX()方法
rs.updateInt(“age”,21); //這些update方法不會更新底層數據庫
rs.updateRow(); //更新底層數據庫


刪除行:

語法
resultSetVar.deleteRow();
演示樣例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.absolute(10); //將指針定位到相應的行
rs.deleteRow(); //刪除當前行數據。同一時候刪除底層數據庫數據


插入新行:

語法
resultSetVar.moveToInsertRow();
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”, value);
resultSetVar.insertRow();
演示樣例
rs.moveToInsertRow(); //記住指針位置
rs.updateString(2, “Rose”);
rs.updateString(“password”, “Rose”);
rs.updateInt(“age”, 11);
rs.insertRow(); //插入數據,更新底層數據庫
rs.moveToCurrentRow(); //將指針移動到記住的指針位置


可更新結果集的要求:

不是全部結果集都能更新

可更新的結果集必須滿足下面條件

查詢僅僅引用了一個數據表
查詢不包括不論什麽聯接操作
查詢結果中包括主鍵
查詢結果全部列不可為空。沒有默認值


二、批量更新

1 Statement批量更新

語法:
Statement stm = con.createStatement();
stm.addBatch(sqlString); stm.addBatch(sqlString);……
stm.executeBatch();
演示樣例:
con.setAutoCommit(false); //設置事務非自己主動提交
Statement stm = con.createStatement();
stm.addBatch(“insert into t_user(id, name, password) values(11, ‘Rose’, ‘Rose’)”);
stm.addBatch (“insert into t_user(id, name, password) values(12, ‘Mary’, ‘Mary’)”);
int[] results = stm.executeBatch(); //提交運行
con.commit(); //提交事務。使更改成為持久更改


批量更新一定要將事務提交設為非自己主動提交

con.setAutoCommit(false);
con.commit();
Statement的executeBatch()方法提交多個命令到數據庫運行。返回每一個命令更新行數所組成的數組
假設批量更新中的某些命令無法正確運行,則會拋出 BatchUpdateException異常
BatchUpdateException的getUpdateCounts()方法能夠返回發生此異常之前批量更新中成功運行的每一個更新語句的更新計數組成的數組


2 PreparedStatement批量更新

PreparedStatement預編譯SQL語句。傳入參數後運行
PreparedStatement批處理將傳入的參數批量送入數據庫運行相應的SQL語句

語法:
PreparedStatement pstm = con.prepareStatement(sqlString);
pstm.setXXX(..); pstm.addBatch();
pstm.setXXX(..); pstm.addBatch();
pstm.excuteBatch();
演示樣例
con.setAutoCommit(false);
PreparedStatement pstm = con.prepareStatement(“insert into t_user(name) values(?)”);
pstm.setString(1, “Rose”); pstm.addBatch();
pstm.setString(1, “John”); pstm.addBatch();
pstm.setString(1, “Mary”); pstm.addBatch();
int[] counts = pstm.excuteBatch(); con.commit();


3 CallableStatement批量更新

CallableStatement處理數據庫儲存過程

CallableStatement接口繼承PreparedStatement接口

相關批處理方法是從PreparedStatement接口繼承而來

CallableStatement批處理與PreparedStatement批處理模式同樣

將傳入的參數批量送入數據庫運行相應的存儲過程


JDBC高級特性(一)結果集,批量更新