下面用簡單的實例演示一下什么是批處理操作
Statement和PreparedStatement提供例了批處理與事務操作六敬,用來一次執(zhí)行多條語句稠项。下面用Statement操作升筏。
Statement接口提供批處理方法:
- 添加批處理數(shù)據(jù)public void addBatch(String sql)throws SQLException
- 執(zhí)行批處理數(shù)據(jù) public int[] executeBatch()throws SQLException
注:返回的是int數(shù)組撑柔,每個數(shù)據(jù)依次為每條sql影響的行數(shù).
Connection中提供操作事務的方法:
- 提交事務 public void commit()throws SQLException
- 撤銷事務public void rollback()throws SQLException
- 是否為自動提交public void setAutoCommit(boolean autoCommit)throws SQLException
注:該方法參數(shù)默認為true,為false時程序會將一組SQL作為一個事務調(diào)用commit()執(zhí)行提交您访。
觀察如下代碼:
package com.dao.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;
public class Test2 {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/school";
private static final String USER = "root";
private static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
try {
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = connection.createStatement();
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(9,'10');");
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(10,'12');");
stmt.addBatch("insert into grade(grade_id,grade_name) ***VALUES(11,'13');");
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(12,'14');");
int len[] = stmt.executeBatch();
System.out.println(Arrays.toString(len));
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在以上程序中第三條SQL出現(xiàn)錯誤铅忿,但是查詢數(shù)據(jù)庫發(fā)現(xiàn)前兩條數(shù)據(jù)插入成功,這不符合事務操作灵汪,作如下修改檀训,將事務自動提交設為false柑潦,如果沒有出現(xiàn)錯誤,調(diào)用commit提交事務峻凫,否則調(diào)用rollback進行事務回滾渗鬼,將已經(jīng)執(zhí)行成功的數(shù)據(jù)再刪除。
package com.dao.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;
public class Test2 {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/school";
private static final String USER = "root";
private static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
Class.forName(DRIVER);
Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
connection.setAutoCommit(false);
Statement stmt = connection.createStatement();
try {
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(9,'10');");
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(10,'12');");
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(11,'13');");
stmt.addBatch("insert into grade(grade_id,grade_name) VALUES(12,'14');");
int len[] = stmt.executeBatch();
System.out.println(Arrays.toString(len));
connection.commit();
connection.close();
} catch (Exception e) {
e.printStackTrace();
connection.rollback();
}
}
}
以上為手工處理事務荧琼,在開發(fā)中由容器幫我們自動完成譬胎。