2、Mapper映射文件

Mapper映射文件

mapper.xml映射文件主要是用來編寫SQL語句的,以及一些結果集的映射關係的編寫,還有就是緩存的一些配置等等。html

在映射文件裏面能夠配置如下標籤:java

元素名稱 描述 備註
select 查詢語句,最經常使用、最複雜的元素之一 能夠自定義參數,返回結果集等
insert 插入語句 執行後返回一個整數,表明插入的條數
update 更新語句 執行後返回一個整數,表明更新的條數
delete 刪除語句 執行後返回一個整數,表明刪除的條數
parameterMap 定義參數映射關係 即將被刪除的元素,不建議你們使用
sql 容許定義一部分的SQL,而後在各個地方引用
resultMap 用來描述從數據庫結果集中來加載對象,它是它將提供映射規則最複雜、最強大的元素 它提供映射規則
cache 給定命名空間的緩存配置
cache-ref 其餘命名空間緩存配置的引用

引入映射器

  • 能夠在mybatis-config.xml中經過文件路徑引入sql

    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
  • 經過包名引入數據庫

    這樣會將mapper下的全部mapper類加載到上下文當中緩存

    <mappers>
        <package name="com.zl.mapper"/>
    </mappers>
  • 用類註冊引入session

    <mappers>
        <mapper class="com.zl.mapper.UserMapper"/>
    </mappers>

Select標籤

  • id
    它和 Mapper的命名空間組合起來是惟一的,提供給MyBatis調用。若是命名空間和id組合起來不惟一將拋出異常。
  • parameterType
    能夠給出類的全命名,也能夠給出類的別名,但使用別名必須是MyBatis內部定義或者自定義的。
  • resultType
    定義類的全路徑,在容許自動匹配的狀況下,結果集將經過JavaBean的規範映射;也能夠定義爲int、 double等參數;也可使用別名,可是要符合別名規範;不能和 resultMap同時使用。
  • resultMap
    外部 resultMap 的命名引用。
  • flushCache
    它的做用是在調用SQL後,是否要求清空以前查詢的本地緩存和二級緩存
  • useCache
    將其設置爲 true,將會致使本條語句的結果被二級緩存,默認值:true。
  • timeout
    這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數。默認值爲 unset(依賴驅動)。
  • fetchSize
    這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值爲 unset(依賴驅動)。
  • statementType
    STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
  • resultSetType
    FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值爲 unset (依賴驅動)。
  • databaseId
    若是配置了 databaseIdProvider,MyBatis 會加載全部的不帶 databaseId 或匹配當前 databaseId 的語句;若是帶或者不帶的語句都有,則不帶的會被忽略。
  • resultOrdered
    這個設置僅針對嵌套結果 select 語句適用:若是爲 true,就是假設包含了嵌套結果集或是分組了,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的狀況。這就使得在獲取嵌套的結果集的時候不至於致使內存不夠用。默認值:false。
  • resultSets
    這個設置僅對多結果集的狀況適用,它將列出語句執行後返回的結果集並每一個結果集給一個名稱,名稱是逗號分隔的。

自動映射

自動映射能夠在settings元素中配置autoMappingBehavior屬性值來設置其策略:mybatis

  • NONE,取消自動映射。
  • PARTIAL(默認值),只會自動映射,沒有定義嵌套結果集映射的結果集。
  • FULL,會自動映射任意複雜的結果集(不管是否嵌套),在性能上會降低。

Insert標籤

insert的不少配置元素是和select同樣的,就再也不贅述,下面列出select中沒有的屬性app

  • keyPropertyide

    表示以哪一個列做爲屬性的主鍵,不能和keyColumn同時使用函數

  • keyColumn

    表示第幾列是主鍵,不能和keyProperty同時使用

  • useGeneratedKeys

    這會令MyBatis使用JDBC的getGeneratedKeys方法來取出由數據庫內部生成的主鍵,可是使用它就必需要給keyProperty或者 keyColumn賦值

主鍵回填

方式一

<insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
    insert into t_book (b_name,author) values (#{name},#{author});
</insert>

這種方式比較簡單,就是在插入節點上添加 useGeneratedKeys 屬性,同時設置接收回傳主鍵的屬性。配置完成後,咱們執行一個插入操做,插入時傳入一個對象,插入完成後,這個對象的 id 就會被自動賦值,值就是剛剛插入成功的id。

推薦你們使用這種方式,緣由很簡單,這種方式實現簡便省事。

方式二

第二種方式則是利用MySQL自帶的 last_insert_id() 函數查詢剛剛插入的id,示例代碼以下:

<insert id="insertBook">
    <selectKey keyProperty="id" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into t_book (b_name,author) values (#{name},#{author});
</insert>

這種方式是在 insert 節點中添加 selectKey 來實現主鍵回填,實際上這種方式的功能更加豐富,由於 selectKey 節點中的 SQL 咱們既能夠在插入以前執行,也能夠在插入以後執行(經過設置節點的 Order 屬性爲 AFTER 或者 BEFORE 能夠實現),具體何時執行,仍是要看具體的需求,若是是作主鍵回填,咱們固然須要在插入 SQL 執行以後執行 selectKey 節點中的 SQL。

注意第二種方式同樣也要經過設置 keyProperty 來指定將查詢到的數據綁定到哪一個屬性上。

參數配置

咱們能夠傳入一個簡單的參數如基本類型和字符串;也能夠傳入JavaBean;還能夠指定特定的類型,以肯定使用哪一個 typeHandler處理它們。定義參藪屬性的時候,MyBatis不容許換行

  • {age, javaType=int, jdbcType=NUMERIC}

  • 指定typeHandler:#{age, javaType=int, jdbcType=NUMERIC, typeHandler=MyTypeHandler}
  • 數值型的參數設置其保存的精度:#{price, javaType=double, jdbcType=NUMERIC, numericScale=2}

resultMap結果映射集

resultMap裏面標籤以下圖所示:

png

  • constructor元素用於配置構造方法,一個POJO可能不存在無參數的構造方法,這個時候咱們就可使用 constructor進行配置。
  • id元素是表示哪一個列是主鍵,容許多個主鍵構成聯合主鍵。
  • result是配置POJO到SQL列名的映射關係。

  • association表明一對一關係,好比每一個班級都有一個班長

    具體見:Mybatis中association的用法

  • collection表明一對多關係,好比每一個班級有多個學生

    具體見:Mybatis中collection的用法

  • discriminator鑑別器,它能夠根據實際選擇採用哪一個類做爲實例,容許你根據特定的條件去關聯不一樣的結果集合

延遲加載

全局延遲加載

爲了處理N+1的問題,My Batis引入了延遲加載的功能。延遲加載功能的意義在於,開始並不取出級聯數據,只有當使用它了才發送SQL去取回數據。MyBatis的配置中有兩個全局的參數lazyLoadingEnabled和aggressiveLazyLoading。

  • lazyLoadingEnabled的含義是是否開啓延遲加載功能;
  • aggressiveLazyLoading的含義是對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將按需加載。

局部延遲加載

因爲全局配置的靈活性較差,MyBatis提供了局部延遲加載的功能。咱們能夠在association和 collection元素上加入屬性值fetchType就能夠了。

緩存

一級緩存

  • MyBatis對緩存提供支持,在沒有配置的默認的狀況下,它只開啓一級緩存(一級緩存只是相對於同一個 SqlSession而言),因此在參數和SQL徹底同樣的狀況下,咱們使用同一個 SqlSession對象調用同一個Mapper的方法,每每只執行一次SQL。
  • 使用SqlSession第一次查詢後,MyBatis會將其放在緩存中。之後再查詢的時候,若是沒有聲明須要刷新且緩存沒超時,SqlSession都只會取出當前緩存的數據,而不會再次發送SQL到數據庫。
  • 若是使用的是不一樣的SqlSession對象,由於不一樣的SqlSession都是相互隔離的,因此用相同的 Mapper、參數和方法,它仍是會再次發送SQL到數據庫去執行。
  • 當咱們關閉SqlSession對象後,緩存就會失效。

二級緩存

一級緩存在各個SqlSession間是相互隔離的。爲了克服這個問題,咱們每每須要配置二級緩存,使得緩存在SqlsessionFactory層面上可以提供給各個SqISession對象共享,二級緩存默認是不開啓的

  1. 二級緩存的時候要求返回的POJO必須是可序列化的,也就是要求實現Serializable接口。
  2. 配置的緩存的方法很簡單,只須要在Mapper.xml文件中加入<cache/>
  3. 映射語句文件中的全部insert、update和delete語句會刷新緩存
相關文章
相關標籤/搜索