Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置方法
Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置
平常我們使用的是 properties 或者 yaml 來配置數(shù)據(jù)庫的地址、用戶名、密碼等
但是這樣只能配置一個數(shù)據(jù)源
現(xiàn)在我們想在一個項目里面配置多個數(shù)據(jù)源,那么我們就需要配置自己的配置類
配置類和配置文件
Mybatis+mysql+druid配置
spring:
autoconfigure:
## 多數(shù)據(jù)源環(huán)境下必須排除掉 DataSourceAutoConfiguration,否則會導致循環(huán)依賴報錯
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
datasource:
# 使用druid連接池
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 打開我們的內(nèi)置監(jiān)控頁面,打開后我們才可以有相應的web界面
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: user
login-password: 123456
jdbc:
# 數(shù)據(jù)庫鏈接放在外面 方便連接配置中心 做到測試和生產(chǎn)不同環(huán)境
one:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true&allowMultiQueries=true
user: root
pwd: 123456
driver: com.mysql.cj.jdbc.Driver
two:
url: jdbc:mysql://ip地址:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true&allowMultiQueries=true
user: root
pwd: 123456
driver: com.mysql.cj.jdbc.Driver
# 配置自己去搜一下吧 這里我沒有配置完
datasource:
# druid 配置
druid:
# 打開我們的內(nèi)置監(jiān)控功能,打開之后我們才可以對我們的操作進行統(tǒng)計
filter:
stat:
enabled: true
slow-sql-millis: 2000
# 配置防火墻,防止sql語句注入,我們可以設置我們想要那些語句可以執(zhí)行,哪些不行
wall:
enabled: true
config:
delete-allow: true
# select-all-column-allow: false,如果我們設置了拒絕查詢,那么我們查詢時就會報錯,返回一個whitePage
# selelct-allow: false
# 打開我們的Web關(guān)聯(lián)監(jiān)控配置,即我們對某些路徑進行精確統(tǒng)計
web-stat-filter:
enabled: true
# 初始化時建立的物理連接數(shù)。初始化發(fā)生在顯式調(diào)用init方法,或者第一次getConnection時.
initial-size: 5
# 連接池最大物理連接數(shù)量。
max-active: 50
# 連接池最小物理連接數(shù)量。
min-idle: 5
# 獲取連接時最大等待時間,單位為毫秒。
# 配置之后,缺省啟用公平鎖,并發(fā)效率會有所下降,若需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
max-wait: 6000
# 是否緩存preparedStatement,也就是PSCache。
# PSCache對支持游標的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關(guān)閉。
pool-prepared-statements: true
# 要啟用PSCache,其值必須大于0,當大于0時,poolPreparedStatements自動觸發(fā)修改為true。
# 在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,可以把這個數(shù)值配置大一些,比如說100。
max-pool-prepared-statement-per-connection-size: 20
# 用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。
# 如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。
validation-query: select 1 from dual
# 檢測連接是否有效的超時時間,單位為秒。
# 底層調(diào)用jdbc Statement對象的void setQueryTimeout(int seconds)方法。
# validation-query-timeout: 30
# 有兩個含義:
# 1) Destroy線程會檢測連接的間隔時間,若連接空閑時間大于等于minEvictableIdleTimeMillis則關(guān)閉物理連接。
# 2) testWhileIdle的判斷依據(jù),詳細看testWhileIdle屬性的說明。
time-between-eviction-runs-millis: 60000
# 連接保持空閑而不被驅(qū)逐的最長時間。
min-evictable-idle-time-millis: 300000
# 建議配置為true,不影響性能,并且保證安全性。
# 申請連接的時候檢測,若空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
test-while-idle: true
# 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
test-on-borrow: false
# 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
test-on-return: false
# 類型是字符串,通過別名的方式配置擴展的攔截器插件,常用的攔截器插件有:
# 監(jiān)控統(tǒng)計用的filter:stat,日志用的filter:log4j,防御sql注入攻擊的filter:wall,三個同時配置的化,用逗號隔開。
# 注意,Druid中的filter-class-names配置項是不起作用的,必須采用filters配置項才可以。
filters: stat,wall,log4j2
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄。
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監(jiān)控數(shù)據(jù)
use-global-data-source-stat: true
mybatis-plus:
configuration:
# 更新字段的時候設置為null,忽略實體null判斷之后,解決Oracle無效的列異常, oracle數(shù)據(jù)庫必須配置
jdbc-type-for-null: 'null' # 注意要有單引號
# mybatis-plus駝峰映射
map-underscore-to-camel-case: true
# 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# mybatis的xml文件地址,如果啟動文件找不到xml文件,如下去修改pom.xml文件
mapper-locations: classpath:mybatis/two/*.xml
global-config:
# 禁用mybatis-plus的LOGO
banner: false
db-config:
# 邏輯未刪除值,(邏輯刪除下有效)
logic-delete-value: 1
# 邏輯未刪除值,(邏輯刪除下有效)需要注入邏輯策略LogicSqlInjector,以@Bean方式注入
logic-not-delete-value: 0
# 對應實體類的字段,寫了這個在實體類中就不需要寫注解了
logic-delete-field: deleted項目的配置項文件:

配置項:Druid配置
package com.example.test.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.sql.SQLException;
@Data
@ConfigurationProperties(prefix = "jdbc.datasource.druid")
public class DruidConfig {
protected String filters;
protected int initialSize;
protected int minIdle;
protected int maxActive;
protected long maxWait;
protected long timeBetweenEvictionRunsMillis;
protected long minEvictableIdleTimeMillis;
protected String validationQuery;
protected boolean testWhileIdle;
protected boolean testOnBorrow;
protected boolean testOnReturn;
protected boolean poolPreparedStatements;
protected int maxPoolPreparedStatementPerConnectionSize;
/**
* 初始化
* @return
* @throws SQLException
*/
protected DruidDataSource init() throws SQLException {
DruidDataSource druid = new DruidDataSource();
// 監(jiān)控統(tǒng)計攔截的filters
druid.setFilters(filters);
//初始化時建立物理連接的個數(shù)
druid.setInitialSize(initialSize);
//最大連接池數(shù)量
druid.setMaxActive(maxActive);
//最小連接池數(shù)量
druid.setMinIdle(minIdle);
//獲取連接時最大等待時間,單位毫秒。
druid.setMaxWait(maxWait);
//間隔多久進行一次檢測,檢測需要關(guān)閉的空閑連接
druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//一個連接在池中最小生存的時間
druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//用來檢測連接是否有效的sql
druid.setValidationQuery(validationQuery);
//建議配置為true,不影響性能,并且保證安全性。
druid.setTestWhileIdle(testWhileIdle);
//申請連接時執(zhí)行validationQuery檢測連接是否有效
druid.setTestOnBorrow(testOnBorrow);
druid.setTestOnReturn(testOnReturn);
//是否緩存preparedStatement,也就是PSCache,oracle設為true,mysql設為false。分庫分表較多推薦設置為false
druid.setPoolPreparedStatements(poolPreparedStatements);
// 打開PSCache時,指定每個連接上PSCache的大小
druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
return druid;
}
}配置項:數(shù)據(jù)源一
package com.example.test.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* 雙數(shù)據(jù)庫配置 因為一部分查詢需要用到
* oneDataSource -》 數(shù)據(jù)庫一
* twoDataSource -》 數(shù)據(jù)庫二
*/
@Configuration
@MapperScan(basePackages = OneDBConfig.PACKAGE, sqlSessionFactoryRef = "oneSqlSessionFactory")
public class OneDBConfig extends DruidConfig {
/**
* dao層的包路徑
*/
static final String PACKAGE = "com.example.test.mapper.one";
/**
* mapper文件的相對路徑
*/
private static final String MAPPER_LOCATION = "classpath*:mybatis/one/*.xml";
@Value("${jdbc.one.url}")
private String url;
@Value("${jdbc.one.user}")
private String user;
@Value("${jdbc.one.pwd}")
private String pwd;
@Value("${jdbc.one.driver}")
private String driverName;
@Bean(name = "oneDataSource")
public DataSource oneDataSource() throws SQLException {
DruidDataSource druid = init();
// 配置基本屬性
druid.setDriverClassName(driverName);
druid.setUsername(user);
druid.setPassword(pwd);
druid.setUrl(url);
return druid;
}
@Bean(name = "oneSqlSessionFactory")
public SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return bean.getObject();
}
@Bean(name = "oneTransactionManager")
public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}配置項:數(shù)據(jù)源二 ,該數(shù)據(jù)源作為MybatisPlus的使用數(shù)據(jù)源
package com.example.test.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.StringUtils;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* 雙數(shù)據(jù)庫配置 因為一部分查詢需要用到
* 該 數(shù)據(jù)庫配資源 作為 mybatisPlus 的使用源
* oneDataSource -》 數(shù)據(jù)庫一
* twoDataSource -》 數(shù)據(jù)庫二
*/
@Configuration
@EnableConfigurationProperties({MybatisPlusProperties.class})
@MapperScan(basePackages = TwoDBConfig.PACKAGE, sqlSessionFactoryRef = "twoSqlSessionFactory")
public class TwoDBConfig extends DruidConfig {
private final MybatisPlusProperties properties;
/**
* dao層的包路徑
*/
static final String PACKAGE = "com.example.test.mapper.two";
/**
* mapper文件的相對路徑
*/
private static final String MAPPER_LOCATION = "classpath*:mybatis/two/*.xml";
@Value("${jdbc.two.url}")
private String url;
@Value("${jdbc.two.user}")
private String user;
@Value("${jdbc.two.pwd}")
private String pwd;
@Value("${jdbc.two.driver}")
private String driverName;
public TwoDBConfig(MybatisPlusProperties properties) {
this.properties = properties;
}
@Bean(name = "twoDataSource")
@Primary
public DataSource dataSource() throws SQLException {
DruidDataSource druid = init();
// 配置基本屬性
druid.setDriverClassName(driverName);
druid.setUsername(user);
druid.setPassword(pwd);
druid.setUrl(url);
return druid;
}
@Bean(name = "twoSqlSessionFactory")
@Primary
public SqlSessionFactory twoSqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
MybatisConfiguration configuration = this.properties.getConfiguration();
if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
configuration = new MybatisConfiguration();
}
bean.setConfiguration(configuration);
return bean.getObject();
}
@Primary
@Bean(name = "twoTransactionManager")
public DataSourceTransactionManager twoTransactionManager(@Qualifier("twoDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}MybatisPlus插件
/**
* MybatisPlus 配置類
*/
@EnableTransactionManagement //事務控制
@Configuration //配置類
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分頁插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}Mapper路徑

XML路徑

測試: controller
@RestController
@Slf4j
@RequestMapping("/cs")
public class TestController {
@Autowired
private OneMapper oneMapper;
@Autowired
private TwoMapper twoMapper;
@PostMapping("/test")
public Results test() {
int count1 = oneMapper.count();
int count2 = twoMapper.count();
log.info("數(shù)據(jù)源一:{},數(shù)據(jù)源二:{}", count1, count2);
return Results.success(count1 + "+" + count2);
}
}postman:

Druid頁面:

到此這篇關(guān)于Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置的文章就介紹到這了,更多相關(guān)Mybatis Druid MybatisPlus多數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java OpenCV實現(xiàn)圖像鏡像翻轉(zhuǎn)效果
這篇文章主要為大家詳細介紹了Java OpenCV實現(xiàn)圖像鏡像翻轉(zhuǎn)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
關(guān)于javax.validation.constraints的超詳細說明
這篇文章主要給大家介紹了關(guān)于javax.validation.constraints的超詳細說明,文中通過代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2025-07-07
使用RocketMQTemplate發(fā)送帶tags的消息
這篇文章主要介紹了使用RocketMQTemplate發(fā)送帶tags的消息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java中的常見排序示例代碼(含優(yōu)化方案和拓展方法)
在Java中常見的排序算法包括冒泡排序、選擇排序、插入排序、希爾排序、歸并排序、快速排序和堆排序等,這篇文章主要介紹了java中常見排序(含優(yōu)化方案和拓展方法)的相關(guān)資料,需要的朋友可以參考下2026-01-01
Java ForkJoinPool線程池的使用之并行計算數(shù)組求和實例
這篇文章主要介紹了Java ForkJoinPool線程池的使用之并行計算數(shù)組求和實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05

