有的時候,我們需要一次性插入很多的資料或者一次性更新、刪除很多的資料,那麼為了提高效率,我們不妨使用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