参考:
深入浅出mybatis之useGeneratedKeys参数用法
Mybatis 配置文件 useGeneratedKeys 参数
mybatis中useGeneratedKeys和keyProperty的作用
在使用mybatis时,有些情况下需要在插入后获得刚才数据库为我们生成的那条记录的主键,但是如果我们不告诉数据库:“我插入这条信息后你把刚才插入的那条记录的主键告诉我,我有用!”,那么数据库是不会给我们返回的。有的人可能说,我可以一会再把它查出来啊~,这样确实可以,但是有些多此一举的味道,而且还要再写一个方法来查询。像这样又插入又能得到我们想要的信息,一举两得。
注意:
并不是返回值是主键,而是将主键的值写入到我们配置的keyProperty,因为我们的主键一般是数据库自己生成的,也就是说我们在向数据库中插入之前,我们自己定义实体类实例对应的主键属性一般是null或者不可用的(因为没插入之前你不可能知道数据库会给你生成什么样的主键),在配置了useGeneratedKeys ,keyColumn,keyProperty参数后,插入完成之后mybatis会帮你将生成的主键刷新到我们的实体类中,之后就可以直接使用了。
下面是一个小例子,帮助理解
- mapper.xml
<!-- useGeneratedKeys 插入后返回主键 keyColumn指定数据库主键
keyProperty指定在Java 实体类中对应的主键 -->
<insert id="inertPojo" useGeneratedKeys="true" keyColumn="pojo_id" keyProperty="Pojo">
<!-- 或者直接不显示的写key(主键) -->
insert into tb_pojo(key, param1, param2, ...)
values
(null, #{param1}, #{param2}, ...)
</insert>
对应的接口
public interface PojoDao {
/**
* 新增Pojo
* @param pojo
* @return 插入的记录的主键
*/
int inertPojo(Pojo pojo);
}
对应的插入逻辑
//Pojo的key我们并没有设定
Pojo ourPojo = new Pojo(param1, param2, ....);
//此时ourPojo的主键我们还是没法用的,因为数据库还没生成呢~
int effectNums = pojoDao.insertPojo(ourPojo);
//此时ourPojo的主键已经是可以用的了,默认的返回值是Sql语句影响的记录的条数