| 批處理Tip:使用JDBC進行批處理
 業(yè)務場景:當需要向數(shù)據(jù)庫發(fā)送一批SQL語句執(zhí)行時,應避免向數(shù)據(jù)庫一條條的發(fā)送執(zhí)行,而應采用JDBC的批處理機制,以提升執(zhí)行效率。
 實現(xiàn)批處理有兩種方式,第一種方式:
 Statement.addBatch(sql)     list
 執(zhí)行批處理SQL語句
 executeBatch()方法:執(zhí)行批處理命令
 clearBatch()方法:清除批處理命令
 Connection conn = null;
 Statement st = null;
 ResultSet rs = null;
 try {
 conn = JdbcUtil.getConnection();
 String sql1 = "insert into user(name,password,email,birthday)
 values('kkk','123','abc@sina.com','1978-08-08')";
 String sql2 = "update user set password='123456' where id=3";
 st = conn.createStatement();
 st.addBatch(sql1);  //把SQL語句加入到批命令中
 st.addBatch(sql2);  //把SQL語句加入到批命令中
 st.executeBatch();
 } finally{
 JdbcUtil.free(conn, st, rs);
 }
 采用Statement.addBatch(sql)方式實現(xiàn)批處理:
 優(yōu)點:可以向數(shù)據(jù)庫發(fā)送多條不同的SQL語句。
 缺點:
 SQL語句沒有預編譯。
 當向數(shù)據(jù)庫發(fā)送多條語句相同,但僅參數(shù)不同的SQL語句時,需重復寫上很多條SQL語句。例如:
 Insert into user(name,password) values(‘a(chǎn)a’,’111’);
 Insert into user(name,password) values(‘bb’,’222’);
 Insert into user(name,password) values(‘cc’,’333’);
 Insert into user(name,password) values(‘dd’,’444’);
   實現(xiàn)批處理的第二種方式:PreparedStatement.addBatch()
 conn = JdbcUtil.getConnection();
 String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
 st = conn.prepareStatement(sql);
 for(int i=0;i<50000;i++){
 st.setString(1, "aaa" + i);
 st.setString(2, "123" + i);
 st.setString(3, "aaa" + i + "@sina.com");
 st.setDate(4,new Date(1980, 10, 10));
 st.addBatch();if(i%1000==0){
 st.executeBatch();
 st.clearBatch();
 }
 }
 st.executeBatch();
 采用PreparedStatement.addBatch()實現(xiàn)批處理
 優(yōu)點:發(fā)送的是預編譯后的SQL語句,執(zhí)行效率高。
 缺點:只能應用在SQL語句相同,但參數(shù)不同的批處理中。因此此種形式的批處理經(jīng)常用于在同一個表中批量插入數(shù)據(jù),或批量更新表的數(shù)據(jù)。
 
 |