mybatis框架(四)——強大的映射器

引言

            映射器是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)應用:

mybatisspring進行整合開發,事務控制在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必需要掌握的知識。