MyBatis中实现ListObject对象List的批处理插入,核心是利用动态SQL的foreach标签遍历集合,一次性生成多条插入语句,减少数据库连接开销,提升插入效率。

准备ListObject实体类
首先定义需要插入的ListObject实体类,假设该类包含id、name、age三个属性,对应数据库表的三个字段,代码如下:
public class ListObject {
private Integer id;
private String name;
private Integer age;
// 无参构造
public ListObject() {
}
// 有参构造
public ListObject(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}定义Mapper接口方法
在对应的Mapper接口中定义批量插入的方法,方法参数使用@Param注解指定集合名称,方便XML中引用,代码如下:
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ListObjectMapper {
/**
* 批量插入ListObject对象
* @param list 待插入的ListObject集合
* @return 插入成功的行数
*/
int batchInsert(@Param("list") List<ListObject> list);
}配置XML映射文件
在对应的Mapper XML文件中编写批量插入的SQL语句,使用foreach标签遍历传入的List集合,生成多条插入值,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://ipipp.com/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.ListObjectMapper">
<!-- 批量插入ListObject -->
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO list_object_table (id, name, age)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>
</mapper>这里需要注意foreach标签的属性:collection对应Mapper接口中@Param指定的名称,item是遍历的每个对象的别名,separator指定多个值之间的分隔符为逗号。
调用批量插入方法
在业务层中组装ListObject集合,调用Mapper的批量插入方法即可完成操作,示例代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class ListObjectService {
@Autowired
private ListObjectMapper listObjectMapper;
public void testBatchInsert() {
List<ListObject> list = new ArrayList<>();
list.add(new ListObject(1, "张三", 20));
list.add(new ListObject(2, "李四", 22));
list.add(new ListObject(3, "王五", 25));
// 执行批量插入
int rows = listObjectMapper.batchInsert(list);
System.out.println("批量插入成功,影响行数:" + rows);
}
}注意事项
- 如果数据库对批量插入的语句长度有限制,需要控制单次插入的集合大小,避免SQL过长报错。
- 如果插入的字段包含自增主键,需要去掉SQL中自增字段的插入,由数据库自动生成。
- 传入的List集合不能为空,否则会生成不完整的SQL语句导致执行报错,可以在业务层先做非空判断。
另外一种批量插入方式
如果需要兼容不同数据库的批量插入语法,也可以使用foreach标签生成多条单独的插入语句,通过开启MyBatis的批处理模式执行,XML配置如下:
<insert id="batchInsert" parameterType="java.util.List">
<foreach collection="list" item="item" separator=";">
INSERT INTO list_object_table (id, name, age)
VALUES (#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>这种方式需要在获取SqlSession时开启批处理模式,适合需要适配多种数据库的场景。
MyBatis批处理插入ListObjectList修改时间:2026-06-06 22:44:14