0
点赞
收藏
分享

微信扫一扫

mybatis insert返回主键的三种方式

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>

执行插入前:

mybatis insert返回主键的三种方式_MYBATIS

执行插入后:

mybatis insert返回主键的三种方式_MYBATIS_02

我们可以看到:

执行插入后,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);

插入前:

mybatis insert返回主键的三种方式_MYBATIS_03

插入后:

mybatis insert返回主键的三种方式_MYBATIS_04

 

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);

方式三:只适用于MYSQL

<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>

说明:

useGeneratedKeys:默认值为false;

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

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

方式四:只适用于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);

 

写在最后

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




举报

相关推荐

0 条评论