springboot集成mybatis获取插入数据的主键

问题:

我们想在插入一条数据后同时能够返回这条数据在表中的id,Mybatis提供了@SelectKey注解。
student 为数据表,主键自增

SelectKey的四个属性:

  1. selectKey 会将 SELECT LAST_INSERT_ID()的结果放入到传入的实体类的主键里面,
  2. keyProperty对应的实体类中的主键的属性名,这里是 实体类中的id,因为它跟数据库的主键对应order
  3. AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,
  4. 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;
posted @   周XX  阅读(657)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示