【Mybatis】新增数据后获取自增 ID

929 阅读2分钟

Mybtais 插入数据后获取自增 ID 方法有很多,下面我列出几种方式来获取自增 ID,当然如果以后遇到了新的获取自增 ID 的方式,我会在此基础上进行增加。

1. 使用 useGeneratedKeys 属性

由于接收的容器不同,我们的写法也不同。下面给出了几种可用的方式来接收自增 ID。

1.1. 使用 POJO 来接收自增 ID

细分之下又有一个参数和多个参数的区别,一个参数会更简单,所以推荐为每个 DAO 方法传入一个 POJO 对象,其中包含所需的字段。(POJO 通常为 Java 对象与数据库表字段的映射)

1.1.1. DAO 方法只有一个参数的写法:

(DAO 指的是 Data Access Object,即访问数据的对象,在 Mybatis 为 Mapper)

我们可以在 DAO 类(Mybatis 中为接口)中写下以下方法:

int insertUser(User user);

然后在对应的 XML 文件中写下以下代码:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO `test_table` (`name`, `age`) VALUES (#{name}, #{age})
</insert>

Mybatis 会在 User 类中去寻找 id 属性,并将自增 ID 注入到其中。

但是注意有个前提,就是传入的参数只有一个,有两个就会报错,因为 Mybatis 不知道应该把 ID 注入到哪个属性当中。报错信息如下:

Caused by: org.apache.ibatis.executor.ExecutorException: Could not determine which 
parameter to assign generated keys to. Note that when there are multiple parameters, 
'keyProperty' must include the parameter name (e.g. 'param.id'). Specified key properties 
are [id] and available parameters are [arg1, user, param1, param2]

1.1.2. DAO 方法有多个参数的写法:

在 DAO 类中写下如下方法:

// 变量 ali 没有任何意义
int insertUser(@Param("user") User user, String ali);

在对应的 XML 文件中写下下面的代码:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="user.id">
    INSERT INTO `test_table` (`name`, `age`) VALUES (#{user.name}, #{user.age})
</insert>

可以看到我们修改了 #{} 的取值方式和 keyProperty="user.id",清晰地指定了从何处取到 name 和 age,并将自增 id 赋值到 user 对象当中。

1.2. 使用 Map 来接收自增 ID

这种方式相较于上面的方法来说较为繁琐,但也是一种方法。

在 DAO 文件中写下下面的代码:

int insertUser(@Param("user") User user, @Param("map") Map<String, Integer> map);

当然你可以将 user 中的属性全部加到 map 中,然后在 XML 文件中使用 #{map.name} 的方式来获取值。当然这样与直接传入 User 一个对象的效果是一样的

然后在 XML 文件中写下下面的代码:

<insert id="insertUser" parameterType="map" useGeneratedKeys="true" keyProperty="map.id">
    INSERT INTO `test_table` (`name`, `age`) VALUES (#{user.name}, #{user.age})
</insert>

这样在 map 中就能获取到自增 ID。

1.3. 结语

以上就是在 Mybatis 插入数据时获取自增 ID 的一些方法,当然不止上面这些,有其他的方法可以在评论区分享。