版本未知java
一、開發工具引入本地的全局配置文件:dtd約束,自動提示mysql
1.一、properties引入外部properties配置文件,resource引入類路線下資源,url引網絡鏈接或磁盤路徑下資源spring
<properties url=""/> 從配置文件中讀取值<property name="" value="${值}"/>sql
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判斷某列的值,根據該值改變封裝行爲、返回值
一、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
逆向生成工具:
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
插件爲四大對象建立出代理對象、代理對象攔截對象的每個執行
一、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>