MyBatis實戰總結

前言:MyBatis的前身是iBatis,它是一個數據持久層框架。封裝優化了普通JDBC的過程,如數據庫鏈接的建立、設置SQL語句參數、執行SQL語句、事務、結果映射以及資源釋放等。java

MyBatis是一個支持普通SQL查詢、存儲過程和高級映射的優秀持久層框架,使用簡單的XML或註解用於配置和原始映射,將POJO和數據庫記錄進行相互映射。 MyBatis框架分析DISCOVERY 咱們知道最基礎的JDBC操做爲如下七個步驟: (1)加載JDBC驅動 (2)創建並獲取數據庫鏈接 (3)建立JDBC Statement對象 (4)設置SQL語句的傳入參數 (5)執行SQL語句並得到結果 (6)處理執行結果 (7)釋放相關資源spring

數據庫鏈接的建立、獲取和釋放代碼是能夠複用的,並且每一次操做都進行數據庫鏈接的建立和關閉是沒有必要的,是浪費資源和影響性能的。使用數據庫鏈接池可以很好的解決這些問題。因爲可能會使用不一樣的鏈接池,好比採用DBCP的鏈接池,或者採用容器自己的JNDI數據庫鏈接池,因此能夠經過DataSource進行解耦。 使用Spring容器進行管理的MyBatis數據庫鏈接池配置代碼如:數據庫

《bean id = "dataSource" class = "org.springframework.jndi.JndiObjectFactoryBean"》session

《property name="jndiName" value = "${DB_JNDI_NAME}"》《/property》數據結構

《/bean》mybatis

《bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"》架構

《property name="dataSource" ref="datasource" /》app

《property name="configLocation" value="classpath:/config/mybatisConfig.xml"/》框架

《/bean》工具

基礎的JDBC進行操做數據庫時,是在Java類中拼裝SQL語句進行執行。爲了更簡單易用以及更高的性能,MyBatis也是採用手寫SQL,而不是經過複雜的配置來自動生成SQL(這兩種方式的持久化框架俗稱「半自動化」和「全自動化」,MyBatis是「半自動化」的翹楚,「全自動化」的表明則是hibernate。這兩個持久化框架都很是流行,並且各有本身的長處,能夠根據需求適當應用)。SQL放在Java類裏會有不少麻煩,第一,可讀性太差了,分散在各個Java類裏不利於維護和複用;第二,改動Java代碼還要從新編譯部署。因此須要有統一的文件來存放相關的SQL。 XML文件能夠自定義標籤,並且可使用#{參數名}的佔位符來標識參數,同時能夠引入JSTL中的《if test=」」》《/if》等這樣的標籤來設置動態SQL,因此MyBatis中通常定義***Mapper.xml文件來保存SQL。在數據操做中,須要有真正的Java對象來承接外部調用。因此***Mapper.xml文件會有相對應的一個***Mapper.java接口文件,框架暴露這些Mapper對象來和服務層進行對接。 MyBatis經過約定及配置來銜接各個操做。Mapper.java類中的方法名和Mapper.xml中SQL語句的id定義成相同的進行映射;配置#{參數名}來匹配對應的參數。返回結果可能爲POJO、Map、List等類型,因此咱們須要定義清楚返回結果類型,在SQL語句中須要定義resultMap屬性值;執行的結果和返回的POJO對象的數據結構怎麼映射,在Mapper.xml文件須要配置映射的POJO對象以及屬性。 Mapper.xml、Mapper.java和POJO對象這三個文件是相輔相成的。業務開發中也通常只是須要新增這三個文件內容,數據庫鏈接和事務配置這些構架好後是不太變更的。有工具根據表結構來生成這三個文件,用不用就再說了。 整體來講,MyBatis框架定義Mapper對象來承接外部的調用,框架自己封裝了SqlSession、SqlSessionFactory來進行數據庫鏈接;封裝了StatementHandler、Executor來執行數據庫操做;封裝了ResultSetHandler來處理查詢結果。咱們只須要架構好 SqlSessionFactory的創建方式以及事務管理,根據業務提供Mapper對象。Mybatis結合Spring容器管理是一個不錯的選擇。 MyBatis使用中幾點經驗DISCOVERY 手動增量配置映射文件 當有工具生成Mapper等配置文件的時候,不少人就不肯意手動寫了。其實MyBatis的生成工具不是特別有用,生成的方法幾乎不可用,刪刪改改老半天還不如本身手寫快。並且須要新加或修改屬性、方法時,也是無法使用生成的文件,由於須要保留好原有的一些屬性和方法。手寫映射文件時先定義出用到的字段,這樣配置文件會簡潔清晰,同時結果映射時效率會更高。 Mapper層參數爲Map時,由Service層負責重載 Mapper中存在着不少相似方法,多是分別根據字段來查詢記錄,或者根據某幾個字段來查詢。因爲不能重載以及爲了減小冗餘代碼,參數通常設置成Map。但參數設爲Map會使代碼含義模糊,因此須要在service層來實現重載,對外提供的Service是代碼自解釋的。能夠根據具體的參數不一樣分別調用不一樣的service方法。 儘可能少用if choose等語句 Mybatis的配置SQL時,儘可能少用if choose 等標籤,能用SQL實現判斷的儘可能用SQL來判斷(CASE WHEN ,DECODE等),可提升查詢性能以及便於維護。 咱們來看看這樣的SQL:

SELECT * FROM USER WHERE

《choose》

《if test ="startdate != null and startdate != '' and enddate != null and enddate != '' "》

AND CREATE_DATE >= #{startdate} AND CREATE_DATE <= #{enddate}

《/if》

《otherwise》

AND CREATE_DATE >= SYSDATE - 7 AND CREATE_DATE <= SYSDATE

《/otherwise》

《/choose 》

這樣的if判斷,實際上是徹底沒有必要的,咱們能夠很簡單的採用DECODE來解決默認值問題:

SELECT * FROM USER WHERE

CREATE_DATE >= DECODE(#{startdate},NULL,SYSDATE-7, #{startdate})

AND CREATE_DATE <= DECODE(#{enddate},NULL,SYSDATE,#{enddate})

不過if與choose判斷分支是不可能徹底去除的,可是推薦使用SQL原生的方式來解決一些動態問題,而不該該徹底依賴Mybatis來完成動態分支的判斷,由於判斷分支過於複雜,並且難以維護。

注:喜歡的小夥伴能夠點贊加一波關注,一塊兒學習進步

相關文章
相關標籤/搜索