基于mybatis-plus在mysql数据库和达梦数据库插入数据返回自增主键的探究

背景:

项目要做国产化改造,数据库由mysql切换为达梦数据库,过程中遇到一个问题,批量插入数据后,使用数据自增主键的问题,该逻辑在mysql数据库是能够正常执行的,插入能正常获取数据自增主键,但是在DM数据库中就不能正常执行,数据主键不能获取到。返回自增主键的实现方式使用mybatis的useGeneratedKeys,在mapper.xml文件的对应statement上设置useGeneratedKeys为true。

本文对orm框架与数据库在哪种使用方式下会返回主键进行了探究。

mybatis-plus框架版本及数据库版本:

mybatis-plus:使用spring-boot-starter引入,版本为3.5.6

MySQL: 大版本为8

达梦数据库: 大版本为8

代码:

service:

java 复制代码
@Service
public class UserServiceImpl  extends ServiceImpl<UserMapper, User> implements UserService {
}

mapper:

java 复制代码
@Mapper
public interface UserMapper extends BaseMapper<User> {
    void insertBatch(@Param("users") List<User> users);
}

xml:

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.belizer.mybatisplus.mapper.UserMapper">

    <insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
        insert into "user" (name, age) values
        <foreach collection="users" item="user" index="index" separator=",">
            (#{user.name}, #{user.age})
        </foreach>
    </insert>
</mapper>

测试代码:

xml 复制代码
@Autowired
private UserMapper userMapper;
@Autowired
private UserService userService;

@Test
    public void testInsert() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        user.setEmail("2233@bilibili.com");

        userService.save(user);
        /**
         * 插入后,自动回填id,是默认行为
         */
        System.out.println(user);
    }

    @Test
    public void testInsertBatch() {

        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            User user = new User();
            user.setName("zhangsan" + i);
            user.setAge(18 + i);
            user.setEmail("2233@bilibili.com" + i);
            userList.add(user);
        }

        userService.saveBatch(userList);
        /**
         * 插入后,自动回填id,是默认行为
         */
        System.out.println(userList);
    }

    /**
     * 使用自定义sql 达梦数据库并不能通过设置useGeneratedKeys为true来支持批量插入返回主键
     */
    @Test
    public void testInsertBatch2() {

        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            User user = new User();
            user.setName("zhangsan" + i);
            user.setAge(18 + i);
            user.setEmail("2233@bilibili.com" + i);
            userList.add(user);
        }

        userMapper.insertBatch(userList);
        /**
         * 插入后,自动回填id,是默认行为
         */
        System.out.println(userList);
    }

测试结果:

达梦数据库下的执行情况:

testInsert:

xml 复制代码
User(id=18, name=zhangsan, age=18, email=2233@bilibili.com)

testInsertBatch:

xml 复制代码
[User(id=19, name=zhangsan0, age=18, email=2233@bilibili.com0), User(id=20, name=zhangsan1, age=19, email=2233@bilibili.com1), User(id=21, name=zhangsan2, age=20, email=2233@bilibili.com2), User(id=22, name=zhangsan3, age=21, email=2233@bilibili.com3), User(id=23, name=zhangsan4, age=22, email=2233@bilibili.com4)]

testInsertBatch2:

xml 复制代码
[User(id=null, name=zhangsan0, age=18, email=2233@bilibili.com0), User(id=null, name=zhangsan1, age=19, email=2233@bilibili.com1), User(id=null, name=zhangsan2, age=20, email=2233@bilibili.com2), User(id=null, name=zhangsan3, age=21, email=2233@bilibili.com3), User(id=null, name=zhangsan4, age=22, email=2233@bilibili.com4)]

可以看出使用自定义sql,达梦数据库并不能通过设置useGeneratedKeys为true来支持批量插入返回自增主键,但是使用mybatis-plus实现的saveBatch方法是可以返回自增主键的。

MySQL数据库下的执行情况:

testInsert:

xml 复制代码
User(id=18, name=zhangsan, age=18, email=2233@bilibili.com)

testInsertBatch:

xml 复制代码
[User(id=19, name=zhangsan0, age=18, email=2233@bilibili.com0), User(id=20, name=zhangsan1, age=19, email=2233@bilibili.com1), User(id=21, name=zhangsan2, age=20, email=2233@bilibili.com2), User(id=22, name=zhangsan3, age=21, email=2233@bilibili.com3), User(id=23, name=zhangsan4, age=22, email=2233@bilibili.com4)]

testInsertBatch2:

xml 复制代码
[User(id=1781194760655835141, name=zhangsan0, age=18, email=2233@bilibili.com0), User(id=1781194760655835142, name=zhangsan1, age=19, email=2233@bilibili.com1), User(id=1781194760655835143, name=zhangsan2, age=20, email=2233@bilibili.com2), User(id=1781194760655835144, name=zhangsan3, age=21, email=2233@bilibili.com3), User(id=1781194760655835145, name=zhangsan4, age=22, email=2233@bilibili.com4)]

可以看出使用自定义sql,MySQL数据库能通过设置useGeneratedKeys为true来支持批量插入返回自增主键。

总结:

因为目前项目暂不需要考虑性能问题,可以使用mybatis-plus实现的saveBatch方法。

相关推荐
Victor35638 分钟前
Redis(25)Redis的RDB持久化的优点和缺点是什么?
后端
Victor35640 分钟前
Redis(24)如何配置Redis的持久化?
后端
ningqw8 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友8 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh8 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
一只叫煤球的猫9 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong9 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉10 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
Moment10 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术11 小时前
在我眼里,这就是天才般的算法!
后端·面试