繁体   English   中英

如何在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);

batchUpdate是您在这里寻找的。 但是,您将需要稍微更改/调整查询。

如果您可以传递对象列表(必须将类成员与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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM