前邊分享了springboot項目的創建及springboot項目的默認配置文件等,想溫習的小夥伴可移步至文章末尾閱讀,感謝。今天來分享下springboot引入mybatis框架的步驟,有小夥伴會說很簡單,引入依賴,加上配置就完事了,話是沒有錯的,但是你知道每一步都在做什麼嗎,本着知其然知其所以然的態度,一步一步實現mybatis框架的引入。會有很多意想不到的精彩,繼續下去吧。
一、引入mybatis的依賴
在springboot中要使用mybatis的,必然要引入mybatis的依賴,使用過spring的小夥伴都知道要在spring項目中使用mybatis,除了要引入mybatis的依賴外,還要引入spring和mybatis結合的依賴,名字是mybatis-spring.XXX.jar。springboot摒棄了先引入mybaits,再引入mybatis-spring的不便,開發了下面的依賴
<!--mybatis的依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
可以看到這是一個“starter”,要說明的是springboot開發了很多這樣的“starter”,提供springboot和其他中間件的集成。先看下“mybatis-spring-boot-starter”這樣一個starter都包含哪些依賴,
在“mybatis-spring-boot-starter”的依賴中有“mybatis.3.5.7”和“mybatis-spring.2.0.6”,還有“spring-boot-starter-jdbc”和“mybaits-spring-boot-autoconfigure”兩個依賴,說明“mybatis-spring-boot-starter”不光引入了mybatis相關的依賴還有其他的。現在來嘗試下啓動程序看看是什麼情況,
可以看到程序自動退出了,很神奇什麼錯誤也沒打自動退出了,爲了把異常打印出來在啓動類的代碼中加入try catch,如下
package com.my.template;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 啓動類
* @date 2022/6/3 21:32
*/
@SpringBootApplication
public class BootServer {
public static void main(String[] args) {
try {
SpringApplication.run(BootServer.class);
}catch (Exception e){
e.printStackTrace();
}
}
}
再看下啓動日誌,
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception;
nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException:
Failed to determine a suitable driver class
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556)
從日誌中大體可以看處在創建“dataSource”這個bean的時候報錯了,並且有這樣一個異常“org.springfraemwork.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException”,爲什麼有這樣一個異常,而且沒有有引入有關“autoconfigure.jdbc”的包啊,還記得前邊在引入“mybatis-spring-boot-starter”的時候,其依賴了該包,所以拋該異常也不足爲奇。另外上面還有“Failed to instantiate [com.zaxxer.hikari.HikariDataSource]”這樣一句,也是由於在“spring-boot-starter-jdbc”包中引入了相關依賴,
好了,上邊分析了,日誌中的異常情況。回到問題的開始點,爲什麼會創建“dataSource”這樣一個bean,這是因爲在springboot啓動的時候會默認創建一個名爲“dataSource”的bean,放到spring的環境中。是如何創建的吶?是因爲springboot有自動配置的功能,也就springboot啓動的時候會默認加載“spring-boot-autoconfigure”下的spring.factories文件中的類,
在“spring.factories”文件中有這樣一個類“org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration”,該類是DataSouce的自動配置類,
另外,重要的一點是,springboot在不配置數據源的時候默認使用的是“HikariDataSource”,這也是爲什麼在依賴中會出現“com.zaxxer.HikarCP”依賴的原因,
要創建HikariDataSource,比然要創建數據庫連接,那麼就需要數據庫的驅動,由於沒有在application.properties文件中配置,那麼代碼肯定會走到下面的地方,
也就會出現啓動過程中下面的錯誤,
分析到這裏,問題就很明顯了,springboot在默認情況下要創建HikariDataSource的數據源,最終其實是要創建數據庫連接,創建數據庫連接就需要數據庫啓動程序,這裏沒有數據庫驅動所以報錯了。
我這裏要連接mysql數據庫,這裏把mysql的數據庫驅動依賴再加上,
<!--mysql的驅動程序-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
重要的一點在application.properites中配置,
server.port=9099
#數據庫驅動
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#用戶名
spring.datasource.username=root
spring.datasource.password=root
#連接地址
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
注意,在配置的時候不要配置”spring.datasource.hikari“開頭的屬性,筆者開始的時候,想着這裏使用的是”hikariDataSource“,那麼我配置”spring.datasouce.hikari“前綴的屬性即可,結果老是不對,這裏一定要配置的是”spring.datasource“開頭的屬性。
配置以後,再啓動服務,如下
可以看到這裏已經正常啓動了,俗話說沒有報錯就是最好的,並且在上圖也提示,”No MyBatis mapper war found in [com.my.template] package“,也就是說springboot默認會掃描mapper文件。
二、HikariDataSource是什麼
上面提到springboot默認的數據源是HikariDataSource,那麼HikariDataSource是什麼?HikariDataSource是一個數據庫連接池,其github地址爲:https://github.com/brettwooldridge/HikariCP,和平時使用的c3p0、dbcp2、druid是一樣的,前面說到HikariDataSource是sprinboot默認的數據庫連接池,只要引入了”spring-boot-starter-jdbc“,那麼HikariDataSource會默認引入,而且在application.properties中無需指定數據源的類型,
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
如果想使用其他的也可以,需要引入相應的依賴,然後在application.properties中進行配置,以Druid爲例,
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
後面,會對常用的數據庫連接池做一個彙總,敬請關注。
三、總結
本文主要分享了在springboot中使用mybatis的一些問題,
1、springboot默認的數據源爲HikariDataSource,可以通過spring.datasource.type來修改;
2、配置HikariDataSource的時候,注意配置”spring.datasource“前綴的屬性;
3、springboot中使用mybatis,直接引入”mybatis-spring-boot-starter“更方便,不過要注意版本;
4、除了引入mybatis的相關依賴,不要忘了引入相關的數據庫驅動jar;
最後,遺留一個小問題,mybatis-spring-boot-starter是什麼,你想過嗎,下期更精彩!
推薦閱讀