spring-boot整合mybatis真的很簡單嗎?

2023-06-07 09:00:45

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