版本未知
spring全局配置檔案mybatis-config.xml:
1、開發工具引入本地的全局配置檔案:dtd限制,自動提示
1.1、properties引入外部properties配置檔案,resource引入類路線下資源,url引網絡連接配接或磁盤路徑下資源
<properties url=""/> 從配置檔案中讀取值<property name="" value="${值}"/>
1.2settings設定項
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的值)
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.執行增删改查
1、調用DefaultSqlSession增删改查
2、建立StatementHandler
(同時建立ParameterHandler,ResultSetHandler)
3、調用StatementHandler預編譯參數以及設定參數值
使用ParameterHandler給sql設定參數
4、調用StatementHandler增删改查
5、ResultSetHandler封裝結果
四大對象:
executor、parameterHandler、ResultSetHandler、StatementHandler
細化
1、擷取sqlsessionFactory
解析檔案的資訊儲存到Configuration中,傳回Configuraation的DefaultSqlSession對象;【mappedStatement】代表一個增删改查的詳細資訊
2、擷取sqlSession
3、擷取接口代理對象MapperProxy
4、執行增删改查
插件開發:
原理:
四大對象建立時:
1、每個 建立出來的對象不是直接傳回
而是interceptorChain.pluginAll(parameterHandler)
2、擷取到所有Interceptor(攔截器、插件需要實作接口)
調用interceptor.plugin(target)傳回target包裝後的對象
3、插件機制,使用插件為目标對象建立代理對象:AOP
插件為四大對象建立出代理對象、代理對象攔截對象的每一個執行
編寫:實作Interceptor,添加@Intercepts完成插件簽名,注冊到全局配置檔案
1、intercept攔截目标對象的目标方法的執行
2、plugin包裝目标對象:為對象建立代理對象并傳回
3、setProperties将插件注冊時的property設計進來,插件配置資訊
注解:type要攔截哪個對象,method哪個方法,args目前方法的參數清單
多個插件會産生多層代理,安裝插件配置順序建立層層代理對象,執行目标方法後,按照逆向順序執行
常見的插件:
PageHelper插件、批量操作、存儲過程、typeHandler處理枚舉等
批量:預編譯sql一次,設定參數*次,執行1次;非批量:預編譯一次設定一次執行一次;ExecutorType.BATCH;
與spring整合
使用,service實作類中引入SqlSession,調用sqlSession.getMapper方法
存儲過程:
oracle分頁執行個體:不全
先建存儲過程
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>