mybatis insert返回主键的4种方式

1.情景展示

我们知道,表与表之间的关联关系,通常使用主键,所以在处理复杂业务时,比如:按顺序插入多张表;

我们就需要在插入B表之间拿到插入A表后的主键,如何实现?

2.具体实现

方式一:使用selectKey

ORCLE

<insert id="insertJkdaUser" parameterType="hashmap">
    <selectKey keyProperty="id" resultType="Long" order="BEFORE">
        SELECT SEQ_JKDA_USER.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)
    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE,jdbcType=VARCHAR})
</insert>

执行插入前:

执行插入后:

我们可以看到:

执行插入后,hashmap当中增加了一个新的key"id",这个就是插入该行数据的主键。

MYSQL

<insert id="insertJkdaUser" parameterType="hashmap">
    INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)
    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})
    <selectKey keyProperty="id" resultType="Long" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>

说明:

<selectKey>标签的order属性默认值为:BEFORE,所以,如果不声明的话,是在执行insert语句之前,拿到主键;

AFTER,代表的是:执行insert之后,获取主键。

Oracle需要在插入之前,通过序列确定主键;

因为mysql主键有自增特性,所以我们只有在插入之后,才能拿到主键。

方式二:使用@Insert+@SelectKey

ORACLE

@Insert("INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)" +
        "    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE,jdbcType=VARCHAR})")
@SelectKey(statement = "SELECT SEQ_JKDA_USER.NEXTVAL FROM DUAL",
            keyProperty = "id",
            resultType = Long.class,
            before = true
            )
Integer insertJkdaUser(Map<String, Object> userMap);

插入前:

插入后:

 

MYSQL

@Insert("INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)" +
        "    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()",
            keyProperty = "id",
            resultType = Long.class,
            before = false
            )
Integer insertJkdaUser3(Map<String, Object> userMap);

方式三:userGenerateKeys

<insert id="insertJkdaUser" parameterType="hashmap" keyProperty="id" useGeneratedKeys="true">
    INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)
    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})
</insert>

说明:

这种方式只适用于MYSQL(当然,如果Oracle调用guid()方法来生成主键的话,即主键的默认值设置成guid,也是可以使用这种方式的)

useGeneratedKeys:默认值为false;

设置为true之后,mybatis会使用JDBC的getGeneratedKeys()方法取出来由数据库内部生成的主键;

获得到主键后将其赋值给keyProperty配置的id属性。

方式四:使用@Insert+@Options

说明:这种方法同样只适用于mysql。

@Insert("INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)" +
        "    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})")
@Options(useGeneratedKeys = true, keyProperty = "id")
Integer insertJkdaUser2(Map<String, Object> userMap);

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2022-06-08 11:30  Marydon  阅读(12830)  评论(0编辑  收藏  举报