Mybatis的核心在於三部分:jdbc傳入參數和結果與java類型之間的轉換,動態SQL的生成,數據庫連接和事務的管理
Mybatis的配置和hibernate類似,包括兩種:基於註解和基於xml文件,前者可以做到無配置,但是缺點是不夠靈活,xml文件的方式更加靈活,可以滿足所有情況,因此還是將主要精力放在xml的方式上。
1、Mybatis的主要流程和核心概念之間的關係
(1)SqlSessionFactoryBuilder讀取配置信息生成SqlSessionFacotry,配置信息主要是通過讀取配置文件mybatis-config.xml得到的,也可以通過其他方式。
(2)通過SqlSessionFacotory可以獲得SqlSession
(3)SqlSession可以調用具體的sql語句進行執行,sql語句則通過讀取mapper xml文件得到
(4)最核心的地方就是sql語句的動態生成,以及參數的傳入和查詢結果的轉化,這些都是Mybatis通過配置可以處理的,使用Mybatis主要在這三部分的編寫
2、Mybatis的配置文件mybatis-config.xml
通過xml配置文件的形式配置一些Mybatis的全局信息,例如數據源、typehandler之類的,可以再構造時指定文件路徑,不過mybatis-config.xml是默認的名字,可配置的主要信息如下:
(1)properties,配置一些屬性值,全局都可以使用
(2)settings,配置Mybatis運行時一些關鍵屬性的設置,包括設置緩存、懶加載、使用生成主鍵之類的,可以看文檔瞭解
(3)typeAliases,定義一些全局的別名
(4)typeHandlers,配置一些全局的類型處理器,Mybatis在數據庫類型和java類型進行值轉化時所使用,主要是java類型參數傳入轉化爲數據庫類型,查詢結果從數據庫類型轉化爲java類型。Mybatis自帶一些默認的typeHandler,處理常見的類型,例如字符串、布爾值、日期等等。該配置文件中用戶自定義一些全局的typeHandler,Mybatis會在類型轉化時自動尋找,typeHandler也可以在mapper xml文件中配置,不過只是針對具體字段起作用。typeHandler核心在於指定javaType,jdbcType和具體的處理器
(5)plugins,Mybatis允許用插件的方式對sql語句的生成和執行進行攔截,做一些處理。其中ResultSetHandler,StatementHandler是在meet-mybatis中用來處理分頁,對生成的sql語句進行處理
(6)environments,和mavne中的profiles類似,都是定義一些environment,以ID區分,然後默認激活一種環境,environment中可以配置數據源datasource和事務管理器transactionManager
(7)mappers:定義需要加載的mapper xml文件,只有定義了該標籤SqlSession才能更具id找到對應的sql語句執行。在mybatis-spring使用方式中,可以直接以屬性方式配置給SqlSessionFactory
3、最核心文件Mapper XML
Mapper XML定義了具體執行的sql語句,緩存,定義傳入參數和查詢結果的轉化方式
(1)select標籤,定義查詢語句,關鍵的屬性包括:
參數 | 說明 |
---|---|
parameterType | 定義傳入參數的類型 |
resultType | 定義返回結果的類型 |
resultMap | 定義處理結果轉換的resultMap |
flushCache | 設置爲true,語句被調用時緩存被清空,默認false |
useCache | 設置爲true,將把本語句的返回結果緩存,默認true |
timeout | 設置驅動程序等待數據庫返回請求結果並拋出異常時間的最大等待值,默認不設置 |
fetchSize | 設置驅動程序每次批量返回的結果行數,默認不設置 |
resultSetType |
FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE的一種,默認不設置。 sqlSession的select方法中指定RowRounds進行分頁查詢時,不要設置爲FORWARD_ONLY,否則一條條遍歷直到偏移位置纔讀取 |
(2)insert標籤定義增加操作,核心在於參數的傳入。除了和select一些公共屬性外,關鍵屬性還包括
參數 | 說明 |
---|---|
useGeneratedKeys | 數據庫支持自動生成主鍵,則可以設置爲true,那麼生成的主鍵就會設置到目標屬性上 |
keyProperty | 設置生成主鍵映射到的目標屬性 |
(3)delete和update標籤定義刪改操作,核心在於參數的傳入,除了公共屬性,沒有額外屬性
(4)sql可以定義重用的sql代碼段,供其他標籤通過<include refid="XXX"/>導入
(5)參數的傳入,主要採用parameterType定義,不僅可以指定基本類型,還可以指定自定義類型。主要格式就是#{參數,javaType,jdbcType,typeHandler},也可以定義numericScale主要是數值型進行轉化時保留精確度,#{}會自動裝入對應屬性的值拼成sql,特殊需求下${}可以直接傳入字符串而不會發生值替換,這種情況容易導致sql注入***,因此不提倡。
(6)最最核心的就是resultMap標籤,查詢是數據庫最主要的功能,通常情況下,可以通過resultType指定返回結果類型,Mybatis會更具字段名稱和類型,調用對應的typeHandler進行轉換,但是對於複雜的查詢結果,特別是多表關聯查詢時,比較複雜。在resultMap中id和result將具體字段和屬性的值進行對應,它們可以自由的定義列的類型、屬性的類型及處理器。其中比較有用的幾個標籤如下
標籤 | 說明 |
---|---|
constructor | 構造函數的傳入屬性 |
association | 屬性關聯的是複雜類型,相當於嵌套resultMap |
collection | 屬性關聯的是集合 |
discriminator | 根據值,返回結果對應的java類型,相當於switch的錯誤,轉給其他resultMap處理 |
(7)cache標籤,定義緩存。Mybatis的緩存分爲兩種:session局部緩存,是在sqlSession生命週期中的緩存又稱爲本地緩存,cache相當於二級緩存,作用在當前Mapper XML範圍內,默認不開啓,開啓只需添加<cache/>即可,
當前xml文件中所有select語句都將緩存,insert,update和delete語句都會刷新緩存,默認使用LRU算法,可以通過eviction來定義,刷新時間可通過flushInterval定義,size定義緩存的結果集的數量,readOnly定義
4、動態SQL
Mybatis相比jdbc的一大優勢就是sql語句可以通過標籤,判斷條件動態生成sql語句,不用java代碼中手動拼接。核心的四個標籤名稱:if,choose(when,otherwise),trim(where,set),foreach
5、Java API,連接的生成和事務的管理
(1)SqlSessionFactory提供openSession來提供SqlSession,openSession可以設置事務級別,執行方式,連接來源來生成連接。默認會開啓事務,不自動提交,連接對象從配置的datasource獲取,事務隔離級別採用驅動或數據源的設置,預處理語句不被複用,也不會批量處理。預處理語句應該是preparedstatement預編譯語句,可能是同一個連接中語句相當預處理過的不會被複用。批量則是不支持在一個sqlsession中進行批量增刪改,如果要用一個sqlsession進行批量更新,還是設置ExecutorType,效率會提高
(2)特別要注意,sqlSession提供的select語句,分頁時,設置RowBounds,select的sql語句對應resultSetType一定不能是FORWARD_ONLY,否則一條條遍歷直到偏移量,在取指定的記錄數
(3)事務管理方面,Mybatis-Spring插件將Mybatis的事務管理交給Spring去做,如果外部框架不提供事務管理,那麼sqlSession也提供commit和rollback來控制事務
(4)clearCache清理session級別的緩存,update,commit,rollback和close會自動調用
(5)除非上層管理,sqlSession在使用後一定要close來釋放資源