关于Mybatis执行插入语句后返回主键id的一种实现
执行Mybatis执行INSERT语句时,返回的是更改的行数,在源码中可以知道这是mapper.xml修改不了的。
case INSERT: {
Object param = method.convertArgsToSqlCommandParam(args);
// rowCount字面理解就是记录行数
result = rowCountResult(sqlSession.insert(command.getName(), param));
break;
}
既然改不了返回值,那么Mybatis提供了一种方法:改传入的参数(或对象)。
假如一个mapper的方法定义如下:
void insertOneUser(User user);
此方法参数为一个User类的对象,若要实现执行插入语句后可以获取主键id的功能,Mybatis操作如下:
- 获取传入的参数,如user;
- 将user的id属性设置为自增id的值。
mapper.xml书写方式:
<insert id="insertOneUser" parameterType="正常写">
<selectKey resultType="java.lang.Long" keyProperty="id" keyColumn="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO
user_t(username, password, age)
VALUES
(#{username}, #{password}, #{age})
</insert>
selectKey标签属性:
- 对于传入的参数对象(user):
- resultType:在user中,存储主键id的类型是什么?
- keyProperty:在user中,对应表内主键id的属性名是什么?
- 对于表:
- keyColumn:主键id在表内的字段是什么?
- 操作:
- order:AFTER:在插入语句之后查询主键id并设置,BEFORE反之。
标签包裹的内容:返回一个值,为最近一次insert生成的主键id。
SELECT LAST_INSERT_ID()
此处定义的insert块执行顺序:
- 执行INSERT语句,将user内的数据插入表中;
- 执行selectKey标签内的语句,找到最近插入的主键id;
- 将查到的主键id通过反射(set与设置的keyProperty拼成方法名)找到对应setter方法,执行user的setter方法。
使用方法如下:
User u;
userMapper.insertOneUser(u = userDetails2User(user)); // 假设User对象u此时的id为null
Long id = u.getId(); // 执行后再获取id,id非空且为此次插入生成的主键id
assert id != null; // 断言通过