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,否則會報錯。

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