java里面用in批量查询的常用方法代码分享
在 Spring 的 JdbcTemplate 中,没有直接提供类似 batchQuery 这样的批量查询方法。不过,你可以通过以下几种方式实现批量查询:1. 使用 IN 子句(最常见)
java
// 构建 IN 子句
List<Long> ids = wData.stream().map(WData::getId).collect(Collectors.toList());
String sql = "SELECT * FROM yizuotu_net WHERE id IN (:ids)";
// 使用 NamedParameterJdbcTemplate
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);
List<YourEntity> results = namedParameterJdbcTemplate.query(
sql,
parameters,
new BeanPropertyRowMapper<>(YourEntity.class)
);
2. 动态构建 IN 子句(普通 JdbcTemplate)
java
List<Long> ids = wData.stream().map(WData::getId).collect(Collectors.toList());
// 生成占位符: ?,?,?,?
String placeholders = String.join(",", Collections.nCopies(ids.size(), "?"));
String sql = "SELECT * FROM yizuotu_net WHERE id IN (" + placeholders + ")";
List<YourEntity> results = jdbcTemplate.query(
sql,
new BeanPropertyRowMapper<>(YourEntity.class),
ids.toArray()
);
3. 分批查询(处理大量数据)
java
public List<YourEntity> batchQuery(List<Long> ids) {
List<YourEntity> allResults = new ArrayList<>();
// 每次查询 1000 条
int batchSize = 1000;
for (int i = 0; i < ids.size(); i += batchSize) {
int end = Math.min(i + batchSize, ids.size());
List<Long> batchIds = ids.subList(i, end);
String placeholders = String.join(",", Collections.nCopies(batchIds.size(), "?"));
String sql = "SELECT * FROM yizuotu_net WHERE id IN (" + placeholders + ")";
List<YourEntity> batchResults = jdbcTemplate.query(
sql,
new BeanPropertyRowMapper<>(YourEntity.class),
batchIds.toArray()
);
allResults.addAll(batchResults);
}
return allResults;
}
4. 使用 MyBatis(替代方案)
如果你需要更灵活的批量查询,MyBatis 提供了更好的支持:
xml
<select id="batchSelect" resultType="YourEntity">
SELECT * FROM yizuotu_net WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
5. 使用 Union All(特殊场景)
如果查询条件复杂,也可以用 UNION ALL:
java
StringBuilder sql = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
if (i > 0) sql.append(" UNION ALL ");
sql.append("SELECT * FROM yizuotu_net WHERE id = ?");
}
List<YourEntity> results = jdbcTemplate.query(
sql.toString(),
new BeanPropertyRowMapper<>(YourEntity.class),
ids.toArray()
);
推荐方案
数据量小(< 1000):直接使用 IN 子句
数据量大(> 1000):分批查询,每批 500-1000 条
对性能要求高:考虑使用 NamedParameterJdbcTemplate,代码更简洁
复杂批量操作:考虑使用 MyBatis 或 JPA 等 ORM 框架
注意:数据库的 IN 子句通常有长度限制(如 Oracle 限制 1000),所以大数据量时需要分批处理。





