对于在数据库表结构中设定为自动生成的主键,如自增长(AUTO_INCREMENT),插入时的Java对象往往无需对主键映射属性指定值。但是一旦插入成功时想再获取到这条记录就只能靠查询语句了,但是mybatis提供了一种简便的方式将数据库自动生成的主键反向注入到插入对象中。
方式一
在<insert>
标签中添加 useGeneratedKeys="true"
与 keyProperty="数据库表主键字段映射的Java对象属性"
- 接口
void add(User user);
- Mapper 映射文件
<!--
useGeneratedKeys设置为true表示要mybatis获取由数据库自动生成的主键
keyProperty指定把获取到的主键注入到数据库表主键字段映射的Java对象属性中
-->
<insert id="add" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (u_name, u_birthday, u_height)
VALUES (#{name}, #{birthday}, #{height})
</insert>
方式二
在主配置文件中开启全局设置 <setting name="useGeneratedKeys" value="true"/>
,并且在Mapper映射文件的每一个<insert>
标签中添加 keyProperty="数据库表主键字段映射的Java对象字段"
接口
- 主配置文件
除了在主配置文件中打开useGeneratedKeys以外,还需对每一个单独的标签指定keyProperty。
<configuration>
<settings>
<!-- 将useGeneratedKeys设置为true表示打开全局获取数据库自动生成主键 -->
<setting name="useGeneratedKeys" value="true"/>
</settings>
</configuration>
- Mapper 映射配置文件
<insert id="add" parameterType="User" keyProperty="id">
INSERT INTO users (u_name, u_birthday, u_height)
VALUES (#{name}, #{birthday}, #{height})
</insert>
方式三
采用 <selectKey>
标签获取主键的值 , 这种方式对提供和不提供主键自增功能的数据库同样适用。MySQL的last_insert_id()函数表示将返回最后一次插入记录的主键,使用标签将这一数值反向注入到Java对象的属性中,order属性则表示注入过程是在插入动作前(BEFORE)还是后(AFTER)。这样对于这一的SQL语句来说,会使用自生成的主键,并且在插入成功之后反向注入到Java对象中。
<insert id="add" parameterType="User">
<selectKey resultType="int" order="AFTER" keyProperty="id">
SELECT last_insert_id()
</selectKey>
INSERT INTO users (u_name, u_birthday, u_height)
VALUES (#{name}, #{birthday}, #{height})
</insert>
在 MYSQL 中,order 是 AFTER
, 因为当前及记录的主键值在 insert 语句执行成功之后才能拿到 , 而在ORACLE中,order 是 BEFORE
,因为 ORACLE 需要先从序列取到值,再将其作为主键插入到数据库。