项目中,通过mybatis对数据库进行insert插入数据库时,一般成功插入后返回int类型的插入数据条数(一般为1),但是有时候需要这新增数据的主键,以便后续其他数据需要使用,若是再重新查数据库,效率变低了
可以使用selectKey,mybatis可以将insert的数据的主键返回,直接拿到新增数据的主键
当然也可以使用<insert id="insert" parameterType="xx" useGeneratedKeys="true" keyProperty="id">
<insert id="insertAndgetkey" >
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into ......
</insert>
selectKey会将 SELECT LAST_INSERT_ID()的结果放入到传入的 table主键对应的POJO属性里面,
keyProperty 对应的table中的主键的对应的属性名,
order="AFTER"表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用在主键自增
order="BEFORE "表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这种适合那种主键不是自增的类型
resultType指定 SELECTLAST_INSERT_ID() 的结果类型
SELECT LAST_INSERT_ID() 即为获取最后插入的ID值,也就是将插入table数据的主键返回到 POJO 对象中
如果没有参数,则LAST_INSERT_ID()返回一个BIGINT UNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语句而成功为列添加的第一个自动生成的值。LAST_INSERT_ID()如果没有成功插入行,则值保持不变。
如果前一个语句返回错误,则值为 LAST_INSERT_ID()undefined。对于事务表,如果语句由于错误而回滚,则值为 LAST_INSERT_ID()undefined。对于手动 ROLLBACK,其值LAST_INSERT_ID() 不会恢复到事务之前的值; 它仍然保持原样 ROLLBACK。
如果将一行的AUTO_INCREMENT列设置为非“magic”值(即非NULL且非0的值),则LAST_INSERT_ID()的值不会改变。
如果使用一条insert语句插入多行,LAST_INSERT_ID()只返回为第一个插入的行生成的值。这样做的原因是可以在其他服务器上轻松复制相同的INSERT语句。
--------------------------------------------------------------------------
mysql> USE test;
mysql> CREATE TABLE t (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL
);
mysql> INSERT INTO t VALUES (NULL, 'Bob');
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
+----+------+
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
mysql> INSERT INTO t VALUES
(NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
| 2 | Mary |
| 3 | Jane |
| 4 | Lisa |
+----+------+
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 2 |
+------------------+
--------------------------------------------------------------------------------
尽管第二个INSERT语句将三个新行插入到t中,但是为第一行生成的ID是2,并且LAST_INSERT_ID()为下面的SELECT语句返回了这个值。
参考:https://blog.csdn.net/Soinice/article/details/88845898
mysql API https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id