• 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;
    
  • 相关阅读:
    【JS】在JS方法中返回多个值的三种方法
    【装饰】博客园背景轮播
    【jquery】查看全文/收起
    jQuery节点查找方法
    点击事件的累加问题
    微信小程序动画效果集合
    【数组】数组的操作
    【Mock.js】 入门
    【下拉刷新】WEUI下拉刷新
    __iomem作用
  • 原文地址:https://www.cnblogs.com/zhouXX/p/16706344.html
Copyright © 2020-2023  润新知