对于新insert至数据库的记录,常有需求要获取该记录自动生成的主键。
我们使用mybatis框架,对于mysql的使用很简单,博主们都写烂了,大家可以自行百度。
对于Oracle,我也是在网上查了很久,才找到好用的。
而且注意到,有以下两种方式(本文用的是第二种):
- 序列
- SYS_GUID()
核心都是通过@SelectKey + @Options注解来完成在执行insert操作之前,生成主键,并将主键的值保存至keyProperty指定的变量中。
序列方式
@SelectKey(keyProperty = "id", resultType = String.class, before = true,
statement = "SELECT 序列名.NEXTVAL FROM DUAL")
@Options(keyProperty = "id", useGeneratedKeys = true)
@Insert("insert into role values(#{id},#{description},#{isPublic},#{name},#{valid},#{isInTernal})")
void addRole(Role role);
序列名.nextval代表着序列的下一个值.
SYS_GUID()方式
@SelectKey(keyProperty = "id", resultType = String.class, before = true,
statement = "select SYS_GUID() as id from DUAL")
@Options(keyProperty = "id", useGeneratedKeys = true)
@Insert("insert into role values(#{id},#{description},#{isPublic},#{name},#{valid},#{isInTernal})")
void addRole(Role role);
运行日志
RoleMapper.addRole!selectKey : ==> Preparing: select SYS_GUID() as id from DUAL
RoleMapper.addRole!selectKey : ==> Parameters:
RoleMapper.addRole!selectKey : <== Total: 1
RoleMapper.addRole : ==> Preparing: insert into role values(?,?,?,?,?,?)
RoleMapper.addRole : ==> Parameters: 9BF354CC120F9D81E0531A00A8C065C0(String), 测试04(String), 1(Integer), test04(String), 1(Integer), 0(Integer)
RoleMapper.addRole : <== Updates: 1
可以看到,在执行insert语句之前,先执行了selectKey操作,获取自动生成的主键。
本文参考:https://blog.csdn.net/sdzhangshulong/article/details/50729827