批處理batch,執(zhí)行多個(gè)SQL語(yǔ)句。
[sql]
view plaincopytry{
stmt=conn.createStatement();
conn.setAutoCommit(false);//取消自動(dòng)提交
stmt.addBatch("insert into person (name,password,age)values('A','AAA',20)");
stmt.addBatch("insert into person (name,password,age)values('B','BBB',20)");
stmt.addBatch("insert into person (name,password,age)values('C','CCC',24)");
stmt.addBatch("insert into person (name,password,age)values('D','DDD',46)");
stmt.addBatch("insert into person (name,password,age)values('E','EEE',20)");
//執(zhí)行批處理語(yǔ)句
stmt.excuteBatch();
//如果沒(méi)有異常,則執(zhí)行此段代碼
//提交事務(wù),真正向數(shù)據(jù)庫(kù)中提交數(shù)據(jù)
conn.commit();
}catch(Exception e){
//將數(shù)據(jù)回滾
try{
conn.rollback();
}catch(Exception e1){
}
}finally{
//關(guān)閉
}
注意其中的兩個(gè)SQL語(yǔ)句,其一是stmt.addBatch();其二是stmt.excuteBatch();
在批量更新SQL操作的時(shí)候建議使用addBatch,這樣效率是高些,數(shù)據(jù)量越大越能體現(xiàn)出來(lái).
Statement接口里有兩個(gè)方法:
void
addBatch(
String sql)
將給定的 SQL 命令添加到此 Statement 對(duì)象的當(dāng)前命令列表中。通過(guò)調(diào)用方法 executeBatch 可以批量執(zhí)行此列表中的命令。
int[]
executeBatch()
將一批命令提交給數(shù)據(jù)庫(kù)來(lái)執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計(jì)數(shù)組成的數(shù)組。
返回:
包含批中每個(gè)命令的一個(gè)元素的更新計(jì)數(shù)所組成的數(shù)組(數(shù)組中的每個(gè)元素為:成功處理了命令后,執(zhí)行命令所影響數(shù)據(jù)庫(kù)中行數(shù)的更新計(jì)數(shù))。數(shù)組的元素根據(jù)將命令添加到批中的順序排序。
PreparedStatement接口里:重寫了addBatch()的方法,
executeBatch()并沒(méi)有重寫
void
addBatch() <注意:PreparedStatement的addBatch( )沒(méi)有參數(shù)的>
將一組參數(shù)添加到此 PreparedStatement 對(duì)象的批處理命令中。
PreparedStatement.addbatch()的使用:
JDBC批量更新pstmt.addBatch();的問(wèn)題
在數(shù)據(jù)量越大的時(shí)候 越能體現(xiàn)addBatch()的優(yōu)勢(shì)
因?yàn)閿?shù)據(jù)庫(kù)的處理速度是非常驚人的單次吞吐量很大執(zhí)行效率極高
addBatch()把若干sql語(yǔ)句裝載到一起,然后一次送到數(shù)據(jù)庫(kù)執(zhí)行,執(zhí)行需要很短的時(shí)間
而pstmt.executeUpdate()是一條一條發(fā)往數(shù)據(jù)庫(kù)執(zhí)行的時(shí)間都消耗在數(shù)據(jù)庫(kù)連接的傳輸上面
舉個(gè)例子可以幫助理解: 我這有一臺(tái)超大功率的面粉加工機(jī),前者相當(dāng)于 把所有農(nóng)戶袋裝的麥子收集起來(lái)用卡車一次送往加工廠 后者相當(dāng)于農(nóng)戶排好隊(duì)用同樣的卡車一人一人的往加工廠送麥子 麥子加工5分鐘完成,但是每個(gè)人到工廠就得3小時(shí),我數(shù)據(jù)庫(kù)執(zhí)行效率再高也沒(méi)用,時(shí)間都耗在傳輸?shù)穆飞狭耍?!這就出現(xiàn)了數(shù)據(jù)傳輸?shù)男阅芷款i addBatch就是為解決這樣的問(wèn)題而產(chǎn)生的! Statement和PreparedStatement的區(qū)別就不多廢話了,直接說(shuō)PreparedStatement最重要的addbatch()結(jié)構(gòu)的使用.
1.建立鏈接,(打電話撥號(hào) )
Connection connection =getConnection();
2.不自動(dòng) Commit (瓜子不是一個(gè)一個(gè)吃,全部剝開(kāi)放桌子上,然后一口舔了)
connection.setAutoCommit(false);
3.預(yù)編譯SQL語(yǔ)句,只編譯一回哦,效率高啊.(發(fā)明一個(gè)剝瓜子的方法,以后不要總想怎么剝瓜子好.就這樣剝.)
PreparedStatement statement= connection.prepareStatement("INSERT INTO TABLEX VALUES(?, ?)");
4.來(lái)一個(gè)剝一個(gè),然后放桌子上
//記錄1
statement.setInt(1, 1);
statement.setString(2, "Cujo");
statement.addBatch();//把這條執(zhí)行語(yǔ)句加到PreparedStatement對(duì)象的批處理命令中
//記錄2
statement.setInt(1, 2);
statement.setString(2, "Fred");
statement.addBatch();//把這條執(zhí)行語(yǔ)句加到PreparedStatement對(duì)象的批處理命令中
//記錄3
statement.setInt(1, 3);
statement.setString(2, "Mark");
statement.addBatch(); //把這條執(zhí)行語(yǔ)句加到PreparedStatement對(duì)象的批處理命令中
//批量執(zhí)行上面3條語(yǔ)句. 一口吞了,很爽
int [] counts =statement.executeBatch();//把以上添加到批處理命令中的所有命令一次過(guò)提交給數(shù)據(jù)庫(kù)來(lái)執(zhí)行
//Commit it 咽下去,到肚子(DB)里面
connection.commit();
關(guān)于兩個(gè)
prepareStatement方法的區(qū)別:兩者都是創(chuàng)建一個(gè) PreparedStatement 對(duì)象來(lái)將參數(shù)化的 SQL 語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù),區(qū)別僅僅在于,第二個(gè)PreparedStatement對(duì)象有個(gè)
ResultSet getGeneratedKeys();方法可以返回執(zhí)行Statement對(duì)象而創(chuàng)建的任何自動(dòng)生成的鍵(主要是自增的鍵)的結(jié)果集
PreparedStatementprepareStatement(
String sql)
創(chuàng)建一個(gè) PreparedStatement 對(duì)象來(lái)將參數(shù)化的 SQL 語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)。
PreparedStatementprepareStatement(
String sql,int autoGeneratedKeys)
創(chuàng)建一個(gè)默認(rèn) PreparedStatement 對(duì)象,該對(duì)象能獲取自動(dòng)生成的鍵。