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);
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/16355065.html