1. 程式人生 > >SpringBoot2.0學習筆記:(九) Spring Boot中整合Mybatis與Druid

SpringBoot2.0學習筆記:(九) Spring Boot中整合Mybatis與Druid

一、專案的搭建

Druid對Spring boot做了很好的適配,所有的工作都只需要在配置檔案中完成。

具體的Druid在Spring Boot中的配置可以看:GitHub文件

首先看一下專案引入的jar包:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <
artifactId
>
mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version
>
</dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

在Spring Boot專案使用Druid需要匯入的jar包是druid-spring-boot-starter

很簡單,專案只需要匯入

mybatis-spring-boot-starter

mysql-connector-java

druid-spring-boot-starter

spring-boot-starter-web

這四個jar包就可以了。

之後看一下專案目錄結構:

在這裡插入圖片描述

我使用的是yml格式的配置檔案,因為配置太多了,這樣寫簡單一點=-=。

controller、model、dao、這三個包內的Java檔案勿用多說,說一下resoucres目錄下的mybatis資料夾,這是我定義的Mybatis的對映檔案所處的位置,這個路徑需要在配置檔案中配置一下。

mybatis:
  mapper-locations: classpath:mybatis/*.xml

現在具體看一下application.yml檔案:

spring:
  datasource:
    druid:
      # JDBC配置
      url: jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=UTF-8
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver

      # 連線池配置
      # 配置初始化大小、最小、最大
      initial-size: 5
      max-active: 20
      min-idle: 5
      # 獲取連線等待超時時間
      max-wait: 60000
      pool-prepared-statements: true
      #
      validation-query: SELECT 1
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      # 間隔多久進行一次檢測,檢測需要關閉的空閒連線
      time-between-eviction-runs-millis: 60000
      # 一個連線在連線池中最小的生存時間
      min-evictable-idle-time-millis: 300000
      max-pool-prepared-statement-per-connection-size: 20
      # 合併多個DruidDataSource的監控資料
      use-global-data-source-stat: true
      filters: stat
      filter:
      # 慢SQL記錄(sql語句執行時間超過某個界限就記錄下來)
        stat:
          slow-sql-millis: 200
          log-slow-sql: true

      # 監控配置
      # Druid WebStatFilter配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: /druid/*,*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico
      # Druid StatViewServlet配置
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        # 登入監控介面的使用者名稱以及密碼,登入url為localhost:8080/druid
        login-username: admin
        login-password: admin
        allow:
        deny:
mybatis:
  # 指定mybatis對映檔案的位置
  mapper-locations: classpath:mybatis/*.xml
  configuration:
  	# 開啟駝峰命名轉換
    map-underscore-to-camel-case: true

這就是全部的配置了,其中有關於Druid的配置可以參照上面給出的超連結去GitHub上詳細瞭解。

最後還不能忘了的是,在啟動檔案SpringBootDruidApplication中加入@MapperScan註解,指定要掃描的Mapper類的路徑。


@MapperScan(value = "com.baiding.springboot.dao")
@SpringBootApplication
public class SpringBootDruidApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootDruidApplication.class, args);
	}
}

以上就是SpringBoot2.0.x中關於Mybatis與Druid的全部配置了,當然這只是很簡陋的配置,具體的擴充套件可以參看官方文件。下面看一下效果:

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

這裡的Druid監控介面訪問:localhost:8080/druid就可以

下面是Druid的SQL監控:

在這裡插入圖片描述

下面是Druid的URI監控:

在這裡插入圖片描述

問題解惑

1. Mybatis查出了資料,但無法完成賦值

比如,你在資料庫中查出了一條資料賦值給物件,物件的id成功賦值了,但是他的userName是個空值。這裡就是駝峰命名 的坑了,當你在Mybatis對映檔案中select語句直接使用resultType而不是用resultMap返回資料,並且物件中採用駝峰命名(userName)資料庫中使用user_name時,就會出現這個 情況:

<select id="getUser" parameterType="long" 				 resultType="com.baiding.springboot.model.User">
    SELECT * FROM user WHERE id = #{id}
</select>

所以解決辦法就是在配置檔案中開啟駝峰命名:

mybatis:
  configuration:
    map-underscore-to-camel-case: true

2. Druid連線Mysql資料庫一直提示密碼錯誤

我的mysql資料庫的密碼一開始是一串純數字,例如:033453,但是啟動專案的時候一直報密碼錯誤,之後我跟蹤了一下配置檔案中資料庫連線屬性的賦值過程,跟蹤到DruidAbstractDataSourcesetPassword方法,

public void setPassword(String password) {
    if (StringUtils.equals(this.password, password)) {
        return;
    }

    if (inited) {
        LOG.info("password changed");
    }

    this.password = password;
}

發現在這裡得到的password已經變成了另外一串數字了。很疑惑,但不明白具體原因,希望有大手子可以告知。

之後,我改成了連線虛擬機器上另外的 一個數據庫,密碼也改為了字串,這樣啟動就沒問題了。