在日常的後端開發中,使用mybatis作為DAO層的持久框架已經是慣例。但很多時候都是在別人搭好的框架中進行開發,對怎麼搭建環境是一知半解,今天就來實踐下。
來看下整合mybatis需要哪些步驟,
1、確定環境及依賴
2、組態檔;
3、測試
這裡,基於springboot整合mybatis。先看下具體的版本,
springboot:2.3.3.RELEASE
mybatis-spring-boot-starter:2.3.0
mysql驅動:8.0.32
下面具體看下這些依賴,spring-boot自不用說,就是在這個環境下的;
mybatis-spring-boot-starter
mybatis-spring-boot-starter是針對mybatis和spring-boot整合而開發的一個依賴,裡邊包含了所需的依賴,方便整合,其實spring官方還有很多這樣的starter,例,
可以看到官方提供了很多starter供開發者使用。怎麼沒看到mybatis-spring-boot-starter吶,不急,它不是官方提供的,而是mybatis官方提供的,多提一句,對於starter的命名官方也給出了這樣的建議,官方提供的spring-boot-starter-*,而第三方的則是thirdpartyproject-spring-boot-starter,
詳見:https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/pdf/spring-boot-reference.pdf
你想建立自己的starter嗎,可以在文末「推薦閱讀」裡找到相關的博文。
mysql驅動也不用說,要使用程式存取mysql,自然少不了mysql的驅動。
用一張圖來描述下,springboot下整合mybatis的一個邏輯流程,
我們都知道,可以在程式中直接使用JDBC存取mysql,也可以使用mybatis存取mysql,在spring的環境下則通過mybatis-spring存取mysql。從圖中可以看到存取路徑更長了,那整合mybatis的意義是什麼,答案是使用更簡單,還記得剛學習的時候使用JDBC的噩夢嗎?
看下,引入的依賴,我這裡使用父子專案,採用在父pom中管理依賴,子pom使用的原則。
父pom.xml
<!--mybatis-spring-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!--mysql的驅動-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
子pom.xml這裡不再列出,看下最終的依賴,
可以看到mybatis-spring-boot-starter中已經包含了mybatis、mybatis-spring等依賴,mybatis依賴不用單獨引了。換句話說,在spring-boot中整合mybatis且連線mysql使用下面兩個依賴即可,
1、mybatis-spring-boot-starter
2、mysql-connector-j
存取其他資料庫換掉驅動即可。
我們知道使用mybaits的目的是存取資料庫,而且mybatis存取資料庫使用的是JDBC驅動的方式,那麼設定的話,可以分為兩塊,
1、mybatis設定
2、JDBC組態檔
使用過mybatis的都瞭解,mybatis是基於xml的,使用xml來寫sql實現資料庫的存取,java是物件導向的,所以要操作檔案,或者說呼叫xml中的方法需要一個物件,這個物件就是Mapper介面,所以,mybatis的組態檔有兩塊,一個是設定xml,另一個就是告訴mybatis將xml對映到哪些介面中。
application.yml中設定mybatis的xml
mybatis:
mapper-locations: classpath*:mapper/*.xml
這些xml檔案在resource資料夾下,
接下來就是mapper介面,使用@MapperScan註解,在啟動類上設定掃描的包
這樣就完成了mybatis的設定。接下來就是JDBC的設定。
結合之前使用JDBC的經驗,我們知道要建立一個JDBC連線需要知道資料庫驅動名,連線URL、使用者名稱、密碼,這些就可以了。這裡也是設定這些,在application.yml中進行設定,
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: 123456
這樣JDBC的設定就可以了。上邊的具體設定需要自行修改成自己的。
有小夥伴說不對,我的設定裡還有多了一個,
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
沒錯,多的設定是datasource的型別,這裡可以不配,預設是com.zaxxer.hikari.HikariDataSource,當然了也可以指定,比如使用c3p0、druid等第三方資料庫連線池,這都是可以的(前提引入相關依賴)。不設定預設使用下面三個中的一個,有興趣的可以看下org.springframework.boot.jdbc.DataSourceBuilder類的實現,
以上,就完成設定。經過這幾步就完成了mybatis和spring-boot的整合,是不是很好奇為什麼這麼簡單?下面簡單分析下。
講這個問題之前,先要達成一個共識:spring是一個bean的容器,管理bean的生命週期。
來看下mybatis中的Mapper介面,該介面會被範例化為一個代理物件,在代理物件中有一個sqlSession的變數,該變數是SqlSessionTemplate型別的,SqlSessionTemplate是mybatis中的類,
它是怎麼被注入到spring管理的類中,答案是通過MybatisAutoConfiguration這個類,該類在mybatis-spring-boot-starter中,有這樣一個方法,
該方法會生成一個sqlSessionTemplate,這樣就可以和mybatis聯絡在一起了,而更有意思的是下面這個方法,生成sqlSessionFactory的方法,追蹤該方法可以看到mybatis的原始碼中,並熟悉整個流程。
感興趣的小夥伴可以自己看下原始碼哦,同時也可以看「推薦閱讀」中有關mybaits原始碼的分析。
五、總結
關於spring-boot整合mybatis的有關問題就分享到這兒了,遵循下面幾點,
1、新增相關依賴,mybatis-spring-boot-starter、資料庫驅動;
2、mybatis的設定,掃描mapper介面、載入xml檔案;
3、資料來源設定,驅動類、url、user、password等;
最後,本文用到的原始碼均可關注下方公眾號獲得,歡迎與志同道合的你一起交流學習。
推薦閱讀