映射器是mybatis強大的工具,也是mybatis核心工具。
html
mybatis是針對映射器構造的SQL構建的輕量級框架,經過配置生成對應的JavaBean返回給調用者,然而mybatis配置的核心就是映射器的配置。
spring
mybatis映射器包含一些重要的元素,經過這些元素的配置實現映射器相應的功能。mybatis的元素分類以下表所示:
sql
接下來對於映射器的每個元素,咱們進行深刻的分析。數據庫
一 select元素緩存
1 select元素的配置參數
session
2 自動映射數據結構
select元素下有一個autoMappingBehavior參數,經過配置該參數的值來設置其策略。mybatis提供自動映射功能,只要返回的SQL列名和JavaBean的屬性一致,mybatis幫助咱們回填這些字段而不需任何配置。
mybatis
(1)NONE,取消自動映射app
(2)PARTIAL(默認),只會自動映射,沒有定義嵌套結果集映射的結果集框架
(3)FULL,自動映射任意複雜的結果集(不管是否嵌套)
3 傳遞多個參數給映射器
(1)Map:Map致使業務可讀性的喪失,從而致使後續擴展和維護困難。
(2)註解方式:受到參數個數的影響,當參數個數小於等於5個,它是最佳傳參方式,比Javabean更加直觀;反之多個參數增大調用的難度。
(3)JavaBean:參數過多的狀況下較爲合適。
二 insert元素
1 元素配置:id、parameterType、parameterMap、flushCache、timeout、statementType、databaseId與select元素的做用一致,除此以外還有四個特殊的參數配置:
(1)keyProperty:表示以哪一個列做爲屬性的主鍵,不能和keyColumn同時使用,如果聯合主鍵,用逗號隔開;
(2)useGeneratedKeys:令mybatis使用JDBC的getGeneratedKeys方法來取出由數據庫內部生成的主鍵,取值爲true/false,默認爲false;
(3)keyColumn:指明第幾列是主鍵,不能和keyProperty同時使用,只接受整形參數,聯合主鍵用逗號隔開;
(4)lang:自定義語言,可以使用第三方語言。
2 自定義主鍵(示例)
<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select if(max(id) is null, 1, max(id) + 2) as newId from t_role </selectKey> insert into t_role(id, role_name, note) values (#{id}, #{roleName}, #{note}) </insert>
三 update和delete元素
mybatis執行完update元素和delete元素後會返回一個整數,標出執行後影響的記錄條數。
示例
<update parameterType"role" id="updateRole">
update t_role set
role_name = #{roleName},
note = #{note}
Where id= #{id}
</update>
<delete id="delete" parameterType="long">
delete from t_role where id= #{id}
</delete>
五 sql元素
sql元素能定義一串SQL語句的組成部分,其餘語句經過引用來使用它,達到複用的做用。
示例:
<sql id="role_columns"> #{prefix}.role_no, #{prefix}.role_name, #{prefix}.note </sql> <select parameterType="string" id="getRole" resultMap="roleResultMap" select <include refid="role_columns"> <property name="prefix" value="r"/> </include> from t_role r where role_no = #{roleNo} </select>
六 resultMap(結果映射集)
1 resultMap構成
<resultMap> <constructor> <idArg/> <arg/> </constructor> <id/> <result/> <association/> <discriminator> <case/> </discriminator> </resultMap>
2 存儲結果集
(1)使用Map:任何的select均可以使用map存儲
<select id="findColorByNote" parameterType="string" resultType="map"> select id, color, note from t_role where note like concat('%', #{note}, '%') </select>
(2)POJO:經常使用的方式,能夠使用自動映射,也能夠使用select語句的屬性resultMap配置映射集合,知識使用前須要配置相似的resultMap
1)配置resultMap
<resultMap id="roleResultMap" type="con.liming.domain.pojo.Role"> <id property="id" column="id"/> <result property="roleName" column="role_name"/> <result property"note" column="note"/> </resultMap>2)使用配置好的resultMap
<select parameterType="long" id="getRole" resultMap="roleResultMap"> select id, role_name, note from t_role where id=#{id} </select>
3 級聯
(1)association:一對一關聯,例如公民與身份證的關係
(2)collection:一對多關聯,例如班級和學生的關係
(3)discriminator:鑑別器,根據特定的條件關聯不一樣的結果集
七 緩衝:互聯網系統經常使用,特色是將數據存儲到內存中。
1 系統緩存:分爲一級緩存和二級緩存
(1)一級緩存:SqlSession級別的緩衝,操做數據庫時須要購置sqlSession對象,在對象中以數據結構HashMap存儲緩存數據,不一樣的SqlSession之間的緩存數據區域(HashMap)是互不影響的。
1)工做原理:
第一次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有id爲1的用戶信息,若是沒有,從數據庫查詢用戶信息。獲得用戶信息,將用戶信息存儲到一級緩存中。
第二次發起查詢用戶id爲1的用戶信息,先去找緩存中是否有id爲1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
2)應用:
mybatis和spring進行整合開發,事務控制在service中。一個service包括許多mapper方法調用。
service{
//開始執行時,開啓事務,建立SqlSession對象
//第一次調用mapper的方法findUserById(1)
//第二次調用mapper的方法findUserById(1),從一級緩存中取數據
//方法結束,sqlSession關閉
}
若是是執行兩次service調用查詢相同的用戶信息,不走一級緩存,由於session方法結束,sqlSession就關閉,一級緩存就清空。
(2)二級緩存:是mapper級別的緩存,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession能夠共享二級緩存,二級緩存跨SqlSession。
1)工做原理:
首先開啓mybatis的二級緩存。
sqlSession1去查詢用戶id爲1的用戶信息,查詢到用戶信息會將查詢數據存儲到二級緩存中。
sqlSession2去查詢用戶id爲1的用戶信息,去緩存中找是否存在數據,若是存在直接從緩存中取出數據。
若是SqlSession3去執行相同mapper下sql,執行commit提交,清空該 mapper下的二級緩存區域的數據。
2)區別:
二級緩存的範圍更大,多個sqlSession能夠共享一個UserMapper的二級緩存區域。
UserMapper有一個二級緩存區域(按namespace分),其它mapper也有本身的二級緩存區域(按namespace分)。
每個namespace的mapper都有一個二緩存區域,兩個mapper的namespace若是相同,這兩個mapper執行sql查詢到數據將存在相同的二級緩存區域中。
2 自定義緩存
(1)配置自定義緩存:<cache type="com.liming.domain.MyCache"/>
(2)設置自定義緩存參數:
<cache type="com.liming.domain.MyCache"> <property name="host" value="localhost/> </cache
mybatis的核心就是映射器,而映射器的重點是如何配置映射器,也就是如何經過配置文件執行映射器。mybatis的級聯和緩存以及爲了解決由緩存引發的N+1問題而提出的延遲加載等知識點,都是學習mybatis必需要掌握的知識。