浅谈一下Mybatis当中插入主键返回的两个属性(useGeneratedKeys,selectKey)

useGeneratedKeys和selectKey的区别

今天遇见两个Mybatis当中很有像似点的属性,仔细研究了会.发现还是有点不同.

  • useGenerateKeys

其值为truefalse,表明是否将插入生成的主键返回到参数当中.

  1. useGeneratedKey属性会自动根据驱动生成对应SQL语句
  2. useGeneratedKey只支持“自增主键”类型的数据库,比如MySQL , DB2Oracle

xml配置用法(keyProperty表示生成的主键放回到传入参数的成员变量当中).

    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.mapper.StudentMapper">
        <insert id="insertStudent" useGeneratedKeys="true" keyProperty="id">
            insert into s_student (name, age, c_id)
            values (#{name}, #{age}, #{cId});
        </insert>
    </mapper>

注解用法(利用@Options注解):

        @Options(useGeneratedKeys = true, keyProperty = "id")
        @Insert("insert into s_student(name,age,c_id) values(#{name},#{age},#{cId})")
        public void insertStudent(Student student);
  • selectKey
  1. selectKey标签需要明确编写获取最新主键的SQL语句
  2. selectKey适用于所有的关系型数据库,如mysqlsqlserver

xml配置用法

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.itheima.mapper.StudentMapper">
        <insert id="insertStudent">
            <selectKey  resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
                select last_insert_id()
            </selectKey>
            insert into s_student (name, age, c_id)
            values (#{name}, #{age}, #{cId});
        </insert>
    </mapper>
    

我们来注意几个参数

这里我们需要关注一下order这个属性:

  • BEFORE(一定得是大写): 就是在插入之前查一下最近插入数据的id.这会出现什么问题呢?

就是想象一个业务场景,主表插入一条记录,比如此时返回id = 1.但由于出了异常导致事务回滚.

而第二次再插入,主表又插入了一条记录,此时应该返回id = 2,由于是先查询再插入,之前由于异常,尽管出现了异常但是我们还是执行了insert语句.所以会判断最近插入的一条数据的id是出了异常的那个id,所以就将1返回了.

  • AFTER(一定得是大写): 插入后再查询,这个就是与before相反,我们配置基本都是这个属性.

注解使用(@SelectKey):

    @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = true, resultType = Integer.class)
        @Insert("insert into s_student(name,age,c_id) values(#{name},#{age},#{cId})")
        public void insertStudent(Student student);

@SelectKey参数解析

  • keyProperty 表示查询结果赋值给代码中的哪个对象
  • keyColumn 表示将查询结果赋值给数据库表中哪一列
  • resultType 填入 keyProperty 的 Java 类型
  • before 可以设置为 true 或false。要运行的SQL语句。
    • before=true表示插入之前进行查询,可以将查询结果赋给keyPropertykeyColumn,赋给keyColumn相当于更改数据库。对应xml配置order中的BEFORE
    • before=false表示先插入,再查询,这时只能将结果赋给keyProperty。对应xml配置order中的AFTER

注意:使用MySQL的last_insert_id()函数时,before必为false,也就是说必须先插入然后执行last_insert_id()才能获得刚刚插入数据的ID

  • statementType 要运行的SQL语句,它的返回值通过resultType来指定
  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值