在日常的後端開發中,使用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配置文件
3.1、mybatis配置
使用過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的配置。
3.2、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的集成,是不是很好奇爲什麼這麼簡單?下面簡單分析下。
四、mybatis是怎麼集成到springboot中的
講這個問題之前,先要達成一個共識: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等;
最後,本文用到的源碼均可關注下方公衆號獲得,歡迎與志同道合的你一起交流學習。
推薦閱讀