java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Mybatis新增数据返回主键id

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

作者:爱吃蜂蜜的王

本文主要介绍了Mybatis新增数据并返回主键id的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

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

1、基于配置(XML)

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

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属性即可。

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标签属性讲解

c)Mysql测试

2、基于注解

a)需要添加@SelectKey注解。

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

您可能感兴趣的文章:
阅读全文