深入淺出mybatis之useGeneratedKeys參數用法


目錄

在MyBatis中,允許設置名稱為“useGeneratedKeys”參數存在3個位置:

  1. 在settings元素中設置useGeneratedKeys參數
  2. 在xml映射器中設置useGeneratedKeys參數
  3. 在接口映射器中設置useGeneratedKeys參數

在不同位置設置的useGeneratedKeys參數,最終結果相同,但是影響范圍不同。

在settings元素中設置useGeneratedKeys參數

官方的說法是該參數的作用是:“允許JDBC支持自動生成主鍵,需要驅動兼容”,如何理解這句話的意思?
其本意是說:對於支持自動生成記錄主鍵的數據庫,如:MySQL,SQL Server,此時設置useGeneratedKeys參數值為true,在執行添加記錄之后可以獲取到數據庫自動生成的主鍵ID。
實際上,在settings元素中設置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參數,那么注解映射器中的useGeneratedKeys參數值將覆蓋settings元素中設置的全局useGeneratedKeys參數值。
舉個例子:先在settings元素中設置全局useGeneratedKeys參數值為true,再在接口映射器中設置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);

另外,在settings元素中設置的全局useGeneratedKeys參數對於xml映射器無效。如果希望在xml映射器中執行添加記錄之后返回主鍵ID,則必須在xml映射器中明確設置useGeneratedKeys參數值為true。

在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映射器不產生任何作用。

在接口映射器中設置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);

注意: 在接口映射器中設置的useGeneratedKeys參數會覆蓋在<settings>元素中設置的對應參數值。

【參考】
[1] http://blog.csdn.net/suwu150/article/details/52895855 Mybatis中自動生成主鍵


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM