在 Java 里“批量查数据”通常分几种场景,下面按常见用法给你总结,直接对照用就行。
Mapper 接口
List<User> selectByIds(@Param("ids") List<Long> ids);
XML
<select id="selectByIds" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
✅ 适合:ID 批量查
List<User> selectByConditions(@Param("list") List<UserQuery> list);
<select id="selectByConditions" resultType="User">
SELECT * FROM user
WHERE
<foreach collection="list" item="item" separator=" OR ">
(name = #{item.name} AND age = #{item.age})
</foreach>
</select>
JDBC 没有真正的批量 SELECT,一般是:
String sql = "SELECT * FROM user WHERE id IN (?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM user",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY
);
ps.setFetchSize(1000);
ResultSet rs = ps.executeQuery();
✅ 适合:百万级数据
List<User> findByIdIn(List<Long> ids);
或:
@Query("SELECT u FROM User u WHERE u.status IN :statuses")
List<User> findByStatuses(@Param("statuses") List<Integer> statuses);
List<Long> ids = ...; // 10000 个
int batchSize = 500;
for (int i = 0; i < ids.size(); i += batchSize) {
List<Long> sub = ids.subList(i, Math.min(i + batchSize, ids.size()));
List<User> users = userMapper.selectByIds(sub);
// 处理
}
✅ 强烈推荐:避免 SQL 过长或内存爆炸
ids.parallelStream()
.collect(Collectors.groupingBy(i -> i % 4))
.values()
.parallelStream()
.forEach(sub -> userMapper.selectByIds(sub));
⚠️ 注意数据库连接池大小
❌ 在 for 循环里一条条查(N+1 问题)
❌ 一次查全表不分页
如果你能告诉我:
我可以直接给你最合适的代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。