Mybatis中自动生成主键

这个问题,我思考了很久最近才开始进行测试,经过两个小时的测试,各种方法我都差不多试了一遍。
在INSERT语句中,我们为可以自动生成(auto-generated)主键的列 DEPTNO 插入值。我们可以使用useGeneratedKeys和keyProperty属性让数据库生成auto_increment列的值,并将生成的值设置到其中一个输入对象属性内,如下所示:

<insert id="save" parameterType="Dept" useGeneratedKeys="true" keyProperty="deptno">    
    INSERT INTO DEPT(DNAME, LOC) VALUES(#{dname},#{loc})    
insert>   

这里DEPTNO列值将会被数据库自动生成(如mysql),并且生成的值会被设置到dept对象的deptno属性上。
但是有些数据库如Oracle并不支持AUTO_INCREMENT列,其使用序列(SEQUENCE)来生成主键值。假设我们有一个名为dept_seq的序列来生成deptno主键值。使用如下代码来生成主键:
drop sequence dept_seq;
create sequence dept_seq;

"save" parameterType="Dept">    
    "deptno" resultType="int" order="BEFORE">    
        SELECT dept_seq.nextval FROM DUAL    
        
    insert into dept (deptno,dname,loc) values (#{deptno},#{dname},#{loc})
 

selectKey 元素描述如下:

属性 属性描述
keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。
statementType 前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。

这里我们使用了子元素来生成主键值,并将值保存到Dept对象的deptno 属性上。属性order=“before”表示MyBatis将取得序列的下一个值作为主键值,并且在执行INSERT语句之前将值设置到deptno属性上。
注:SelectKey需要注意order属性,像MySQL、SQLServer等一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
像Oracle这样取序列的情况,需要设置为before,否则会报错。

你可能感兴趣的:(mybatis,自动生成主键,数据库维护主键)