> 文章列表 > Mybatis 在 insert 插入操作后如何返回主键 id

Mybatis 在 insert 插入操作后如何返回主键 id

Mybatis 在 insert 插入操作后如何返回主键 id

一、使用 JDBC 的 getGeneratedKeys 方法

JDBC 提供了一个 getGeneratedKeys 方法,用于获取插入记录的主键 ID。在 MyBatis 中,我们可以通过设置 useGeneratedKeys 和 keyProperty 属性来使用该方法。

  1. 设置 useGeneratedKeys 属性
    useGeneratedKeys 属性的作用是告诉 MyBatis 使用 JDBC 的 getGeneratedKeys 方法获取插入记录的主键 ID。在配置文件中,我们可以在 insert 元素中设置 useGeneratedKeys 属性:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true">insert into user (name, age) values (#{name}, #{age})
</insert>
  1. 设置 keyProperty 属性
    keyProperty 属性的作用是指定主键 ID 赋值的目标属性。在配置文件中,我们可以在 insert 元素中设置 keyProperty 属性:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">insert into user (name, age) values (#{name}, #{age})
</insert>

使用 JDBC 的 getGeneratedKeys 方法获取主键 ID 的方式非常简单,但需要注意的是,该方法只适用于支持自动生成主键的数据库,如 MySQL、Oracle 等。

二、使用 SELECT LAST_INSERT_ID() 函数

对于不支持 JDBC 的 getGeneratedKeys 方法的数据库,我们可以使用 SELECT LAST_INSERT_ID() 函数获取插入记录的主键 ID。在 MyBatis 中,我们可以通过设置 useGeneratedKeys 和 keyProperty 属性来使用该方法。

  1. 设置 useGeneratedKeys 属性
    在配置文件中,我们可以在 insert 元素中设置 useGeneratedKeys 属性,并将其值设为 false:
<insert id="insertUser" parameterType="User" useGeneratedKeys="false">insert into user (name, age) values (#{name}, #{age})<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">SELECT LAST_INSERT_ID()</selectKey>
</insert>
  1. 使用 SELECT LAST_INSERT_ID() 函数
    在 insert 元素结束后,我们可以使用 SELECT LAST_INSERT_ID() 函数获取插入记录的主键 ID:
<insert id="insertUser" parameterType="User" useGeneratedKeys="false">insert into user (name, age) values (#{name}, #{age})<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">SELECT LAST_INSERT_ID()</selectKey>
</insert>

使用 SELECT LAST_INSERT_ID() 函数获取主键 ID 的方式也比较简单,但需要注意的是,该方法只适用于支持 SELECT LAST_INSERT_ID() 函数的数据库,如 MySQL 等。

三、使用 UUID 作为主键

在某些情况下,我们可能并不需要数据库自动生成主键,而是需要自定义主键。在这种情况下,我们可以使用 UUID 作为主键,MyBatis 中也提供了相应的支持。

  1. 定义主键为 UUID
    在定义表结构时,我们可以将主键定义为 UUID 类型:
CREATE TABLE user (id VARCHAR(36) PRIMARY KEY,name VARCHAR(20),age INT
);
  1. 使用 UUID 生成主键
    在 MyBatis 中,我们可以使用 UUID 生成主键,并将其赋值给对象的 id 属性。在配置文件中,我们可以在 insert 元素中使用 selectKey 元素来生成主键:
<insert id="insertUser" parameterType="User"><selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE">SELECT UUID()</selectKey>insert into user (id, name, age) values (#{id}, #{name}, #{age})
</insert>

在 selectKey 元素中,我们使用 SELECT UUID() 函数生成主键,并将其赋值给对象的 id 属性。这样,在执行插入操作时,id 属性就会被赋值为生成的 UUID。

使用 UUID 作为主键的方式可以灵活地满足不同的需求,但需要注意的是,在某些场景下,UUID 的性能可能不如自增主键。