mybatis 插入多条数据
可以通过MyBatis的批处理方式一次性插入多条数据。具体的实现方式如下:
- 在Mapper.xml文件中编写插入语句,示例如下:
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO user (id, name, age) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>
- 在DAO接口中定义插入多条数据的方法,示例如下:
void insertBatch(List<User> userList);
- 在Java代码中调用DAO层的方法进行批处理插入,示例如下:
List<User> userList = new ArrayList<>();
userList.add(new User(1, "Alice", 25));
userList.add(new User(2, "Bob", 30));
userList.add(new User(3, "Charlie", 35));
userDao.insertBatch(userList);
通过以上步骤,就可以使用MyBatis的批处理方式一次性插入多条数据了。
mybatis插入多条数据
在使用 MyBatis 插入多条数据时,有两种常见的方式:
- 使用
foreach
标签
使用 foreach
标签可以将多条数据一次性插入到数据库中。在 foreach
标签中,可以使用 ${}
或者 #{}
占位符来获取集合中的数据。以下是一个示例:
<insert id="batchInsert" parameterType="java.util.List">
insert into user (name, age) values
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.age})
</foreach>
</insert>
在 Java 代码中,你可以将多条数据封装到一个 List
中,然后调用 batchInsert
方法插入数据:
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 18));
userList.add(new User("李四", 20));
userMapper.batchInsert(userList);
- 使用
insert into table select
语句
另一种方式是使用 insert into table select
语句。首先,你需要创建一个临时表,然后将多条数据插入到临时表中,最后再将临时表中的数据插入到目标表中。以下是一个示例:
<insert id="batchInsert" parameterType="java.util.List">
create temporary table temp_user (name varchar(20), age int);
<foreach collection="list" item="item">
insert into temp_user (name, age) values (#{item.name}, #{item.age});
</foreach>
insert into user (name, age) select name, age from temp_user;
drop temporary table if exists temp_user;
</insert>
在 Java 代码中,你可以将多条数据封装到一个 List
中,然后调用 batchInsert
方法插入数据:
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 18));
userList.add(new User("李四", 20));
userMapper.batchInsert(userList);
以上两种方式都可以批量插入多条数据,你可以根据实际情况选择合适的方式。需要注意的是,在使用 foreach
标签插入数据时,需要注意 SQL 注入问题,建议使用 #{}
占位符来获取集合中的数据。
mybatis插入多条数据获取自增主键
使用 MyBatis 进行批量插入并获取自增主键
为了实现通过 MyBatis 插入多条记录的同时获取每一条记录对应的自增主键 ID,需遵循特定配置与编码实践。
环境准备
确保所使用的 MyBatis 版本不低于 3.3.1[^2]。较低版本可能不具备此功能的支持。
Mapper XML 文件配置
在 mapper.xml
中定义 SQL 映射语句时,应加入如下属性来启用自动生成的键值返回:
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO table_name (column_list)
VALUES
<foreach collectioncolumn2})
</foreach>
</insert>
上述代码片段展示了如何利用 <foreach>
标签遍历传入的对象集合,并为每一项构建相应的插入子句;同时设置了 useGeneratedKeys=true
及指定了用于接收新生成 ID 的对象属性名 keyProperty="id"
。
Java 接口设计
对应于上面的映射文件,在接口层面上声明相应的方法签名,注意这里只接受单一参数即待插入的数据集数组或列表形式传递给 DAO 层处理:
public interface UserMapper {
int batchInsert(@Param("list") List<User> userList);
}
值得注意的是,尽管执行批处理操作,但该方法仍然保持简单整数类型的返回值表示受影响行的数量而非直接返回包含所有新增 ID 的列表。
实体类调整
如果表中的自动增长列名称与实体类成员变量命名存在差异,则应在 mapper xml 设置额外两个属性:keyColumn
和 keyProperty
来建立两者之间的关联关系。
例如对于 MySQL 表内名为 user_id
而实体类里叫作 userId
的情况可以这样指定:
<insert id="batchInsertUserWithDifferentIdName"
useGeneratedKeys="true"
keyColumn="user_id"
keyProperty="userId">
<!-- ... -->
</insert>
测试验证
最后编写单元测试案例调用上述服务完成实际业务逻辑检验整个流程是否正常工作以及确认确实能够取得预期的结果集——也就是各个被插入记录各自的唯一标识符。
相关推荐













