spring-boot集成mybatis真的很簡單嗎?

在日常的後端開發中,使用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等;

最後,本文用到的源碼均可關注下方公衆號獲得,歡迎與志同道合的你一起交流學習。

推薦閱讀

我的第一個springboot  starter

mybatis源碼配置文件解析之一:解析properties標籤

springboot引入mybatis遇到的坑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章