在主鍵自增的情況下獲取主鍵

在主鍵自增的情況下獲取主鍵

對於支持主鍵自增的數據庫

對於支持主鍵自增的數據庫(例:MySQL),可以使用useGenerateKeyskeyProperty來獲取主鍵。

得到主鍵

在原生的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>

***這樣可能會出現問題,當有其他數據也進行插入的時候,序列也會增大,獲取序列的當前值會不準確。***

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