如何在JdbcTemplate中执行多批量删除?
How to execute multi batch delete in JdbcTemplate?
我想一次删除多个数据库条目。仅当 3 个字段匹配(此处:姓名、电子邮件、年龄)时,才应删除每个条目。
如果我只想删除一个 属性,我会选择:
String sql = "DELETE FROM persons WHERE (email) IN (?)";
JdbcTemplate template;
template.execute(sql, Arrays.asList(emails...));
但是如果我的条件是由多个字段组成呢?
String sql = "DELETE FROM persons WHERE (name, email, age) IN (?, ?, ?)";
JdbcTemplate template;
template.execute(sql, ...); ???
条件应始终匹配所有 3 个字段 (AND
)!
使用batchUpdate(sql, batchArgs, argTypes)
方法。
String sql = "DELETE FROM persons WHERE name = ? AND email = ? AND age = ?";
int[] argTypes = { Types.VARCHAR, Types.VARCHAR, Types.INTEGER };
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] { "John Doe", "john@example.com", 42 });
batchArgs.add(new Object[] { "Jane Smith", "jane@example.com", 47 });
. . .
JdbcTemplate template = ...;
int[] rowCounts = template.batchUpdate(sql, batchArgs, argTypes);
A batchUpdate
就是您要找的。不过,您需要 change/tweak 稍微查询一下。
如果您可以传递一个对象列表(您必须将 class 成员与 SQL 查询中的值相匹配),它可以自动完成:
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
// class People { String name; String email; Integer age; }
final String sql = "DELETE FROM persons WHERE name = :name AND email = :email AND age = :age";
final SqlParameterSource[] batchArgs = SqlParameterSourceUtils.createBatch(people.toArray()); // List<People>
final int[] results = namedParameterJdbcTemplate.batchUpdate(sql, batchArgs);
logger.debug("{} record(s) inserted successfully", results.length);
另一种方法是@Andreas .
我还建议始终使用参数化查询:DELETE FROM persons WHERE name = :name AND email = :email AND age = :age
.
我想一次删除多个数据库条目。仅当 3 个字段匹配(此处:姓名、电子邮件、年龄)时,才应删除每个条目。
如果我只想删除一个 属性,我会选择:
String sql = "DELETE FROM persons WHERE (email) IN (?)";
JdbcTemplate template;
template.execute(sql, Arrays.asList(emails...));
但是如果我的条件是由多个字段组成呢?
String sql = "DELETE FROM persons WHERE (name, email, age) IN (?, ?, ?)";
JdbcTemplate template;
template.execute(sql, ...); ???
条件应始终匹配所有 3 个字段 (AND
)!
使用batchUpdate(sql, batchArgs, argTypes)
方法。
String sql = "DELETE FROM persons WHERE name = ? AND email = ? AND age = ?";
int[] argTypes = { Types.VARCHAR, Types.VARCHAR, Types.INTEGER };
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] { "John Doe", "john@example.com", 42 });
batchArgs.add(new Object[] { "Jane Smith", "jane@example.com", 47 });
. . .
JdbcTemplate template = ...;
int[] rowCounts = template.batchUpdate(sql, batchArgs, argTypes);
A batchUpdate
就是您要找的。不过,您需要 change/tweak 稍微查询一下。
如果您可以传递一个对象列表(您必须将 class 成员与 SQL 查询中的值相匹配),它可以自动完成:
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
// class People { String name; String email; Integer age; }
final String sql = "DELETE FROM persons WHERE name = :name AND email = :email AND age = :age";
final SqlParameterSource[] batchArgs = SqlParameterSourceUtils.createBatch(people.toArray()); // List<People>
final int[] results = namedParameterJdbcTemplate.batchUpdate(sql, batchArgs);
logger.debug("{} record(s) inserted successfully", results.length);
另一种方法是@Andreas
我还建议始终使用参数化查询:DELETE FROM persons WHERE name = :name AND email = :email AND age = :age
.