MyBatis如何获取新插入数据主键?
插入一条数据到之后,我们总是想用这条新纪录的ID做点别的事情,但大量的现实告诉我们新增修改删除方法返回值永远都是受到影响的行数!并且有的土豪公司用的可能不是MySql,或许是Oracle呢?Oracle数据库可是没有自增主键的说法,人家是通过序列获值的方法作为该新增记录的主键。那么我们该如何获取到数据主键呢?
1、MySql中获取数据库主键的两种方式
1.1、使用useGenerateKey的方式
底层用的是
JDBC
的getGenerateKeys()
方法来取出数据库内部生成的主键
<!--新增用户-使用useGenerateKey得到用户主键-->
<insert id="insert2" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
insert into sys_user(
user_name,
user_password,
user_email,
user_info,
head_img,
create_time
)
values(
#{userName},
#{userPassword},
#{userEmail},
#{userInfo},
#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
)
</insert>
1.2、使用使用selectKey的方式
这种方式适合用于不提供主键自增功能的数据库,也适用于提供了主键自增功能的数据库
<!--新增用户-使用selectKey的方式-->
<insert id="insert3">
insert into sys_user(
user_name,
user_password,
user_email,
user_info,
head_img,
create_time
)
values(
#{userName},
#{userPassword},
#{userEmail},
#{userInfo},
#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
)
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
2、针对Oracle数据库获取主键的方式
order=“BEFORE”,因为Oracle是先通过序列得到值,直接把值插入到数据库,必须在插入
Sql
执行之前把这个主键拿到手!
<!--新增用户-使用selectKey的方式-->
<insert id="insert3">
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE">
SELECT SQE_ID.mextval from dual
</selectKey>
insert into sys_user(
user_name,
user_password,
user_email,
user_info,
head_img,
create_time
)
values(
#{userName},
#{userPassword},
#{userEmail},
#{userInfo},
#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
)
</insert>
3、其他数据库获取主键的方式
观察
MySql
和Oracle
的变化得知,SelectKey
标签是一个通用的方法,适用于各种数据库。只需修改里面不同查询主键的语句即可!
列举一些可以数据库回写主键的SQL
DB2 VALUES IDENTITY_VAL_LOCAL()
SQLSERVER SELECT SCOPE_IDENTITY()
CLOUDSCAPE VALUES IDENTITY_VAL_LOCAL()