a).PreparedStatement 可以進行批量操作,但是與Statement有一定的區別
1. Statement可以進行不同sql語句的批量操作
即可以同時進行 crud 操作.
String sql1=xxx;
String sql2=xxx;
String sql3=xxx;
Statement statement=conn.createStatement();
statement.addBatch(sql1) ;
statement.addBatch(sql2);
statement.addBatch(sql3);
statement.executeQuery(sql)
or
statement.executeUpdate(sql)
2. PreparedStatement 不能執行不同的sql語句, 只能執行一條類型的sql語句,但是可以參數不同
String sql="insert into table values(?,?,?,?,?)";
PreparedStatement pstm=conn.preparedStatement (sql);
pstm.setString(1,xx);
pstm.setString(2,xx);
pstm.setString(3,xx);
pstm.setString(4,xx);
pstm.addBatch();
pstm.setString(1,xx);
pstm.setString(2,xx);
pstm.setString(3,xx);
pstm.setString(4,xx);
pstm.addBatch();
pstm.executeQuery();
or
pstm.executeUpate();
b) 注意這些批量操作,應該使用開啟事務
開啟事務:
1.需要去看數據庫是否支持事務,更換引擎為InnodDB
2.有些版本的navicat有一個開啟事務的按鈕
3.在Dao層中,可以使用conn.setAutoCommit(false) 默認為true,這里設置為false,可以阻止自動提交
//在進行完操作后,應該手動提交
conn.commit();
//如果出錯, 需要回滾事務,那么我們可以在catch中進行事務的回滾操作
//首先判斷conn是否關閉了
if(!conn.isClosed)
{
//沒有關閉進行回滾
conn.rollback();
//隨你...
conn.setAutoCommit(true);
}