Mybatis中自动生成主键在mysql和Oracle当中的情况

     Mybatis中自动生成主键

        在INSERT语句中,我们为可以自动生成(auto-generated)主键的列 STUD_ID 插入值。我们可以使用useGeneratedKeys和keyProperty属性让数据库生成auto_increment列的值,并将生成的值设置到其中一个输入对象属性内,如下所示:                 
  1.  
    <insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">
  2.  
    INSERT INTO STUDENTS(NAME, EMAIL, PHONE) VALUES(#{name},#{email},#{phone})
  3.  
    </insert>
        这里STUD_ID列值将会被数据库自动生成(如mysql),并且生成的值会被设置到student对象的studId属性上。  
        但是有些数据库如Oracle并不支持AUTO_INCREMENT列,其使用序列(SEQUENCE)来生成主键值。假设我们有一个名为my_seq的序列来生成SUTD_ID主键值。使用如下代码来生成主键:
        drop sequence my_seq;
        create sequence my_seq;
  1.  
    <insert id="insertStudent" parameterType="Student">
  2.  
    <selectKey keyProperty="studId" resultType="int" order="BEFORE">
  3.  
    SELECT my_seq.nextval FROM DUAL
  4.  
    </selectKey>
  5.  
    INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
  6.  
    VALUES(#{studId},#{name},#{email},#{phone})
  7.  
    </insert>        
  8.  
     
        这里我们使用了<selectKey>子元素来生成主键值,并将值保存到Student对象的studId 属性上。属性order=“before”表示MyBatis将取得序列的下一个值作为主键值,并且在执行INSERT语句之前将值设置到studId属性上。  
        注:SelectKey需要注意order属性,像MySQL、SQLServer等一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

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

来自:https://blog.csdn.net/suwu150/article/details/52895855

 

posted @ 2021-01-14 18:53  flyfish91  阅读(193)  评论(0编辑  收藏  举报