批量化
JdbcTemplate 的 executeBatch 方法,将一批命令提交到数据库执行,如果所有命令都成功执行,则返回更新计数的数组。 数组元素按照命令的顺序进行排序,命令的顺序根据它们执行时 SQL 顺序或者参数顺序排序。
用法
批量执行 SQL 命令适用于不需要参数的语句,它们将会通过 Statement 接口来执行。比如:下面这个批量 INSERT。
不使用参数
int[] result = jdbc.executeBatch(new String[] {
"insert into users values (1, 'David')",
"insert into users values (2, 'Kevin')"
});
使用 位置参数
String sql = "insert into users values (?,?)";
Object[][] arg = new Object[][] {
new Object[] { 1, "David"},
new Object[] { 2, "Kevin"}
};
int[] result = jdbc.executeBatch(sql, arg);
使用 名称参数
String sql = "insert into users (id, name) values(:id, :name)";
Map<String, Object> args1 = CollectionUtils.asMap(
"id", 1,
"name", "David"
);
Map<String, Object> args1 = CollectionUtils.asMap(
"id", 2,
"name", "Kevin"
);
int[] result = jdbc.executeBatch(sql, new Map[] { args1, args2 });
使用 PreparedStatement
String sql = "insert into users values (?,?)";
Object[][] arg = new Object[][] {
new Object[] { 1, "David"},
new Object[] { 2, "Kevin"}
};
BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, (int)arg[i][0]);
ps.setString(1, (String)arg[i][1]);
}
public int getBatchSize() {
return arg.length;
}
};
int[] result = jdbc.executeBatch(sql, setter);
info
- dbVisitor 支持多种参数传递方式,为了便于理解下面执行 SQL 的案例中选择常用的