springboot引入mybatis遇到的坑

  前邊分享了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是什麼,你想過嗎,下期更精彩!

推薦閱讀

5分鐘快速搭建一個springboot的項目

springboot竟然有5種默認的加載路徑,你未必都知道

springboot如何使用自定義配置文件

springboot多環境下如何進行動態配置

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