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

文章讲述了在将项目从MySQL切换到达梦数据库的过程中,如何在mybatis-plus框架中处理批量插入数据时主键自增的问题。作者发现,虽然在MySQL中useGeneratedKeys设置为true可以正常获取自增主键,但在达梦数据库中不生效,需注意在达梦环境下选择其他方式实现主键生成。
部署运行你感兴趣的模型镜像

背景:

项目要做国产化改造,数据库由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方法。

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

Mybatis Plus XML 插入数据返回主键 ID 在不同数据库中存在差异,具体如下: ### 数据库对自主键的支持情况 不同数据库对自主键的支持机制不同。例如 MySQL 支持自主键,其通过 `AUTO_INCREMENT` 关键字实现,在插入数据时,数据库会自动为该字段生成一个唯一的递数值。而 Oracle 传统上不支持自主键,一般通过序列(Sequence)触发器(Trigger)来模拟自主键的功能。PostgreSQL 则使用 `SERIAL` 或 `BIGSERIAL` 数据类型来实现自主键的功能。 ### 返回主键的实现方式 - **MySQL**:可以使用 MyBatis 的 `useGeneratedKeys` 属性来返回主键。在 mapper.xml 文件的对应 `insert` 标签上设置 `useGeneratedKeys="true"`,并通过 `keyProperty` 指定数据库主键对应的实体类属性,将自主键赋值给传入的实体类参数。示例代码如下: ```xml <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="TbUser"> INSERT INTO tb_user SET <if test="name!=null"> name = #{name}, </if> <if test="sex!=null"> sex = #{sex}, </if> <if test="tel!=null"> tel = #{tel}, </if> <if test="email!=null"> email = #{email}, </if> create_time = #{createTime} </insert> ``` 插入并获取自主键值: ```java // 插入 userDao.insert(tbUser); // tbUser.getId() 获取到自主键值 System.out.println(tbUser.getId()); ``` - **Oracle**:由于 Oracle 不直接支持自主键,通常需要使用序列触发器来实现类似功能。在 MyBatis 中,可以通过 `selectKey` 标签来获取序列生成的主键值。示例代码如下: ```xml <insert id="insert" parameterType="TbUser"> <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE"> SELECT your_sequence.NEXTVAL FROM DUAL </selectKey> INSERT INTO tb_user (id, name, sex, tel, email, create_time) VALUES (#{id}, #{name}, #{sex}, #{tel}, #{email}, #{createTime}) </insert> ``` - **PostgreSQL**:与 MySQL 类似,也可以使用 `useGeneratedKeys` 属性来返回主键。示例代码如下: ```xml <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="TbUser"> INSERT INTO tb_user (name, sex, tel, email, create_time) VALUES (#{name}, #{sex}, #{tel}, #{email}, #{createTime}) </insert> ``` ### 批量插入时的差异 在批量插入数据时,不同数据库的处理方式也有所不同。例如,在 MySQL 中可以使用 `useGeneratedKeys` 一次性获取所有插入记录的自主键;而在某些数据库中,可能需要逐行插入并分别获取主键,或者使用其他特定的方法来处理。 ### 性能兼容性问题 不同数据库在处理自主键返回时的性能也可能存在差异。一些数据库可能在高并发插入时对自主键的处理效率较低,需要进行性能优化。此外,不同数据库的驱动版本 MyBatis Plus 版本之间的兼容性也可能会影响自主键返回功能。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值