最近使用 Mybatis 写了很多批量插入的代码,其中也有时候需要返回自增ID列表,本文稍微介绍一下需要注意的地方。
这里为了提供一个简单的示例,以批量插入用户为例
代码地址:https://github.com/saysky/sensboot
先说下原理
批量插入返回自增ID列表和普通插入返回自增ID是一样的,通常只需要在 mapper.xml 的 <insert> 上添加属性 useGeneratedKeys="true" keyProperty="id" 就能实现插入成功后,mybatis 会把获得的自增ID set 到对象里,如自动 set 到 user 对象的 id 属性里,而非通过返回值获得ID或ID列表。
1.实体类 User.java
2. UserMapper.java
3.UserMapper.xml
主要关注 useGeneratedKeys="true" keyColumn="id" keyProperty="id"
batchInsert 方法执行完毕后, userList 中每个 user 对象的id都被赋值了,且其值和数据库的id一致。
关于这个批量导入返回id列表需要注意以下几点
这里为了提供一个简单的示例,以批量插入用户为例
代码地址:https://github.com/saysky/sensboot
先说下原理
批量插入返回自增ID列表和普通插入返回自增ID是一样的,通常只需要在 mapper.xml 的 <insert> 上添加属性 useGeneratedKeys="true" keyProperty="id" 就能实现插入成功后,mybatis 会把获得的自增ID set 到对象里,如自动 set 到 user 对象的 id 属性里,而非通过返回值获得ID或ID列表。
一、代码如下
1.实体类 User.java
- package com.liuyanzhao.sens.entity;
- import lombok.Data;
- import java.io.Serializable;
- import java.util.Date;
- /**
- * <pre>
- * 用户信息
- * </pre>
- *
- * @author : saysky
- * @date : 2017/11/14
- */
- @Data
- public class User implements Serializable {
- private static final long serialVersionUID = -5144055068797033748L;
- /**
- * 编号,自增
- */
- private Long id;
- /**
- * 用户名
- */
- private String username;
- /**
- * 显示名称
- */
- private String nickname;
- /**
- * 密码
- */
- private String password;
- /**
- * 邮箱
- */
- private String email;
- /**
- * 头像
- */
- private String avatar;
- /**
- * 0 正常
- * 1 禁用
- * 2 已删除
- */
- private Integer status = 0;
- /**
- * 创建时间
- */
- private Date createdTime;
- /**
- * 创建人用户名
- */
- private String createdBy;
- /**
- * 更新时间
- */
- private Date updatedTime;
- /**
- * 更新人用户名
- */
- private String updatedBy;
- public User() {
- }
- public User(String username, String nickname, String password, String email, String avatar, Integer status, Date createdTime, String createdBy, Date updatedTime, String updatedBy) {
- this.username = username;
- this.nickname = nickname;
- this.password = password;
- this.email = email;
- this.avatar = avatar;
- this.status = status;
- this.createdTime = createdTime;
- this.createdBy = createdBy;
- this.updatedTime = updatedTime;
- this.updatedBy = updatedBy;
- }
- }
2. UserMapper.java
- package com.liuyanzhao.sens.mapper;
- import com.liuyanzhao.sens.entity.User;
- import org.apache.ibatis.annotations.Mapper;
- import java.util.List;
- /**
- * @author liuyanzhao
- */
- @Mapper
- public interface UserMapper {
- /**
- * 批量插入
- * @param users
- */
- void batchInsert(List<User> users);
- }
3.UserMapper.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.liuyanzhao.sens.mapper.UserMapper">
- <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
- INSERT INTO `user`
- (
- username, nickname, password, email,
- avatar, status, created_time, created_by,
- updated_time, updated_by
- )
- VALUES
- <foreach collection="list" item="item" separator=",">
- (
- #{item.username}, #{item.nickname}, #{item.password}, #{item.email},
- #{item.avatar}, #{item.status}, #{item.createdTime}, #{item.createdBy},
- #{item.updatedTime}, #{item.updatedBy}
- )
- </foreach>
- </insert>
- </mapper>
主要关注 useGeneratedKeys="true" keyColumn="id" keyProperty="id"
二、测试类
- package com.liuyanzhao.sens.mapper;
- import com.liuyanzhao.sens.entity.User;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.test.context.junit4.SpringRunner;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.stream.Collectors;
- /**
- * @author 言曌
- * @date 2020-01-01 16:10
- */
- @SpringBootTest
- @RunWith(SpringRunner.class)
- public class UserMapperTest {
- @Autowired
- private UserMapper userMapper;
- /**
- * 测试批量插入返回自动ID列表
- */
- @Test
- public void batchInsert() {
- Date now = new Date();
- List<User> userList = new ArrayList<>();
- User user = new User("zhangsan", "张三", "111111", "zhangsan@123.com", "", 1, now, "system", now, "system");
- User user2 = new User("lisi", "李四", "111111", "lisi@123.com", "", 1, now, "system", now, "system");
- User user3 = new User("wangwu", "王五", "111111", "wangwu@123.com", "", 1, now, "system", now, "system");
- User user4 = new User("liliu", "李六", "111111", "liliu@123.com", "", 1, now, "system", now, "system");
- User user5 = new User("chenqi", "陈七", "111111", "chenqi@123.com", "", 1, now, "system", now, "system");
- userList.add(user);
- userList.add(user2);
- userList.add(user3);
- userList.add(user4);
- userList.add(user5);
- userMapper.batchInsert(userList);
- // 获得ID列表
- List<Long> userIdList = userList.stream().map(p -> p.getId()).collect(Collectors.toList());
- System.out.println(userIdList);
- }
- }
batchInsert 方法执行完毕后, userList 中每个 user 对象的id都被赋值了,且其值和数据库的id一致。
三、需要注意
关于这个批量导入返回id列表需要注意以下几点
- 确保 mybatis 版本在 3.3.1 以上
- batchInsert 方法上不能加 @param()
- batchInsert 方法只能一个参数
- batchInsert 返回值为 Integer 或 void,不能写 List
- 如果你的自增id数据库字段和实体类属性不一致,如 user_id 和 userId, 需要写成useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId"
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