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>
说明:
标签的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(MapString, 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(MapString, 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(MapString, Object> userMap);
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
作者:Marydon