mybatis 作为一个主流的 ORM 框架,深受广大开发者的喜爱。有人的地方就有江湖,有代码的地方自然有坑,下面来说说获取 mybatis 的插入后返回的主键。
我们可以想一下自动增长的主键特性,在数据库里面肯定有某个地方管理 ID 的自增长,那个机制每次都会记录最近一次新增的主键,或者是取最大值,然后在下一次进行递增处理,因此我们有获取插入的主键要么在新增之前,要么在新增之后,按照习惯我们一般喜欢在新增之后获取主键,下面来说说获取主键的方式。
继承 Mapper, MySqlMapper
这种方式比较简单,直接在实体类主键加上注解 @Id 和 **@GeneratedValue(strategy = GenerationType.IDENTITY) **即可,但是在项目中不建议继承这两个类,不过话说回来,在微服务中,单标操作,使用这个 api 比较快捷,实体配置如下
@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;
使用 xml
这种方式一般有两种:
- 直接在标签属性上添加 useGeneratedKeys(是否是自增长,必须设置 true) 和 keyProperty(实体类主键属性名称) 、keyColumn(数据库主键字段名称)
<insert id="insertOne" parameterType="com.dao.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">INSERT INTO user(name,age) VALUES(#{name},#{age})</insert>
- 通过查询返回主键,其中 resultType 是主键返回类型,keyProperty 是实体类主键属性,order 是获取主键方式,AFTER 指插入之后执行,下面 sql 就是查询最后一个主键。
<insert id="insertOne" parameterType="com.dao.model.User" ><selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >SELECT LAST_INSERT_ID()</selectKey>INSERT INTO user(name,age) VALUES(#{name},#{age})</insert>
注解方式
useGeneratedKeys(是否是自增长,必须设置 true) 和 keyProperty(实体类主键属性名称) 、keyColumn(数据库主键字段名称)
@Insert("INSERT INTO user(name,age) VALUES(#{user.name},#{user.age})")@Options(useGeneratedKeys=true, keyProperty="user.id",keyColumn="id" )public int insertOne(@Param("user")User user);
注意
提醒小伙伴们,若在映射的 mapper 里面参数取了别名,所有的实体类的属性都要加上别名.属性名,比如注解方式的案例。