【MyBatis】MyBatis基礎+原理流程圖

版本未知java

spring全局配置文件mybatis-config.xml:

一、開發工具引入本地的全局配置文件:dtd約束,自動提示mysql

      1.一、properties引入外部properties配置文件,resource引入類路線下資源,url引網絡鏈接或磁盤路徑下資源spring

    <properties url=""/> 從配置文件中讀取值<property name="" value="${值}"/>sql

 

1.2settings設置項

   

 

1.3typeAliase別名(不區分大小寫),java Bean 起別名,type全類名,默認類名小寫,alias別名;package爲包下類起別名、默認類小寫,此狀況下還能夠在類上使用@Alias註解數據庫

 

1.4environments環境,可多種具體環境信息;緩存

     id標識,transactionManager事務管理器,type類型;dataSource數據源,type類型網絡

 

1.5databaseIdProvider:多數據庫支持session

    type數據庫廠商標識獲取數據庫執行不一樣sql,配置文件中mybatis

           <property name = "MYSQL" value="mysql"/>起value別名標識 oracle

     mapper.xml文件的select等標籤內利用databaseId標識別名、執行

 

1.6mapper將映射註冊到全局配置中,resource=「類路徑下的映射文件」,url同上

     class引用註冊接口,=接口全類名:

          一、有sql映射文件,映射文件名須要與接口同名且同一目錄

           二、無映射文件,sql利用註解寫在接口上@Select

     package批量註解,name=包全路徑,mapper和xml都放裏面

 

映射文件

    一、參數處理

       #{}預編譯形式,參數設置到sql中,PreparedStatement防止sql注入,原生jdbc不支持;${}直接拼接

   二、select

 返回map<String,Object>,resultType=「map」;返回Map<String,*Model>,resultType="*Model',接口方法添加@MapKey("id")標識哪一個屬性做爲map的key

  三、關聯查詢、嵌套結果集

        result標籤的collection或association(另 利用property  select column分步查詢)

 四、延遲加載:lazyLoadingEnabled(true)、aggressiveLazyLoading(false),顯示指定配置值,即便是默認的,防止版本更新

     五、鑑別器:使用discriminator判斷某列的值,根據該值改變封裝行爲、返回值

 

動態sql:if  choose  trim  foreach

     一、if

           test表達式、OGNL:特殊符號寫轉移字符

     where

      二、choose:<where>標籤中,when、otherwise

      三、trim:整個,prefix、prefixOverrides前綴覆蓋、suffix、suffixOverrides

     四、foreach:collection、item、separator、open、close、index (遍歷list時index是索引,item是當前值;遍歷map時index是map的key,item是map的值)

          

          

       set標籤

       內置參數:

             

      bind:將表達式綁定到變量

          <bind name="_lastName" value=" ‘%’+lastName+‘%’ "/>

          ……like #{_lastName}

     sql片斷:抽取可重用的片斷,include引用(自定義參數${},要對應上)

    

緩存機制:

    一級緩存:本地緩存,與數據庫同一次會話期間查詢到的數據,sqlSession級別,一直開啓

         失效:SQLSession不一樣,sqlSession同參數不一樣或兩次查詢間執行了增刪改,清緩存

    二級緩存:全局緩存,基於namespace

          一個會話(查詢)數據保存當前會話一級緩存,會話關閉數據保存到二級緩存

          全局配置開啓cacheEnabled:true,xml添加<cache />下面是元素,不寫即默認

             eviction:回收策略 LRU  FIFO  SOFT  WEAK ;flushInterval、readOnly:true從緩存中去數據都是隻讀,false序列化反序列化克隆一份新數據;size放多少元素、type全類名,實現Cache接口便可

 

     每一個select標籤有useCache,false不使用二級緩存,一級依然使用

     每一個增刪改標籤都有flushCache,true執行完清除緩存(都)

 

  

   ehcache:引入jar或座標,添加配置文件,xml文件中cache的type指向org.mybatis.caches.ehcache.EhcacheCache

 

