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