Mybatis Mapper文件配置

SQL 映射文件有不多的幾個頂級元素(按照它們應該被定義的順序):java

  • cache – 給定命名空間的緩存配置。
  • cache-ref – 其餘命名空間緩存配置的引用。
  • resultMap – 是最複雜也是最強大的元素,用來描述如何從數據庫結果集中來加載對象。
  • sql – 可被其餘語句引用的可重用語句塊。
  • insert – 映射插入語句
  • update – 映射更新語句
  • delete – 映射刪除語句
  • select – 映射查詢語句 

Selectredis

最基本的查詢語句,能夠配置一些屬性來決定每個細節,相關屬性以下:算法

屬性 描述
id 在命名空間中惟一的標識符,能夠被用來引用這條語句。
parameterType 將會傳入這條語句的參數類的徹底限定名或別名。這個屬性是可選的,由於 MyBatis 能夠經過 TypeHandler 推斷出具體傳入語句的參數,默認值爲 unset。
parameterMap 這是引用外部 parameterMap 的已經被廢棄的方法。使用內聯參數映射和 parameterType 屬性。
resultType 從這條語句中返回的指望類型的類的徹底限定名或別名。注意若是是集合情形,那應該是集合能夠包含的類型,而不能是集合自己。使用 resultType 或 resultMap,但不能同時使用。
resultMap 外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,對其有一個很好的理解的話,許多複雜映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同時使用。
flushCache 將其設置爲 true,任什麼時候候只要語句被調用,都會致使本地緩存和二級緩存都會被清空,默認值:false。
useCache 將其設置爲 true,將會致使本條語句的結果被二級緩存,默認值:對 select 元素爲 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 這個設置僅對多結果集的狀況適用,它將列出語句執行後返回的結果集並每一個結果集給一個名稱,名稱是逗號分隔的。 

insert、update、deletesql

插入、更新和刪除語句,相關屬性以下:數據庫

