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來釋放資源