Mybatis添加数据时给实体类中的主键属性赋值
在我们使用mybatis的过程中,在表中插入某条数据时,通常会传入一个实体类
例如:
@Insert("insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})")
int insert(Emp emp);
但这个实体类的主键字段(这里为empno)在mysql中通常都是设定为自动增长的,通常我们会在插入时给emp对象的主键属性赋值为null,让数据库自动生成empno。但这样做有个问题,当我们插入数据后,要直接从emp对象中获取插入数据的主键值,它依然为null,影响某些特定的功能需求。
哪么如何在插入数据的同时,直接把主键值赋值给emp对象呢
MySql等有自动增长主键列的数据库中有以下做法:
注解版
@Options(useGeneratedKeys=true,keyProperty="empno",keyColumn="empno")
@Insert("insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})")
int insert(Emp emp);
useGeneratedKeys=true:是否使用自增主键
keyColumn:表中主键列名
keyProperty:实体类中主键属性名
xml版
<insert id="insert1" keyColumn="empno" keyProperty="empno" useGeneratedKeys="true" >
insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})
</insert>
通过以上方式就可以获取到empno的属性了
insert(emp);
System.out.println(emp.getEmpno())//11243
然而在oracle数据库中是没有自增列的,这里就要用到另一个标签:
selectKey
<insert id="insert1">
<!-- 添加之前查询出主键的值再把值赋给实体类之后再添加 如 oracle 中的 seq_emp.nextval-->
<selectKey keyColumn="empno" keyProperty="empno"
order="BEFORE" resultType="int">
select 8000
<!-- orcle中写select sq.nextval from dual -->
</selectKey>
insert into emp (empno,ename,job) values (#{empno},#{ename},#{job})
</insert>
selectKey中写你要执行的查询,可以查询序列值也可以自定义主键值
它前两个属性和上述是一样的,最后一个属性指定了主键的数据类型,比较特别的是order这个属性
order:这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
也就是说,有自动增长列的数据库可以执行插入前获取要插入数据的主键值,其的数据库要插入后再执行selectKey获取主键值并注入实体类,所以一般在mysql中用BEFORE,oracle中用AFTER