MyBatis中自动生成主键

MyBatis中自动生成主键

详细
Mybatis 配置文件配置useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。在INSERT语句中,我们为可以自动生成(auto-generated)主键的列 STUD_ID 插入值。我们可以使用useGeneratedKeys和keyProperty属性让数据库生成auto_increment列的值,并将生成的值设置到其中一个输入对象属性内,如下所示:

<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">  
    INSERT INTO STUDENTS(NAME, EMAIL, PHONE) VALUES(#{name},#{email},#{phone})  
insert> 

这里STUD_ID列值将会被数据库自动生成(如mysql),并且生成的值会被设置到student对象的studId属性上。

但是有些数据库如Oracle并不支持AUTO_INCREMENT列,其使用序列(SEQUENCE)来生成主键值。假设我们有一个名为my_seq的序列来生成SUTD_ID主键值。使用如下代码来生成主键:

  • drop sequence my_seq;
  • create sequence my_seq;
<insert id="insertStudent" parameterType="Student">  
    <selectKey keyProperty="studId" resultType="int" order="BEFORE">  
        SELECT my_seq.nextval FROM DUAL  
    selectKey>  
    INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)  
        VALUES(#{studId},#{name},#{email},#{phone})  
insert>         

这里我们使用了子元素来生成主键值,并将值保存到Student对象的studId 属性上。属性order=“before”表示MyBatis将取得序列的下一个值作为主键值,并且在执行INSERT语句之前将值设置到studId属性上。

注:SelectKey需要注意order属性,像MySQL、SQLServer等一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

像Oracle这样取序列的情况,需要设置为before,否则会报错。

你可能感兴趣的:(Java,EE框架整合开发入门到实战)