屬性 描述
id 命名空間中的惟一標識符,可被用來表明這條語句。
parameterType 將要傳入語句的參數的徹底限定類名或別名。這個屬性是可選的,由於 MyBatis 能夠經過 TypeHandler 推斷出具體傳入語句的參數,默認值爲 unset。
parameterMap 這是引用外部 parameterMap 的已經被廢棄的方法。使用內聯參數映射和 parameterType 屬性。
flushCache 將其設置爲 true,任什麼時候候只要語句被調用,都會致使本地緩存和二級緩存都會被清空,默認值:true(對應插入、更新和刪除語句)。
timeout 這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數。默認值爲 unset(依賴驅動)。
statementType STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
useGeneratedKeys (僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵(好比:像 MySQL 和 SQL Server 這樣的關係數據庫管理系統的自動遞增字段),默認值:false。
keyProperty (僅對 insert 和 update 有用)惟一標記一個屬性,MyBatis 會經過 getGeneratedKeys 的返回值或者經過 insert 語句的 selectKey 子元素設置它的鍵值,默認:unset。若是但願獲得多個生成的列,也能夠是逗號分隔的屬性名稱列表。
keyColumn (僅對 insert 和 update 有用)經過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(像 PostgreSQL)是必須的,當主鍵列不是表中的第一列的時候須要設置。若是但願獲得多個生成的列,也能夠是逗號分隔的屬性名稱列表。
databaseId 若是配置了 databaseIdProvider,MyBatis 會加載全部的不帶 databaseId 或匹配當前 databaseId 的語句;若是帶或者不帶的語句都有,則不帶的會被忽略。 

sql緩存

這個元素能夠被用來定義可重用的 SQL 代碼段,能夠包含在其餘語句中。它能夠被靜態地(在加載參數) 參數化. 不一樣的屬性值經過包含的實例變化。例如:安全

<sql id="table"> tbl_sales_activities </sql>
<sql id="Base_Column_List" >
    ID, VERSION, CREATE_TIME, UPDATE_TIME, ADTYPE, MARKET_CHANNEL, AD_MASTER, AD_MATERIAL_ID,
</sql>
<sql id="condition_sql">
    <if test="activityId != null and activityId != ''"> and ACTIVITY_ID = #{activityId}</if>
    <if test="activityName != null and activityName != ''"> and ACTIVITY_NAME  LIKE CONCAT('%' ,CONCAT(#{activityName},'%')) </if>
    <if test="adtype != null and adtype != ''"> and ADTYPE = #{adtype}</if>
</sql>

如上三個sql聲明,能夠在其餘sql語句中直接引用session

  <select id="listPage" parameterType="java.util.Map" resultMap="BaseResultMap">
    select <include refid="Base_Column_List" /> from
    <include refid="table" />
    <where>
      <include refid="condition_sql" />
    </where>
  </select>

 Result Mapsmybatis

 ResultMap 的設計思想是,簡單的語句不須要明確的結果映射,而複雜一點的語句只須要描述它們的關係就好了。app

  - constructor - 用於在實例化類時,注入結果到構造方法中

  • idArg - ID 參數;標記出做爲 ID 的結果能夠幫助提升總體性能
  • arg - 將被注入到構造方法的一個普通結果

  - id – 一個 ID 結果;標記出做爲 ID 的結果能夠幫助提升總體性能

  - result – 注入到字段或 JavaBean 屬性的普通結果

  - association – 一個複雜類型的關聯;許多結果將包裝成這種類型 

  嵌套結果映射 – 關聯能夠指定爲一個 resultMap 元素,或者引用一個
- collection – 一個複雜類型的集合
  嵌套結果映射 – 集合能夠指定爲一個 resultMap 元素,或者引用一個
- discriminator – 使用結果值來決定使用哪一個 resultMap
  case – 基於某些值的結果映射:一個 case 也是一個映射它自己的結果,所以能夠包含不少相 同的元素,或者它能夠參照一個外部的 resultMap。

<!--  Result Map -->
<resultMap id="detailedBlogResultMap" type="Blog">
  <constructor>
    <idArg column="blog_id" javaType="int"/>
  </constructor>
  <result property="title" column="blog_title"/>
  <association property="author" javaType="Author">
    <id property="id" column="author_id"/>
    <result property="username" column="author_username"/>
    <result property="password" column="author_password"/>
    <result property="email" column="author_email"/>
    <result property="bio" column="author_bio"/>
    <result property="favouriteSection" column="author_favourite_section"/>
  </association>
  <collection property="posts" ofType="Post">
    <id property="id" column="post_id"/>
    <result property="subject" column="post_subject"/>
    <association property="author" javaType="Author"/>
    <collection property="comments" ofType="Comment">
      <id property="id" column="comment_id"/>
    </collection>
    <collection property="tags" ofType="Tag" >
      <id property="id" column="tag_id"/>
    </collection>
    <discriminator javaType="int" column="draft">
      <case value="1" resultType="DraftPost"/>
    </discriminator>
  </collection>
</resultMap>

緩存

  Mybatis 使用到了兩種緩存:本地緩存(local cache)和二級緩存(second level cache)。
  本地緩存:每當一個新 session 被建立,MyBatis 就會建立一個與之相關聯的本地緩存。任何在 session 執行過的查詢語句自己都會被保存在本地緩存中,那麼,相同的查詢語句和相同的參數所產生的更改就不會二度影響數據庫了。本地緩存會被增刪改、提交事務、關閉事務以及關閉 session 所清空。

  二級緩存:默認狀況下是沒有開啓二級緩存,能夠加強變現並且處理循環 依賴也是必須的。要開啓二級緩存,你須要在你的 SQL 映射文件中添加一行: 

<cache/>

實現的效果以下:

  • 映射語句文件中的全部 select 語句將會被緩存。
  • 映射語句文件中的全部 insert,update 和 delete 語句會刷新緩存。
  • 緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。
  • 根據時間表(好比 no Flush Interval,沒有刷新間隔), 緩存不會以任什麼時候間順序 來刷新。
  • 緩存會存儲列表集合或對象(不管查詢方法返回什麼)的 1024 個引用。
  • 緩存會被視爲是 read/write(可讀/可寫)的緩存,意味着對象檢索不是共享的,而 且能夠安全地被調用者修改,而不干擾其餘調用者或線程所作的潛在修改

也能夠經過改變其中的參數來達到不一樣的緩存效果。

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

自定義緩存

也能夠經過實現其餘緩存或第三方緩存方案,建立適配器來徹底覆蓋緩存行爲。若是自定義緩存實現則必須實現 org.mybatis.cache.Cache接口。

public interface Cache {
  String getId();
  int getSize();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  boolean hasKey(Object key);
  Object removeObject(Object key);
  void clear();
}

以下MybatiesRedisCache類實現了cache接口,在對應的Mapper定義文件中,首先經過標籤<cache>將MybatiesRedisCache引入,而後針對各類操做 select、insert、upate和delete經過標籤flushCache和useCache兩個標籤來配置數據庫操做利用緩存狀況。

<cache type="com.gw.common.core.mybatis.cache.redis.MybatiesRedisCache" />
...
<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/> 
相關文章
相關標籤/搜索