useGeneratedKeys和selectKey的区别
今天遇见两个Mybatis当中很有像似点的属性,仔细研究了会.发现还是有带你不同.
- useGenerateKeys
其值为true
和false
,表明是否将插入生成的主键返回到参数当中.
- useGeneratedKey属性会自动根据驱动生成对应SQL语句
- useGeneratedKey只支持“自增主键”类型的数据库,比如
MySQL
,DB2
,Oracle
等
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
- selectKey标签需要明确编写获取最新主键的SQL语句
- selectKey适用于所有的关系型数据库,如
mysql
,sqlserver
等
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
表示插入之前进行查询,可以将查询结果赋给keyProperty和keyColumn,赋给keyColumn相当于更改数据库。对应xml配置order中的BEFORE - before=
false
表示先插入,再查询,这时只能将结果赋给keyProperty。对应xml配置order中的AFTER
- before=
注意:使用MySQL的last_insert_id()函数时,before必为false,也就是说必须先插入然后执行last_insert_id()才能获得刚刚插入数据的ID
- statementType 要运行的SQL语句,它的返回值通过resultType来指定