文章目录
在主键自增的情况下获取主键
对于支持主键自增的数据库
对于支持主键自增的数据库(例:MySQL),可以使用useGenerateKeys
和keyProperty
来获取主键。
得到主键
在原生的JDBC中,可以使用Statement.getGenerateKeys()
方法来获取自增的主键。userGenerateKeys
属性的作用就是调用这个方法,获取主键。
将主键封装到指定字段
引用官方文档
(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
使用keyProperty
,可以指定Mybatis调用Statement.getGenerateKeys()
方法后,将这个(或这些)列对应的值放到javabean的哪个(或哪些)属性。
举例:
public void addCollege(College college);
<insert id="addCollege" useGeneratedKeys="true" keyProperty="id">
insert into college(college_name) values (#{name})
</insert>
College college = new College(null, "生命科学学院");
collegeDao.addCollege(college);
sqlSession.commit();
System.out.println(college);
输出结果:
图3
对于不支持主键自增的数据库
有些数据库不支持主键自增(例如:Oracle)。Oracle有类似于主键自增的办法:使用序列。
selectKey order='BEFORE'
在插入之前,先通过序列获取主键
所以,可以使用<selectKey/>
,在插入语句执行前,先将主键获取到,并且赋值给javabean的id属性。
<insert id="addCollege">
<selectKey keyProperty="id" order="BEFORE">
select college_seq.nextval from dual
</select>
insert into college(college_id, college_name) values(#{id},#{name})
</insert>
由于order='BEFORE'
,所以,<selectKey/>
中的语句先执行,它将主键获取到,并且通过keyProperty="id"
,将主键赋值给javabean的id属性。
接下来执行<insert/>
的语句,通过#{id}
可以获取<selectKey/>
查询后,赋值给id属性的主键。
selectKey order='AFTER'
第二种写法,先插入,然后再查询序列的当前值。
<insert id="addCollege">
<selectKey keyProperty="id" order="AFTER">
select college_seq.currval from dual
</select>
insert into college(college_id, college_name) values(college_seq.nextval,#{name})
</insert>
***这样可能会出现问题,当有其他数据也进行插入的时候,序列也会增大,获取序列的当前值会不准确。***