與spring整合:

     逆向生成工具:

           context targetRuntime:生成一套什麼樣的模板

           jdbcConnection如何鏈接到目標數據庫;javaTypeResolver:類型解析器;javaModelGenerator:javaBean生成策略;sqlMapGenerator:sql映射生成策略;javaClientGenerator:指定mapper接口所在位置;table:指定要逆向分析哪些表

原理:

    總流程:

        1.根據配置文件(全局、sql映射)初始化configuration對象

        2.建立一個defaultSqlSession對象

               包含Configuration及Executor(根據全局配置文件中defaultExecutorType建立對應的Executor)

       3.DefaultSqlSession.getMapper拿到Mapper接口對應的MapperProxy

       4.MapperProxy裏有DefaultSqlSession

       5.執行增刪改查

             一、調用DefaultSqlSession增刪改查

             二、建立StatementHandler

                 (同時建立ParameterHandler,ResultSetHandler)

             三、調用StatementHandler預編譯參數以及設置參數值

                   使用ParameterHandler給sql設置參數

             四、調用StatementHandler增刪改查

             五、ResultSetHandler封裝結果

 

四大對象:

      executor、parameterHandler、ResultSetHandler、StatementHandler

 

 

細化

一、獲取sqlsessionFactory

     解析文件的信息保存到Configuration中,返回Configuraation的DefaultSqlSession對象;【mappedStatement】表明一個增刪改查的詳細信息

 

二、獲取sqlSession

三、獲取接口代理對象MapperProxy

四、執行增刪改查

 

插件開發:

 

   原理:

      四大對象建立時:

         一、每一個 建立出來的對象不是直接返回

                 而是interceptorChain.pluginAll(parameterHandler)

         二、獲取到全部Interceptor(攔截器、插件須要實現接口)

                  調用interceptor.plugin(target)返回target包裝後的對象

         三、插件機制,使用插件爲目標對象建立代理對象:AOP

                   插件爲四大對象建立出代理對象、代理對象攔截對象的每個執行

   

   編寫:實現Interceptor,添加@Intercepts完成插件簽名,註冊到全局配置文件

        一、intercept攔截目標對象的目標方法的執行

        二、plugin包裝目標對象:爲對象建立代理對象並返回

        三、setProperties將插件註冊時的property設計進來,插件配置信息

        註解:type要攔截哪一個對象,method哪一個方法,args當前方法的參數列表

    多個插件會產生多層代理,安裝插件配置順序建立層層代理對象,執行目標方法後,按照逆向順序執行

 

   常見的插件:

      PageHelper插件、批量操做、存儲過程、typeHandler處理枚舉等

      批量:預編譯sql一次,設置參數*次,執行1次;非批量:預編譯一次設置一次執行一次;ExecutorType.BATCH;

        與spring整合

      

         使用,service實現類中引入SqlSession,調用sqlSession.getMapper方法

   存儲過程:

         oracle分頁實例:不全

          先建存儲過程

      

       mybatis配置:

<!--
一、使用select標籤訂義存儲過程
二、statementType=「CALLABLE」:要調用的存儲過程
三、in輸入,out輸出,cursor遊標,resultSet結果集,resultMap如何封裝結果集
-->
<select id="getPageByProcedure" statementType="CALLABLE" databaseId="oracle">
	{call hello_test(
	  #{start,mode=IN,jdbcType=INTEGER},
	  #{end,mode=IN,jdbcType=INTEGER},
	  #{count,mode=OUT,jdbcType=INTEGER},
	  #{emps,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=javaModel}
	)}
</select>

<resultMap type="**.**.**.bean.JavaModel" id="javaModel">
    <id column="EMPLOYEE_ID" property="id"/>
	<resul column="LAST_NAME" property="email"/>
	<resul column="EMAIL" property="emial"/>
</resultMap>