Mybatis新增数据并返回主键id的两种方法实现

 更新时间:2025年02月12日 10:33:07   作者:爱吃蜂蜜的王  
本文主要介绍了Mybatis新增数据并返回主键id的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

我们在开发过程中有时可能会有这样的场景,新增数据并返回新增行的主键id值,这个场景很简单,常规操作是在新增数据成功后,在访问数据库查询一次,这样虽然能解决问题,但是写在业务中感觉怪怪的,其实在Mybatis中,它就考虑到了这个场景,那下面我们就展开讲解哈。

注意:useGeneratedKeys 可以设置全局配置项开启,建议不全局开启,那个地方使用就在那地方手动配置。

keyProperty 属性必须开发者处理,且要么都是基于XML配置,要么都是注解(@Insert+@Options),不能XML与注解混用。

一、常规使用(具有自增主键的数据库)

1、基于配置(XML)

a)在mapper.xml配置中<insert> 标签中添加两个属性。

  • useGeneratedKeys:开启返回主键id
  • keyProperty:指定主键id值存放属性

b)配置文件详解

    <!--新增用户-->
    <insert id="saveUpdate" useGeneratedKeys="true" keyProperty="id">
        insert into d_user(id, user_name, age, gender)
        values (#{user.id}, #{user.userName}, #{user.age}, #{user.gender})
        ON DUPLICATE KEY UPDATE
        user_name = values(user_name),
        age = values(age),
        gender = values(gender)
    </insert>

 c)测试

注意:返回值(keyProperty值)是放入在参数对象的属性中。

可以关注新增数据前id属性未有值。

新增成功后,可以看到对象中的id属性已经返回了数据库的主键id,与数据库的id比对的上。

2、基于注解(annotation)

a)需要添加@Options注解,注解中在配置useGeneratedKeys与keyProperty属性即可。

  • useGeneratedKeys:开启返回主键id
  • keyProperty:指定主键id值存放属性

b)详细配置

    /**
     * 新增用户
     *
     * @param user 用户信息
     */
    @Insert("<script>" +
            " insert into d_user(id, user_name, age, gender)\n" +
            "        values (#{user.id}, #{user.userName}, #{user.age}, #{user.gender})\n" +
            "        ON DUPLICATE KEY UPDATE\n" +
            "        user_name = values(user_name),\n" +
            "        age = values(age),\n" +
            "        gender = values(gender)" +
            "</script>")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void saveUpdate(@Param("user") User user);

 c)测试

注意:返回值(keyProperty值)是放入在参数对象的属性中。

可以看到未操作数据库时,id属性值为空:

新增成功后,已经将结果返回。

二、自定义使用

所谓的自定义使用时Mybatis官方对外提供的一些没有自增主键的数据库而生成的一种方式。例如,Oracle数据库就没有自增情况,所以需要自定义来获取。

注意:keyPropety属性必须采用insert表中的id的别名。具体的可看下面截图。

1、基于配置

a)在mapper.xml配置中<insert> 标签中添加<selectKey>标签。

# mysql
 <selectKey keyProperty="id"  order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID();
 </selectKey>
# oracel
 <selectKey keyProperty="id"  order="AFTER" resultType="int">
            SELECT 数据表.NEXTVAL;
 </selectKey>

b)selectKey标签属性讲解

  • keyProperty:存放执行SQL的结果属性。
  • databaseId:指定数据库id。例如:oracle
  • order:执行在insert语句之前还是之后,参数值:AFTER, BEFORE。
  • resultType:结果类型。
  • statementType:指定SQL语句的类型,默认为STATEMENT,也可以设置为PREPARED。

c)Mysql测试

2、基于注解

a)需要添加@SelectKey注解。

  • keyProperty:存放执行SQL的结果属性。
  • databaseId:指定数据库id。例如:oracle
  • order:执行在insert语句之前还是之后,参数值:AFTER, BEFORE。
  • resultType:结果类型。

b)具体配置

@Insert("<script>" +
            " insert into d_user(id, user_name, age, gender)\n" +
            "        values (#{user.id}, #{user.userName}, #{user.age}, #{user.gender})\n" +
            "        ON DUPLICATE KEY UPDATE\n" +
            "        user_name = values(user_name),\n" +
            "        age = values(age),\n" +
            "        gender = values(gender)" +
            "</script>")
// Mysql配置
    @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "user.id", resultType = Integer.class, before = false)
// Oracle配置
 @SelectKey(statement = "SELECT 数据表.NEXTVAL;", keyProperty = "user.id", resultType = Integer.class, before = false)

c)测试

  d)总结

使用@SelectKey注解时,要谨慎,对于keyProperty与before的配合使用需要仔细调试,避免出现问题。 

到此这篇关于Mybatis新增数据并返回主键id的实现的文章就介绍到这了,更多相关Mybatis新增数据返回主键id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot Kafka 整合使用及安装教程

    SpringBoot Kafka 整合使用及安装教程

    这篇文章主要介绍了SpringBoot Kafka 整合使用及安装教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • SpringBoot项目使用slf4j的MDC日志打点功能(最新推荐)

    SpringBoot项目使用slf4j的MDC日志打点功能(最新推荐)

    这篇文章主要介绍了SpringBoot项目使用slf4j的MDC日志打点功能,本文通过示例代码给大家介绍非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 解决scala.collection.mutable.Map写入的问题

    解决scala.collection.mutable.Map写入的问题

    这篇文章主要介绍了解决scala.collection.mutable.Map写入的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring Cloud Ribbon 中的 7 种负载均衡策略的实现方法

    Spring Cloud Ribbon 中的 7 种负载均衡策略的实现方法

    Ribbon 内置了 7 种负载均衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域性敏感策略,并且用户可以通过继承 RoundRibbonRule 来实现自定义负载均衡策略,对Spring Cloud Ribbon负载均衡策略相关知识感兴趣的朋友一起看看吧
    2022-03-03
  • SpringCloud 如何提取公共配置

    SpringCloud 如何提取公共配置

    这篇文章主要介绍了SpringCloud 提取公共配置的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java线程池实战应用步骤详解

    java线程池实战应用步骤详解

    这篇文章主要介绍了java线程池实战应用小结,包括线程池的创建方式,本文给大家分享两种方式,结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2025-04-04
  • java实现邮件发送

    java实现邮件发送

    这篇文章主要为大家详细介绍了java实现邮件发送,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Java ConcurrentHashMap的源码分析详解

    Java ConcurrentHashMap的源码分析详解

    ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构,想对于普通的HashMap,CHM提供了线程安全的读写,CHM里面使用了许多比较精妙的优化&操作。本文主要对CHM的整体结构、初始化,查找,插入等做分析
    2023-03-03
  • 教你bat脚本一键配置java开发环境

    教你bat脚本一键配置java开发环境

    公司新入职一名员工,项目经理让我安排新人工作,首先需要对java开发相关环境进行配置安装,但时常会因为安装配置不到位或者操作错误导致时间的浪费,所以在空余时间收集了一系列软件的免安装版本,感兴趣的朋友一起看看吧
    2021-12-12
  • maven快速生成SpringBoot打包文件的方法步骤

    maven快速生成SpringBoot打包文件的方法步骤

    本文主要介绍了使用Maven快速生成SpringBoot项目打包文件的方法,包括如何生成可执行的JAR文件,如何将配置文件、运行脚本、调试脚本、证书文件等拷贝到指定目录,及如何编译出部署包,这种方法能大大方便微服务的部署,提高部署效率
    2024-10-10

最新评论