批量插入数据
批量插入可显著提升大量数据写入效率。
foreach 批量插入
XML
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (username, email, create_time) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.email}, #{user.createTime})
</foreach>
</insert>
Java
List<User> users = Arrays.asList(
new User("user1", "user1@example.com"),
new User("user2", "user2@example.com"),
new User("user3", "user3@example.com")
);
int rows = mapper.batchInsert(users);
System.out.println("插入 " + rows + " 条记录");
生成的 SQL:
SQL
INSERT INTO user (username, email, create_time) VALUES
('user1', 'user1@example.com', NOW()),
('user2', 'user2@example.com', NOW()),
('user3', 'user3@example.com', NOW())
分批插入
当数据量较大时,需分批插入避免 SQL 过长:
Java
public void batchInsertInChunks(List<User> users) {
int batchSize = 500; // 每批 500 条
for (int i = 0; i < users.size(); i += batchSize) {
List<User> chunk = users.subList(i, Math.min(i + batchSize, users.size()));
mapper.batchInsert(chunk);
}
}
注意:MySQL 单次插入建议不超过 1000 条,避免内存溢出与 SQL 语句过长。
批量插入获取主键
XML
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (username, email) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.email})
</foreach>
</insert>
Java
mapper.batchInsert(users);
// 插入后,每个 user 对象的 id 字段自动填充
for (User user : users) {
System.out.println("生成的 ID: " + user.getId());
}
要点总结
- foreach 标签实现批量插入,生成单条多值 INSERT 语句
- 分批插入控制批量大小,建议 500-1000 条每批
- useGeneratedKeys 可在批量插入后获取自增主键
- 批量插入需在事务中执行,保证数据一致性
📝 发现内容有误?点击此处直接编辑