获取自增主键的值
MySql 的主键是支持自增的。在某些场景下,我们在对于一条数据插入之后,需要获得对应自增之后的 id 值,但是如果在通过其他属性(姓名、年龄等属性)在查找一次很麻烦。MyBatis 为我们提供了一个很好的实现方法
修改我们的映射文件,参考如下
<insert id="insertEmp" keyColumn="emp_id"
keyProperty="empId" useGeneratedKeys="true">
insert into emp(emp_name,emp_mail,emp_gender,dept_id)
values(#{empName},#{empMail},#{empGender},#{deptId})
</insert>
- keyColumn :数据表中的主键列名
- keyProperty:对应主键实体类的属性名
- useGenerateKeys:调用 JDBC 的 getGeneratedKeys 方法获取数据库内部生成的主键。(像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段)默认 false
- 以上三个只能用于 insert 和 update
获取非自增主键的值
上面是基于能够自增主键的,但是对于 Oracle 数据库来说,是不支持自增主键 Id 的值,那么如何获取?
Oracle 的主键自增,是通过序列完成的。
- 首先,创建序列,并自增一个且查询值
create sequence seq_2020721;
select seq_2020721.nextval from dual; -- 查询下一个值
- 修改上面的 insert 标签
<insert id="insertEmp">
<selectKey keyColumn="emp_id" keyProperty="empId"
resultType="int" order="BEFORE">
select seq_id712.nextval from dual
</selectKey>
insert into emp_712
values(#{empId},#{empName},#{empMail},#{empGender},#{deptId})
</insert>
-
selectKey 标签
- 表示查询一个值,作为新增数据的主键
- keyColumn :数据表中的主键列名
- keyProperty:对应主键实体类的属性名
- resultType:返回结果类型
- order:表示是新增之前执行,还是新增之后执行查询
- BEFORE:表示新增之前
- AFTER:表示新增之后
如果是新增之后在查询主键怎么写?
修改 insert 标签
<insert id="insertEmp" >
<selectKey keyColumn="emp_id" keyProperty="empId" resultType="int" order="AFTER">
<!-- 获取当前主键的值 -->
select seq_2020721.currval from dual
</selectKey>
insert into emp_721(emp_id,emp_name,emp_mail,emp_gender,dept_id) values(seq_2020721.nextval,#{empName},#{empMail},#{empGender},#{deptId})
</insert>