MyBatis获取新增数据ID的几种方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MyBatis获取新增数据ID的几种方法

参考书籍:MyBatis从入门到精通

该文章以springmybatis项目为基准,可以参照该项目的代码。配置mybatis获取新增数据id的方法有几种,一种是JDBC的方式,一种是使用标签
  • 先看一段没有主键返回的代码,用于和后面有主键返回的代码进行对比。
int insert1(SysUserPo sysUserPo);

<insert id="insert1">
    insert into
      sys_user(id, user_name, user_password, user_email, user_info, head_img, create_time)
    values
      (#{id}, #{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg}, #{createTime})
</insert>

以上代码我们可以看到返回的结果就是int值,但是并不是我们要的数据的id

使用JDBC方式返回主键自增的值

这种方式比较简单,只需要在insert标签上面配置如下两个属性,同时去掉insert语句中间id和#{id}即可。

useGeneratedKeys="true"
keyProperty="id"

完整代码如下:

int insert2(SysUserPo sysUserPo);

<insert id="insert2" useGeneratedKeys="true" keyProperty="id">
    insert into
      sys_user(user_name, user_password, user_email, user_info, head_img, create_time)
    values
      (#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg}, #{createTime})
</insert>
  • 该方式的缺点:

这种方法只能支持主键自增的数据库,如:mysql

useGeneratedKeys设置成为true后,MyBatis会使用JDBC的getGeneratedKeys方法取出由数据库内部生成的主键。获得主键值后将其赋值给keyProperty配置的id属性。

  • 注意:

测试的时候我们可以看到,返回的值是一个int值,该值并不是返回的id,id如上所说是赋值到了keyProperty配置的id属性当中,也就是我们传入的对象里面。

使用selectKey返回主键的值

使用selecKey相对来说会复杂一点,需要针对不同的数据库来进行设置。可以先看看项目里面代码(mysql数据库)

int insert3(SysUserPo sysUserPo);

<insert id="insert3">
    insert into
      sys_user(user_name, user_password, user_email, user_info, head_img, create_time)
    values
      (#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg}, #{createTime})
    <selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>

和最开始的代码进行对比我们可以看到新增了selectKey标签。

<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>

selectKey标签中几个属性的解释

  • keyColumn:库中对应的id列
  • keyProperty:赋值对应的对象属性
  • resultType:用于设置返回值类型
  • order比较特殊,它的设置是根据数据库相关的。在MySQL数据库中,order="AFTER"。在Oracle数据库中,order="BEFORE"。
order的配置after和before是根据数据库的主键生成策略来决定的,mysql的自增策略会让insert执行成功之后才能得到id,oracle使用的是序列,插入数据到oracle需要先从序列获取值,然后才会将数据库插入数据库中。

使用selectKey获取插入Oracle数据库的数据id,示例如下:

int insert4(SysUserPo sysUserPo);

<insert id="insert4">
    <selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE">
        SELECT SEQ_ID.nextval from dual
    </selectKey>
    insert into
    sys_user(user_name, user_password, user_email, user_info, head_img, create_time)
    values
    (#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg}, #{createTime})
</insert>

其他一些支持主键自增的数据库配置selectKey中回写主键的SQL

  • DB2使用 VALUES IDENTITY_VAL_LOCAL()
  • MYSQL使用 SELECT LAST_INSERT_ID()
  • SQLSERVER使用 SELECT SCOPE_IDENTITY()
  • CLOUDSCAPE使用 VALUES IDENTITY_VAL_LOCAL()
  • DERBY使用 VALUES IDENTITY_VAL_LOCAL()
  • HSQLDB使用 CALL IDENTITY()
  • SYBASE使用 SELECT @@IDENTITY
  • DB2_MF使用 SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
  • INFORMIX使用 select dbinfo('sqlca.sqlerrd1') from systables where tabid=1

做一个有底线的博客主

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
158 8
|
29天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
49 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
3月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
248 1
|
3月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
3月前
|
SQL Java 关系型数据库
MyBatis-Plus 分页魅力绽放!紧跟技术热点,带你领略数据分页的高效与便捷
【8月更文挑战第29天】在 Java 开发中,数据处理至关重要,尤其在大量数据查询与展示时,分页功能尤为重要。MyBatis-Plus 作为一款强大的持久层框架,提供了便捷高效的分页解决方案。通过封装数据库分页查询语句,开发者能轻松实现分页功能。在实际应用中,只需创建 `Page` 对象并设置页码和每页条数,再通过 `QueryWrapper` 构建查询条件,调用 `selectPage` 方法即可完成分页查询。MyBatis-Plus 不仅生成分页 SQL 语句,还自动处理参数合法性检查,并支持条件查询和排序等功能,极大地提升了系统性能和稳定性。
53 0
|
3月前
|
存储 SQL Java
MyBatis batchInsert 批量插入数据
MyBatis batchInsert 批量插入数据
73 0
|
3月前
|
前端开发 JavaScript Java
解决springboot+vue+mybatis中,将后台数据分页显示在前台,并且根据页码自动跳转对应页码信息
该博客文章讲述了如何在Spring Boot + Vue + MyBatis的项目中实现后台数据的分页查询,并在前端进行显示和页码跳转,包括后端的分页查询实现、前端与后端的交互以及使用Element UI进行分页展示的方法。
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法