在主键自增的情况下获取主键

在主键自增的情况下获取主键

对于支持主键自增的数据库

对于支持主键自增的数据库(例:MySQL),可以使用useGenerateKeyskeyProperty来获取主键。

得到主键

在原生的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>

***这样可能会出现问题,当有其他数据也进行插入的时候,序列也会增大,获取序列的当前值会不准确。***

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章