關於JDBC的批處理

來源:互聯網
上載者:User

 

有的時候,我們需要一次性插入很多的資料或者一次性更新、刪除很多的資料,那麼為了提高效率,我們不妨使用JDBC的批處理來完成。以下就JDBC的批處理的例子展開討論。所有應該注意的地方均有注釋。不過需要注意的是我們不能使用批處理來執行查詢,即批處理語句中不可以出現select語句。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

/*
 9:05:15 AM2011
 */
public class BatchExecute {

 private static Connection conn = null;
 private static PreparedStatement ps = null;
 private static Statement st=null;

 public static void main(String[] args) {
  //noStaticBatch();//非靜態批
  //staticBatch();//靜態批
  blendBatch();//混合模式
 }
 public static void blendBatch(){
  try{
   long start = System.currentTimeMillis();
   
   conn.setAutoCommit(false);
   st=conn.createStatement();
   st.addBatch("insert into person(name,age) values('zhuqi',22)");//插入
   st.addBatch("insert into person(name,age) values('zhaoba',21)");
   st.addBatch("update person set name = 'qita',age='100' where name = 'zhangsan'");//更新
   st.addBatch("delete from person where name like 'name%'");//刪除
   st.executeBatch();
   conn.commit();
   
   System.out.print("總共用時:" + (System.currentTimeMillis() - start)
     / 1000);
  }catch(Exception e){
   
  }finally{
   closeDB();
  }
 }
 public static void staticBatch(){
  try{
   long start = System.currentTimeMillis();
   
   conn.setAutoCommit(false);
   /**以下是錯誤的用法,此用法中兩條sql語句均為執行,
    * 如果想應用此方式的批處理,請參照blendBatch方法**/
   /*ps=conn.prepareStatement("insert into person(name,age) values('lisi',22)");
   ps=conn.prepareStatement("insert into person(name,age) values('wangwu',20)");
   ps.addBatch();*/
   
   /**以下是正確的用法**/
   String sql="insert into person(name,age) values(?,?)";
   ps=conn.prepareStatement(sql);
   ps.setString(1, "lisi");
   ps.setInt(2, 22);
   ps.addBatch();
   ps.setString(1, "wangwu");
   ps.setInt(2, 20);
   ps.addBatch();
   
   ps.addBatch("update person set name = 'zhangsan',age = 23 where name = 'lisi'");//增加靜態批
   ps.executeBatch();
   conn.commit();
   
   System.out.print("總共用時:" + (System.currentTimeMillis() - start)
     / 1000);
  }catch(Exception e){
   
  }finally{
   closeDB();
  }
 }
 public static void noStaticBatch(){
  try {
   long start = System.currentTimeMillis();
   
   conn.setAutoCommit(false);// 取消自動事務提交
   String sql1 = "insert into person(name,age) values(?,?)";
   ps = conn.prepareStatement(sql1);
   for (int i = 1; i <= 110; i++) {
    ps.setString(1, "names " + i);
    ps.setInt(2, i);
    ps.addBatch();
    if (i % 20 == 0 || i == 110) {// 每20條資料執行一次、到最後必須執行一次
     ps.executeBatch();//執行批
     
     try{//這裡一定要捕捉異常
      conn.commit();// 提交事務
     }catch(SQLException exc){
      conn.rollback();// 在批處理命令中,如果有一個命令出現了錯誤,則復原
     }
    }
   }
   
   System.out.print("總共用時:" + (System.currentTimeMillis() - start)
     / 1000);// 測試用時
  } catch (Exception e) {
   
  }finally{//關閉資料庫連接
   closeDB();
  }
 }
 static{
  try {
   Class.forName("com.mysql.jdbc.Driver");
   conn=DriverManager.getConnection("jdbc:mysql:///test","root","root");
  } catch (Exception e) {
   System.out.println("資料庫連接錯誤");
  }
 }
 public static void closeDB(){
  if(st!=null)
   try {st.close();} catch (SQLException e1){st=null;}
  if(ps!=null)
   try {ps.close();} catch (SQLException e1){ps=null;}
  if(conn!=null)
   try {conn.close();}catch (SQLException e){conn=null;}
  System.out.println("\t 串連已關閉");
 }
}

轉:http://apps.hi.baidu.com/share/detail/33875322

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.