问题:
我们想在插入一条数据后同时能够返回这条数据在表中的id,Mybatis提供了@SelectKey注解。
student 为数据表,主键自增
SelectKey的四个属性:
- selectKey 会将 SELECT LAST_INSERT_ID()的结果放入到传入的实体类的主键里面,
- keyProperty对应的实体类中的主键的属性名,这里是 实体类中的id,因为它跟数据库的主键对应order
- AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,
- BEFORE 表示 SELECTLAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,这种适合那种主键不是自增的类型
mapper配置如下:
<insert id="addGetKey" parameterType="com.javaone.passmybatis.entity.Student">
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into student (name,age,email) values (#{name},#{age},#{email})
</insert>
观察mybatis日志输出也是正常的
==> Preparing: insert into student (name,age,email) values (?,?,?)
==> Parameters: string(String), 0(Integer), string(String)
<== Updates: 1
==> Preparing: select LAST_INSERT_ID()
==> Parameters:
<== Columns: LAST_INSERT_ID()
<== Row: 22
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8297b8d]
Student{id=22, name='string', email='string', age=0}
但是返回的结果一直是1,分析这个1可能是insert(student)执行成功返回1,失败返回0的结果,而不是我们想要的id。
解决办法:
我插入数据时插入的是一个bean,这个bean的类型就是上面我们提到的student,插入前它的id是空的;
当我们执行插入后,返回插入的结果,插入成功返回1,插入失败返回0,这就是为什么结果一直为1了。返回的id其实已经映射到了我们插入的bean中,即id值已经返回到user的id属性里了我们只要通过它的get方法就可以得到了。代码如下:
int result= studentDao.addGetKey(student);
System.out.println(student.toString());
System.out.println(student.getId());
return result;
标签:返回,insert,springboot,主键,插入,student,mybatis,id
From: https://www.cnblogs.com/zhouXX/p/16706344.html