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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除

    这篇文章主要为大家介绍了GC算法实现篇之并发-标记-清除, CMS垃圾收集器在减少停顿时间上做了很多给力的工作, 大量的并发线程执行的工作并不需要暂停应用线程
    2022-01-01
  • java 通过发送json,post请求,返回json数据的方法

    java 通过发送json,post请求,返回json数据的方法

    下面小编就为大家分享一篇java 通过发送json,post请求,返回json数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Java数据结构之红黑树的实现方法和原理详解

    Java数据结构之红黑树的实现方法和原理详解

    这篇文章主要介绍了Java数据结构之红黑树的实现方法和原理,红黑树是一种特殊的二叉查找树,每个结点都要储存位表示结点的颜色,或红或黑,本文将通过示例为大家详细讲讲红黑树的原理及实现,感兴趣的朋友可以了解一下
    2024-02-02
  • 使用Java增删改查数据库的操作方法

    使用Java增删改查数据库的操作方法

    这篇文章主要介绍了使用Java增删改查数据库的操作方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 带你了解mybatis如何实现读写分离

    带你了解mybatis如何实现读写分离

    本篇文章主要介绍了MyBatis实现数据读写分离的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • 解决spring boot环境切换失效的问题

    解决spring boot环境切换失效的问题

    这篇文章主要介绍了解决spring boot环境切换失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springboot静态资源的配置方式

    springboot静态资源的配置方式

    这篇文章主要介绍了springboot静态资源的配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 详解在spring boot中消息推送系统设计与实现

    详解在spring boot中消息推送系统设计与实现

    这篇文章主要介绍了详解在spring boot中消息推送系统设计与实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • springCloud集成nacos启动时报错原因排查

    springCloud集成nacos启动时报错原因排查

    这篇文章主要介绍了springCloud集成nacos启动时报错原因排查,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • java web中的servlet3 upload上传文件实践

    java web中的servlet3 upload上传文件实践

    这篇文章主要介绍了servlet3 upload上传文件实践,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11

最新评论