- 通过insert into ... select...插入数据并且返回自增主键
数据库:Oracle
Mybatis注解方式
通过@SelectKey注解查询主键自增后的序列,并将其返回,代码如下:
@Insert("insert into sys_user (username, usercode) select username, usercode from sys_user where id = 2")
@SelectKey(statement = "SELECT USER_ID_SEQ.CURRVAL FROM dual", keyColumn = "id", keyProperty = "id", resultType = Long.class, before = false)
int insertcopy(UserVo userVo);
注意:在默认的事物隔离级别下,insert into sys_a select * from sys_b where create_time < '2020-08-06 00:00:00'的加锁规则是:sys_a表锁,sys_b逐步锁(扫描一个锁一个),所以必须给查询的条件添加索引,这样就不会锁全表,只会锁符合条件的记录。例如:insert into sys_a select * from sys_b force index (idx_create_time) where create_time < '2020-08-06 00:00:00'
before = false相当于XML中的order="AFTRE",这是MySql数据库的配置。
before = true相当于XML中的order="BEFORE",这是Oracle数据库的配置。
XML文件的方式写法如下:
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
注意:不同的数据库statement的值会不同,需要根据实际情况修改
SELECT LAST_INSERT_ID()是mysql的函数。
- 通过insert into...values...方式插入返回主键
@Insert({"INSERT INTO sys_user(username, usercode) VALUES (#{username},#{usercode})"})
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(UserVo userVo);