目錄
1.初始化項目
1.1.初始化工程
1.2.添加依賴
1.3.配置yml文件
1.4.Spring Boot 啟動類中添加?@MapperScan?注解,掃描 Mapper 文件夾
1.5.配置使用數(shù)據(jù)源
1.5.1.注解方式
1.5.2.基于AOP手動實現(xiàn)多數(shù)據(jù)源原生的方式
2.結(jié)果展示
Mybatis-Plus:簡介 | MyBatis-Plus (baomidou.com)
1.初始化項目
在正式開始之前,先初始化一個springboot項目
1.1.初始化工程
創(chuàng)建一個空的 Spring Boot 工程
可以使用?Spring Initializer?(opens new window)快速初始化一個 Spring Boot 工程
1.2.添加依賴
Maven中央倉庫
在pom.xml中添加Druid和JDBC驅(qū)動的依賴
<!-- 阿里數(shù)據(jù)庫druid連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<!-- 多數(shù)據(jù)源配置dynamic-datasource-spring-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- oracle驅(qū)動 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<!--mysql驅(qū)動:注意和mysql版本對應(yīng),實際應(yīng)用中根據(jù)需要自行引入相關(guān)數(shù)據(jù)源驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.4</version>
<scope>runtime</scope>
</dependency>
<!--devtools熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!--Hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.18</version>
</dependency>
<!-- 整合mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
1.3.配置yml文件
1)application.yml:配置數(shù)據(jù)源和Druid監(jiān)控
# 配置多數(shù)據(jù)源 使用:如果需要調(diào)用不用的數(shù)據(jù)庫源,只需要再impl里面使用注釋@DS("數(shù)據(jù)源名稱")即可
# Tomcat 服務(wù)配置server:server:server:
server:
port: 8085
spring:
devtools:
restart:
enabled: true
additional-paths: src/main/java
exclude: resources/*
profiles:
active: pro
datasource:
druid:
# 下面為連接池的補(bǔ)充設(shè)置,應(yīng)用到上面所有數(shù)據(jù)源中
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
# 配置獲取連接等待超時的時間
max-wait: 60000
# 每60秒運(yùn)行一次空閑連接回收器
time-between-eviction-runs-millis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 300000
# 指明連接是否被空閑連接回收器(如果有)進(jìn)行檢驗.如果檢測失敗,則連接將被從池中去除.
test-while-idle: true
# 建議配置為false。獲取連接時執(zhí)行validationQuery檢測連接是否有效,這個配置會降低性能。
test-on-borrow: false
# 建議配置為false。獲取連接時執(zhí)行validationQuery檢測連接是否有效,這個配置會降低性能。
test-on-return: false
# 打開PSCache,并且指定每個連接上PSCache的大小
pool-prepared-statements: true
# 驗證連接是否可用,使用的SQL語句
validation-query: SELECT 1
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall用于防火墻
max-pool-prepared-statement-per-connection-size: 20
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監(jiān)控數(shù)據(jù)
use-global-data-source-stat: true
# 監(jiān)控過濾器 可視化頁面地址: http://localhost:8085/druid/login.html
webStatFilter:
# 是否開啟監(jiān)控
enabled: true
# 提供監(jiān)控信息展示的html頁面;提供監(jiān)控信息的JSON API
statViewServlet:
enabled: true
# 設(shè)置白名單,不填則允許所有訪問
allow:
# 監(jiān)控路徑
url-pattern: /druid/*
# 控制臺管理用戶名和密碼
login-username: admin
login-password: admin
# 慢sql記錄
filter:
stat:
enabled: true # 開啟DruidDataSource狀態(tài)監(jiān)控
log-slow-sql: true # 開啟慢SQL記錄功能,啟用后如果遇到執(zhí)行很慢的 SQL,便會輸出到日志中,
slow-sql-millis: 5000 # 默認(rèn)3000毫秒,這里超過5s,就是慢,記錄到日志
merge-sql: true
# 防御SQL注入
wall:
config:
multi-statement-allow: true
# 自動設(shè)置json返回格式
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
# mybatis-plus相關(guān)配置
mybatis-plus:
configuration:
#開啟sql日志
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 是否開啟自動駝峰命名規(guī)則映射:從數(shù)據(jù)庫列名到Java屬性駝峰命名的類似映射
map-underscore-to-camel-case: true
# 解決oracle更新數(shù)據(jù)為null時無法轉(zhuǎn)換報錯,mysql不會出現(xiàn)此情況
jdbc-type-for-null: 'null'
#實體類所在包
type-aliases-package: com.batchUtil.model
# xml掃描,多個目錄用逗號或者分號分隔(告訴 Mapper 所對應(yīng)的 XML 文件位置)
mapper-locations: classpath:mapper/*.xml
# 設(shè)置日志級別
logging:
level:
root: INFO # INFO級別以及以上級別的日志輸出到控制臺上
#com.example.demo.dao: debug,可以控制單個包下日志級別
# 設(shè)置logback.xml位置,如果logback不在resources或者不是默認(rèn)文件名
# config: classpath:log/logback.xml
2)application-pro.yml:配置多數(shù)據(jù)源
#mysql和阿里druid配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
dynamic:
primary: jc-mysqldb #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組
strict: false
datasource:
zw-mysqldb:
# driver-class需要注意mysql驅(qū)動的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.6.13:3306/500140?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
jc-mysqldb:
driver-class-name: com.mysql.jdbc.Driver
#捷成數(shù)據(jù)中心
url: jdbc:mysql://192.168.5.15:3306/dc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: duizhang_dyt
password: abc#123#321#cba
1.4.Spring Boot 啟動類中添加?@MapperScan?注解,掃描 Mapper 文件夾
@MapperScan(value = "com.police.violation.mapper")
1.5.配置使用數(shù)據(jù)源
數(shù)據(jù)源的使用有兩種方式,一種是注解,一種是切面,兩種方式各有優(yōu)勢。
總結(jié):
????????注解:每一個方法或者類上需要自己去添加注解,一兩個方法或者mapper類還好,要是幾十個那就麻煩了,如果更換個數(shù)據(jù)源,一個一個去修改豈不是很麻煩,這種硬編碼方式一般來說是不推薦的,解決辦法兩種:第一種,自定義注解,實現(xiàn)某些包下自動注入,不需要再加@DS注解,這個和寫配置類大同小異;第二種:yml文件配置數(shù)據(jù)源名稱,使用${**}引用的方式命名數(shù)據(jù)源名稱,自定義數(shù)據(jù)源名稱常量,實現(xiàn)更換數(shù)據(jù)源無需再去 修改@DS注解的內(nèi)容。
? ? 配置類:推薦使用,實際項目開發(fā)中,不同的功能模塊分包不同,使用數(shù)據(jù)源也可能不一樣,通過配置類指定Mapper文件的位置,不同包使用不同數(shù)據(jù)源,新增功能時,直接在原來包下新增對應(yīng)功能代碼即可,無需配置,可以直接使用。這種也更符合我們實際的使用場景。
1.5.1.注解方式
這個方式比較適用用單體項目,應(yīng)用場景不復(fù)雜,沒幾個mapper文件
@DS注解說明:
1.注解在方法上、類上、接口、枚舉,同時存在就近原則,方法上注解優(yōu)先于類上注解;
2.不使用@DS注解,默認(rèn)主數(shù)據(jù)源;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.batchUtil.model.MacConnect;
import java.util.List;
/**
* @author Administrator
*/
@DS("zw-mysqldb")
public interface MacConnectMapper {
/**
* 根據(jù)編碼獲取車站數(shù)據(jù)庫連接信息
*
* @return
*/
MacConnect selectByMacId(String macId);
List<MacConnect> selectStationMac();
}
1.5.2.基于AOP手動實現(xiàn)多數(shù)據(jù)源原生的方式
????????這種方式比較適合用于大項目,統(tǒng)一規(guī)范管理,既是炫技,也符合實際情況,幾個數(shù)據(jù)源就有幾個配置類。
1)maven依賴,依賴和前邊一樣,在這基礎(chǔ)上增加切面包
<!-- aop 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2)配置文件:和前邊一樣配置
注意:Spring Boot 2.X 版本不再支持配置繼承,多數(shù)據(jù)源的話每個數(shù)據(jù)源的所有配置都需要單獨配置,否則配置不會生效;
3)多數(shù)據(jù)源名稱類
主數(shù)據(jù)源配置類:
/**
* 類名稱:d
* 類描述:
* 創(chuàng)建人:Administrator
* 創(chuàng)建時間:2020年4月1日 下午4:45:12
* 修改人:Administrator
* 修改時間:2020年4月1日 下午4:45:12
* 修改備注:
* @version
*/
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
//配置mapper路徑
@MapperScan(basePackages = "com.ykx.transinfo.mapper", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSourceConfig1 {
// 將這個對象放入Spring容器中
@Bean(name = "test1DataSource")
// 表示這個數(shù)據(jù)源是默認(rèn)數(shù)據(jù)源
@Primary
// 讀取application.properties中的配置參數(shù)映射成為一個對象
// prefix表示參數(shù)的前綴
@ConfigurationProperties(prefix = "spring.datasource.one")
public DataSource getDateSource1()
{
return DataSourceBuilder.create().build();
}
@Bean(name = "test1SqlSessionFactory")
// 表示這個數(shù)據(jù)源是默認(rèn)數(shù)據(jù)源
@Primary
// @Qualifier表示查找Spring容器中名字為test1DataSource的對象
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource datasource)
throws Exception
{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
// 設(shè)置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/one/*.xml"));
return bean.getObject();
}
@Bean("test1SqlSessionTemplate")
// 表示這個數(shù)據(jù)源是默認(rèn)數(shù)據(jù)源
@Primary
public SqlSessionTemplate test1SqlSessionTemplate(
@Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionFactory)
{
return new SqlSessionTemplate(sessionFactory);
}
}
次數(shù)據(jù)源配置類:
/**
* 類名稱:s
* 類描述:
* 創(chuàng)建人:Administrator
* 創(chuàng)建時間:2020年4月1日 下午4:45:38
* 修改人:Administrator
* 修改時間:2020年4月1日 下午4:45:38
* 修改備注:
* @version
*/
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.ykx.transinfo.mysqlmapper", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSourceConfig2 {
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.two")
public DataSource getDateSource2()
{
return DataSourceBuilder.create().build();
}
@Bean(name = "test2SqlSessionFactory")
public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource datasource)
throws Exception
{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/two/*.xml"));
return bean.getObject();
}
@Bean("test2SqlSessionTemplate")
public SqlSessionTemplate test2SqlSessionTemplate(
@Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionFactory)
{
return new SqlSessionTemplate(sessionFactory);
}
}
4).項目結(jié)構(gòu)
注意:重點是mapper結(jié)構(gòu)和配置類里的路徑對應(yīng)
5).啟動類——啟動類需要取消加載數(shù)據(jù)源自動配置?
package com.ykx.transinfo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
// @MapperScan 和dao層@Mapper 二選一
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableScheduling
@MapperScan("com.ykx.transinfo.mapper,com.ykx.transinfo.mysqlmapper")
public class DataServerApplication {
public static void main(String[] args) {
SpringApplication.run(DataServerApplication.class, args);
}
}
后續(xù)的mapper、service寫法和平時沒什么不同
數(shù)據(jù)源可能會碰到事務(wù)問題:https://blog.csdn.net/u011974797/article/details/130154340
2.結(jié)果展示
服務(wù)啟動會打印日志:
com.alibaba.druid.pool.DruidDataSource ? : {dataSource-1,first} inited
com.alibaba.druid.pool.DruidDataSource ? : {dataSource-2,second} inited
druid監(jiān)控頁面:
文章來源:http://www.zghlxwxcb.cn/news/detail-429520.html
參考資料:https://blog.csdn.net/u011974797/article/details/130109195文章來源地址http://www.zghlxwxcb.cn/news/detail-429520.html
到了這里,關(guān)于SpringBoot整合Druid配置多數(shù)據(jù)源的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!