MyBatis批量插入返回自增ID列表

avatar 2020年1月1日17:26:28 评论 36 views
广告也精彩

最近使用 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

  1. package com.liuyanzhao.sens.entity;
  2. import lombok.Data;
  3. import java.io.Serializable;
  4. import java.util.Date;
  5. /**
  6.  * <pre>
  7.  *     用户信息
  8.  * </pre>
  9.  *
  10.  * @author : saysky
  11.  * @date : 2017/11/14
  12.  */
  13. @Data
  14. public class User implements Serializable {
  15.     private static final long serialVersionUID = -5144055068797033748L;
  16.     /**
  17.      * 编号,自增
  18.      */
  19.     private Long id;
  20.     /**
  21.      * 用户名
  22.      */
  23.     private String username;
  24.     /**
  25.      * 显示名称
  26.      */
  27.     private String nickname;
  28.     /**
  29.      * 密码
  30.      */
  31.     private String password;
  32.     /**
  33.      * 邮箱
  34.      */
  35.     private String email;
  36.     /**
  37.      * 头像
  38.      */
  39.     private String avatar;
  40.     /**
  41.      * 0 正常
  42.      * 1 禁用
  43.      * 2 已删除
  44.      */
  45.     private Integer status = 0;
  46.     /**
  47.      * 创建时间
  48.      */
  49.     private Date createdTime;
  50.     /**
  51.      * 创建人用户名
  52.      */
  53.     private String createdBy;
  54.     /**
  55.      * 更新时间
  56.      */
  57.     private Date updatedTime;
  58.     /**
  59.      * 更新人用户名
  60.      */
  61.     private String updatedBy;
  62.     public User() {
  63.     }
  64.     public User(String username, String nickname, String password, String email, String avatar, Integer status, Date createdTime, String createdBy, Date updatedTime, String updatedBy) {
  65.         this.username = username;
  66.         this.nickname = nickname;
  67.         this.password = password;
  68.         this.email = email;
  69.         this.avatar = avatar;
  70.         this.status = status;
  71.         this.createdTime = createdTime;
  72.         this.createdBy = createdBy;
  73.         this.updatedTime = updatedTime;
  74.         this.updatedBy = updatedBy;
  75.     }
  76. }

 

2. UserMapper.java

  1. package com.liuyanzhao.sens.mapper;
  2. import com.liuyanzhao.sens.entity.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import java.util.List;
  5. /**
  6.  * @author liuyanzhao
  7.  */
  8. @Mapper
  9. public interface UserMapper  {
  10.     /**
  11.      * 批量插入
  12.      * @param users
  13.      */
  14.     void batchInsert(List<User> users);
  15. }

 

3.UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.liuyanzhao.sens.mapper.UserMapper">
  4.     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
  5.         INSERT INTO `user`
  6.         (
  7.             username, nickname, password, email,
  8.             avatar, status, created_time, created_by,
  9.             updated_time, updated_by
  10.         )
  11.         VALUES
  12.         <foreach collection="list" item="item" separator=",">
  13.         (
  14.             #{item.username}, #{item.nickname}, #{item.password}, #{item.email},
  15.             #{item.avatar},  #{item.status},  #{item.createdTime},  #{item.createdBy},
  16.             #{item.updatedTime},  #{item.updatedBy}
  17.         )
  18.         </foreach>
  19.     </insert>
  20. </mapper>

主要关注  useGeneratedKeys="true" keyColumn="id" keyProperty="id"

 

二、测试类

  1. package com.liuyanzhao.sens.mapper;
  2. import com.liuyanzhao.sens.entity.User;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. import java.util.ArrayList;
  9. import java.util.Date;
  10. import java.util.List;
  11. import java.util.stream.Collectors;
  12. /**
  13.  * @author 言曌
  14.  * @date 2020-01-01 16:10
  15.  */
  16. @SpringBootTest
  17. @RunWith(SpringRunner.class)
  18. public class UserMapperTest {
  19.     @Autowired
  20.     private UserMapper userMapper;
  21.     /**
  22.      * 测试批量插入返回自动ID列表
  23.      */
  24.     @Test
  25.     public void batchInsert() {
  26.         Date now = new Date();
  27.         List<User> userList = new ArrayList<>();
  28.         User user = new User("zhangsan""张三""111111""zhangsan@123.com"""1, now, "system", now, "system");
  29.         User user2 = new User("lisi""李四""111111""lisi@123.com"""1, now, "system", now, "system");
  30.         User user3 = new User("wangwu""王五""111111""wangwu@123.com"""1, now, "system", now, "system");
  31.         User user4 = new User("liliu""李六""111111""liliu@123.com"""1, now, "system", now, "system");
  32.         User user5 = new User("chenqi""陈七""111111""chenqi@123.com"""1, now, "system", now, "system");
  33.         userList.add(user);
  34.         userList.add(user2);
  35.         userList.add(user3);
  36.         userList.add(user4);
  37.         userList.add(user5);
  38.         userMapper.batchInsert(userList);
  39.         // 获得ID列表
  40.         List<Long> userIdList = userList.stream().map(p -> p.getId()).collect(Collectors.toList());
  41.         System.out.println(userIdList);
  42.     }
  43. }

batchInsert 方法执行完毕后, userList 中每个 user 对象的id都被赋值了,且其值和数据库的id一致。

 

三、需要注意

关于这个批量导入返回id列表需要注意以下几点

  1. 确保 mybatis 版本在 3.3.1 以上
  2. batchInsert 方法上不能加 @param()
  3. batchInsert 方法只能一个参数
  4. batchInsert 返回值为 Integer 或 void,不能写 List
  5. 如果你的自增id数据库字段和实体类属性不一致,如 user_id 和 userId, 需要写成useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId"
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: