mapper.xml映射文件主要是用來編寫SQL語句的,以及一些結果集的映射關係的編寫,還有就是緩存的一些配置等等。html
在映射文件裏面能夠配置如下標籤:java
元素名稱 | 描述 | 備註 |
---|---|---|
select | 查詢語句,最經常使用、最複雜的元素之一 | 能夠自定義參數,返回結果集等 |
insert | 插入語句 | 執行後返回一個整數,表明插入的條數 |
update | 更新語句 | 執行後返回一個整數,表明更新的條數 |
delete | 刪除語句 | 執行後返回一個整數,表明刪除的條數 |
定義參數映射關係 | 即將被刪除的元素,不建議你們使用 | |
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>
自動映射能夠在settings元素中配置autoMappingBehavior屬性值來設置其策略:mybatis
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不容許換行。
resultMap裏面標籤以下圖所示:
result是配置POJO到SQL列名的映射關係。
association表明一對一關係,好比每一個班級都有一個班長
collection表明一對多關係,好比每一個班級有多個學生
discriminator鑑別器,它能夠根據實際選擇採用哪一個類做爲實例,容許你根據特定的條件去關聯不一樣的結果集合
全局延遲加載
爲了處理N+1的問題,My Batis引入了延遲加載的功能。延遲加載功能的意義在於,開始並不取出級聯數據,只有當使用它了才發送SQL去取回數據。MyBatis的配置中有兩個全局的參數lazyLoadingEnabled和aggressiveLazyLoading。
局部延遲加載
因爲全局配置的靈活性較差,MyBatis提供了局部延遲加載的功能。咱們能夠在association和 collection元素上加入屬性值fetchType就能夠了。
一級緩存
二級緩存
一級緩存在各個SqlSession間是相互隔離的。爲了克服這個問題,咱們每每須要配置二級緩存,使得緩存在SqlsessionFactory層面上可以提供給各個SqISession對象共享,二級緩存默認是不開啓的。
<cache/>
。