文章目錄
在主鍵自增的情況下獲取主鍵
對於支持主鍵自增的數據庫
對於支持主鍵自增的數據庫(例:MySQL),可以使用useGenerateKeys
和keyProperty
來獲取主鍵。
得到主鍵
在原生的JDBC中,可以使用Statement.getGenerateKeys()
方法來獲取自增的主鍵。userGenerateKeys
屬性的作用就是調用這個方法,獲取主鍵。
將主鍵封裝到指定字段
引用官方文檔
(僅適用於 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設置它的值,默認值:未設置(unset)。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
使用keyProperty
,可以指定Mybatis調用Statement.getGenerateKeys()
方法後,將這個(或這些)列對應的值放到javabean的哪個(或哪些)屬性。
舉例:
public void addCollege(College college);
<insert id="addCollege" useGeneratedKeys="true" keyProperty="id">
insert into college(college_name) values (#{name})
</insert>
College college = new College(null, "生命科學學院");
collegeDao.addCollege(college);
sqlSession.commit();
System.out.println(college);
輸出結果:
圖3
對於不支持主鍵自增的數據庫
有些數據庫不支持主鍵自增(例如:Oracle)。Oracle有類似於主鍵自增的辦法:使用序列。
selectKey order='BEFORE'
在插入之前,先通過序列獲取主鍵
所以,可以使用<selectKey/>
,在插入語句執行前,先將主鍵獲取到,並且賦值給javabean的id屬性。
<insert id="addCollege">
<selectKey keyProperty="id" order="BEFORE">
select college_seq.nextval from dual
</select>
insert into college(college_id, college_name) values(#{id},#{name})
</insert>
由於order='BEFORE'
,所以,<selectKey/>
中的語句先執行,它將主鍵獲取到,並且通過keyProperty="id"
,將主鍵賦值給javabean的id屬性。
接下來執行<insert/>
的語句,通過#{id}
可以獲取<selectKey/>
查詢後,賦值給id屬性的主鍵。
selectKey order='AFTER'
第二種寫法,先插入,然後再查詢序列的當前值。
<insert id="addCollege">
<selectKey keyProperty="id" order="AFTER">
select college_seq.currval from dual
</select>
insert into college(college_id, college_name) values(college_seq.nextval,#{name})
</insert>
***這樣可能會出現問題,當有其他數據也進行插入的時候,序列也會增大,獲取序列的當前值會不準確。***