天天看點

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

版本未知

spring全局配置檔案mybatis-config.xml:

1、開發工具引入本地的全局配置檔案:dtd限制,自動提示

      1.1、properties引入外部properties配置檔案,resource引入類路線下資源,url引網絡連接配接或磁盤路徑下資源

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

1.2settings設定項

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

1.3typeAliase别名(不區分大小寫),java Bean 起别名,type全類名,預設類名小寫,alias别名;package為包下類起别名、預設類小寫,此情況下還可以在類上使用@Alias注解

1.4environments環境,可多種具體環境資訊;

     id辨別,transactionManager事務管理器,type類型;dataSource資料源,type類型

1.5databaseIdProvider:多資料庫支援

    type資料庫廠商辨別擷取資料庫執行不同sql,配置檔案中

           <property name = "MYSQL" value="mysql"/>起value别名辨別 

     mapper.xml檔案的select等标簽内利用databaseId辨別别名、執行

1.6mapper将映射注冊到全局配置中,resource=“類路徑下的映射檔案”,url同上

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

          1、有sql映射檔案,映射檔案名需要與接口同名且同一目錄

           2、無映射檔案,sql利用注解寫在接口上@Select

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

映射檔案

    1、參數處理

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

   2、select

 傳回map<String,Object>,resultType=“map”;傳回Map<String,*Model>,resultType="*Model',接口方法添加@MapKey("id")辨別哪個屬性作為map的key

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

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

 4、延遲加載:lazyLoadingEnabled(true)、aggressiveLazyLoading(false),顯示指定配置值,即使是預設的,防止版本更新

     5、鑒别器:使用discriminator判斷某列的值,根據該值改變封裝行為、傳回值

動态sql:if  choose  trim  foreach

     1、if

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

     where

      2、choose:<where>标簽中,when、otherwise

      3、trim:整個,prefix、prefixOverrides字首覆寫、suffix、suffixOverrides

     4、foreach:collection、item、separator、open、close、index (周遊list時index是索引,item是目前值;周遊map時index是map的key,item是map的值)

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

       set标簽

       内置參數:

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

      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執行完清除緩存(都)

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

   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.執行增删改查

             1、調用DefaultSqlSession增删改查

             2、建立StatementHandler

                 (同時建立ParameterHandler,ResultSetHandler)

             3、調用StatementHandler預編譯參數以及設定參數值

                   使用ParameterHandler給sql設定參數

             4、調用StatementHandler增删改查

             5、ResultSetHandler封裝結果

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

四大對象:

      executor、parameterHandler、ResultSetHandler、StatementHandler

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

細化

1、擷取sqlsessionFactory

     解析檔案的資訊儲存到Configuration中,傳回Configuraation的DefaultSqlSession對象;【mappedStatement】代表一個增删改查的詳細資訊

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

2、擷取sqlSession

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

3、擷取接口代理對象MapperProxy

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

4、執行增删改查

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

插件開發:

   原理:

      四大對象建立時:

         1、每個 建立出來的對象不是直接傳回

                 而是interceptorChain.pluginAll(parameterHandler)

         2、擷取到所有Interceptor(攔截器、插件需要實作接口)

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

         3、插件機制,使用插件為目标對象建立代理對象:AOP

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

   編寫:實作Interceptor,添加@Intercepts完成插件簽名,注冊到全局配置檔案

        1、intercept攔截目标對象的目标方法的執行

        2、plugin包裝目标對象:為對象建立代理對象并傳回

        3、setProperties将插件注冊時的property設計進來,插件配置資訊

        注解:type要攔截哪個對象,method哪個方法,args目前方法的參數清單

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

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

   常見的插件:

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

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

        與spring整合

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

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

   存儲過程:

         oracle分頁執行個體:不全

          先建存儲過程

【MyBatis】MyBatis基礎+原理流程圖spring全局配置檔案mybatis-config.xml:映射檔案動态sql:if  choose  trim  foreach緩存機制:與spring整合:原理:插件開發:

       mybatis配置:

<!--
1、使用select标簽定義存儲過程
2、statementType=“CALLABLE”:要調用的存儲過程
3、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>