很多时候,在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键。
但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前SQL语句影响的行数。
接下来,我们看看MyBatis如何在使用MySQL和Oracle做insert插入操作时将返回的id绑定到对象中。
对于 MySQL 数据库只需要设置 keyProperty、keyColumn、useGeneratedKeys 属性
<!--
keyProperty: 把主键值赋给 bean 的哪一个属性
keyColumn: 使用哪一列的值来进行赋值
useGeneratedKeys="true": 使用自增的方式来生成主键值
-->
<insert id="testDatabaseId" databaseId="mysql"
keyProperty="id" keyColumn="id" useGeneratedKeys="true">
INSERT INTO students(last_name, birth)
VALUES(#{lastName}, #{birth})
</insert>
对于 Oracle 数据库. 使用 selectKey
<insert id="testDatabaseId" databaseId="oracle">
<!--
对于 Oracle 而言, 需要使用 selectKey 来生成主键值,
order="BEFORE": 先于 INSERT 执行
selectKey 的标签体: 指定生成主键的查询语句. SELECT 序列名.nextval FROM dual
keyColumn: 使用哪一列的值来进行赋值 ,在oracle中可以省略不写
keyProperty: 把标签体的查询结果赋给 bean 的哪一个属性.
resultType: 执行标签体查询的结果类型.
注意: 下面编写 SQL 时, 主键不能再次使用序列生成. 而要使用 #{keyProperty}
-->
<selectKey order="BEFORE"
keyColumn="id" keyProperty="id" resultType="int">
SELECT my_seq.nextval FROM dual
</selectKey>
INSERT INTO students(id, last_name, birth)
VALUES(#{id}, #{lastName}, #{birth})
</insert>
注意:Oracle用法中,需要注意的是:由于Oracle没有自增长一说法,只有序列这种模仿自增的形式,所以不能再使用“useGeneratedKeys”属性。
而是使用<selectKey>将ID获取并赋值到对象的属性中,insert插入操作时正常插入id。