JDBC实现批处理有两种方式:Statement和PreparedStatement。
批处理常用方法:
| 方法名字 | 含义 |
|---|---|
| addBatch(sql) | 添加sql语句到批处理 |
| addBatch() | 添加sql语句到批处理,要求SQL语句相同参数不同 |
| executeBatch() | 执行批处理 |
| clearBatch() | 清除批处理 |
1.使用Statement
实例:
String sql = "";
try(Connection conn= DBUtils.getConnection()
;Statement stmt = conn.createStatement())
{
sql = "insert into students (sname,gender) values ('刘备','男')";
stmt.addBatch(sql);
sql = "update students set gender = '女' where sid = 3";
stmt.addBatch(sql);
sql = "delete from students where sid >8";
stmt.addBatch(sql);
//执行批处理
stmt.executeBatch();
}catch(Exception ex){
ex.printStackTrace();
}
这里我们使用try-with-resources,实现Connection与Statement资源的自动释放。 使用addBatch(sql)执行批处理的好处是可以向数据库发送多条不同的SQL语句。但是缺点是SQL语句没有预编译。
2.使用PreparedStatement
使用批处理批量添加10条学生记录。
class Students {
private String sname;
private String gender;
public Students() {
}
public Students(String sname, String gender) {
this.sname = sname;
this.gender = gender;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Students{" +
"sname='" + sname + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
public class BatchDemo {
public static List<Students> studentsList = new ArrayList<Students>();
public static void initStudentsList() {
for (int i = 1; i <= 10; i++) {
Students s = new Students("张" + i, "男");
studentsList.add(s);
}
}
public static void main(String[] args) {
initStudentsList();
String sql = "insert into students (sname,gender) values (?,?)";
try (Connection conn = DBUtils.getConnection()
; PreparedStatement pstmt = conn.prepareStatement(sql)) {
studentsList.forEach(s -> {
try {
pstmt.setString(1, s.getSname());
pstmt.setString(2, s.getGender());
pstmt.addBatch();
} catch (Exception ex) {
ex.printStackTrace();
}
});
pstmt.executeBatch();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
addBatch()实现批处理的优点是:发送的是预编译后的SQL语句,执行效率高。缺点是:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。