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 的一些方法,当然不止上面这些,有其他的方法可以在评论区分享。