在 Java + MyBatis 中,批量插入常见有几种方式,从简单到高效依次是:
foreach 拼接 SQL(最常用)int batchInsert(@Param("list") List<User> list);
<insert id="batchInsert">
INSERT INTO user (name, age)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.age})
</foreach>
</insert>
✅ 优点:简单、兼容性好
⚠️ 注意:一次插入条数不宜过多(如 500~1000 条)
避免 SQL 过长:
int batchSize = 500;
for (int i = 0; i < list.size(); i += batchSize) {
List<User> subList = list.subList(i, Math.min(i + batchSize, list.size()));
userMapper.batchInsert(subList);
}
ExecutorType.BATCH(性能最好)@Autowired
private SqlSessionTemplate sqlSessionTemplate;
public void batchInsert(List<User> list) {
SqlSession session = sqlSessionTemplate
.getSqlSessionFactory()
.openSession(ExecutorType.BATCH, false);
UserMapper mapper = session.getMapper(UserMapper.class);
for (User user : list) {
mapper.insert(user);
}
session.flushStatements();
session.commit();
session.close();
}
int insert(User user);
✅ 优点:真正批量、性能极高
⚠️ 注意:事务需手动管理
@Transactional
public void batchInsert(List<User> list) {
for (User user : list) {
userMapper.insert(user);
}
}
配合:
mybatis:
executor-type: batch
jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
✅ 可显著提升批量插入性能
| 场景 | 推荐方式 |
|---|---|
| 小批量 | foreach |
| 中批量 | 分片 + foreach |
| 大批量 | BATCH Executor |
| 超高并发 | BATCH + rewriteBatchedStatements |
如果你用的是 MySQL / Oracle / PostgreSQL,或者 Spring Boot,可以告诉我,我可以给你更具体的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。