SQL 映射文件有不多的幾個頂級元素(按照它們應該被定義的順序):java
Selectredis
最基本的查詢語句,能夠配置一些屬性來決定每個細節,相關屬性以下:算法
屬性 | 描述 |
---|---|
id | 在命名空間中惟一的標識符,能夠被用來引用這條語句。 |
parameterType | 將會傳入這條語句的參數類的徹底限定名或別名。這個屬性是可選的,由於 MyBatis 能夠經過 TypeHandler 推斷出具體傳入語句的參數,默認值爲 unset。 |
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。 |
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 - 用於在實例化類時,注入結果到構造方法中
- 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/>
實現的效果以下:
也能夠經過改變其中的參數來達到不一樣的緩存效果。
<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"/>