Mybatis 之 useGeneratedKeys 參數的用法

在Mybatis中,有三個位置可以設置 參數“useGeneratedKeys”:

1、在setting元素中設置 useGeneratedKeys參數,對於支持自動生成主鍵的數據庫,如 mysql,sql server,此時設置useGeneratedKeys爲 true,在執行插入記錄之後,可以讀取到數據庫自動生成的主鍵ID。
在setting元素中設置的useGeneratedKeys是一個全局的參數,但是隻是對接口接口映射器產生影響,對xml映射器無效

<settings> 
    <!-- 
        允許JDBC支持自動生成主鍵,需要驅動兼容。 如果設置爲true則這個設置強制使用自動生成主鍵,儘管一些驅動不能兼容但仍可正常工作(比如 Derby)。 
    --> 
    <setting name="useGeneratedKeys" value="true" /> 
</settings>

此時,在接口映射中添加記錄之後將返回主鍵ID。

public interface TestMapper { 
    // 受全局useGeneratedKeys參數控制,添加記錄之後將返回主鍵id 
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") 
    Integer insertOneTest(Test test);
}

此時,如果在接口映射器中設置 useGeneratedKeys = false,那麼添加記錄將不再返回記錄ID,該設置優先級高

    // 在接口映射器中設置的useGeneratedKeys參數值將會覆蓋在settings元素中設置全局useGeneratedKeys參數值 
    @Options(useGeneratedKeys = false, keyProperty = "id", keyColumn = "id") 
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") 
    Integer insertOneTest(Test test);

2、在XML映射器中配置useGeneratedKeys參數

<!-- 插入數據:返回記錄的id值 --> 
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
    insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now()) 
</insert>

xml映射器中配置的useGeneratedKeys參數只會對xml映射器產生影響,且在settings元素中設置的全局useGeneratedKeys參數值對於xml映射器不產生任何作用。

3、在接口映射器中設置useGeneratedKeys參數

// 設置useGeneratedKeys爲true,返回數據庫自動生成的記錄主鍵id 
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())") 
    Integer insertOneTest(Test test);

附:oracle數據庫不支持AUTO_INCREMENT列,她是使用序列生成自增主鍵的;
oracle在插入記錄時,如果也想返回當前記錄的id,可以這樣寫:

        <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>    

這裏我們使用了 selectKey 子元素來生成主鍵值,並將值保存到Student對象的studId 屬性上。屬性order=“before”表示MyBatis將取得序列的下一個值作爲主鍵值,並且在執行INSERT語句之前將值設置到studId屬性上。
注:SelectKey需要注意order屬性,像MySQL、SQLServer等一類支持自動增長類型的數據庫中,order需要設置爲after纔會取到正確的值。
像Oracle這樣取序列的情況,需要設置爲before,否則會報錯。

參考:深入淺出mybatis之useGeneratedKeys參數用法

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