SpringBoot整合Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能
SpringBoot :
Spring Boot是一個(gè)基于Spring框架的開(kāi)源Java開(kāi)發(fā)框架,旨在簡(jiǎn)化Spring應(yīng)用程序的開(kāi)發(fā)、配置和部署。它提供了一種快速、敏捷的方式來(lái)構(gòu)建獨(dú)立的、生產(chǎn)級(jí)別的Spring應(yīng)用程序,同時(shí)還提供了許多開(kāi)箱即用的功能和工具,如自動(dòng)配置、內(nèi)嵌式Web容器、健康檢查、監(jiān)控和管理等。
Mybatis-Plus:
Mybatis-Plus是一個(gè)基于Mybatis的增強(qiáng)工具,它在Mybatis的基礎(chǔ)上擴(kuò)展了許多實(shí)用的功能,可以幫助開(kāi)發(fā)人員更加高效地完成數(shù)據(jù)庫(kù)操作,提高開(kāi)發(fā)效率和代碼質(zhì)量。
Druid:
Druid是一個(gè)高性能的數(shù)據(jù)庫(kù)連接池,它可以與各種關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行集成,如MySQL、Oracle、PostgreSQL等。Druid提供了可擴(kuò)展、高可用、高性能的數(shù)據(jù)庫(kù)連接管理功能,可以幫助開(kāi)發(fā)人員更加高效地完成數(shù)據(jù)庫(kù)操作。
有了基本的理解 接下來(lái)我們用這些組合實(shí)現(xiàn)多數(shù)據(jù)源功能
??1. pom.xml 添加依賴
加入一些必要的依賴:
這里是引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--spring-boot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<!-- druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>??2. application.yml
多數(shù)據(jù)源的一個(gè)簡(jiǎn)單yml配置:
spring:
datasource:
druid:
initial-size: 5
min-idle: 5
max-active: 5
db1:
url: jdbc:mysql://localhost:6030/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
db2:
url: jdbc:mysql://localhost:6030/demo1?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
map-underscore-to-camel-case: false? 3. 排除默認(rèn)加載
在項(xiàng)目啟動(dòng)類(lèi)中排除druid屬性默認(rèn)加載(也可以直接在配置中加載 我的項(xiàng)目配置沒(méi)有成功就直接用這種方式了)
不加這個(gè)多數(shù)據(jù)源可能無(wú)法都加載出來(lái)
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
?? 4. Mybatis-Plus 配置
添加mybatisplus的多數(shù)據(jù)源配置
@Configuration
public class MybatisPlusConfig {
/** mybatis 3.4.1 pagination config start ***/
@Bean
public PaginationInterceptor paginationInterceptor() {
// return new PaginationInterceptor();
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setDialectType("postgresql");
return paginationInterceptor;
}
/**
* SQL執(zhí)行效率插件(優(yōu)化sql的執(zhí)行效率 不需要可以不加)
*
*/
@Bean
@Profile({"dev","qa"})// 設(shè)置 dev test 環(huán)境開(kāi)啟
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(1000);
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
/**
* 多數(shù)據(jù)源的創(chuàng)建 有幾個(gè)就寫(xiě)幾個(gè)
*/
@Bean(name = "db1")
@ConfigurationProperties(prefix = "spring.datasource.druid.db1" )
public DataSource db1() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "db2")
@ConfigurationProperties(prefix = "spring.datasource.druid.db2" )
public DataSource db2() {
return DruidDataSourceBuilder.create().build();
}
/**
* 動(dòng)態(tài)數(shù)據(jù)源配置
* @return
*/
@Bean
@Primary
public DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map< Object, Object > targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceEnum.DB1.getValue(), db1);
targetDataSources.put(DataSourceEnum.DB2.getValue(), db2);
//添加數(shù)據(jù)源
dynamicDataSource.setTargetDataSources(targetDataSources);
//設(shè)置默認(rèn)數(shù)據(jù)源
dynamicDataSource.setDefaultTargetDataSource(db1);
return dynamicDataSource;
}
@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2()));
//sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml"));
MybatisConfiguration configuration = new MybatisConfiguration();
//configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setCacheEnabled(false);
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setPlugins(new Interceptor[]{
//PerformanceInterceptor(),OptimisticLockerInterceptor()
paginationInterceptor()
//添加分頁(yè)功能
});
//sqlSessionFactory.setGlobalConfig(globalConfiguration());
return sqlSessionFactory.getObject();
}
}??5. 多數(shù)據(jù)源實(shí)例:
?? 5.1 DataSourceEnum
枚舉:
public enum DataSourceEnum {
DB1("db1"),DB2("db2");
private String value;
DataSourceEnum(String value){this.value=value;}
public String getValue() {
return value;
}
}?? 5.2 DataSource
自定義多數(shù)據(jù)源切換:
/**
* 自定義多數(shù)據(jù)源切換
* @author zzh
* @date 2023/4/28 15:19:21
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface DataSource {
DataSourceEnum value() default DataSourceEnum.DB1;
}?? 5.3 DataSourceAspect
切面處理類(lèi):
@Aspect
@Order(1)
@Component
public class DataSourceAspect {
@Pointcut("@annotation(com.taosdata.example.mybatisplusdemo.datasource.annotation.DataSource)"
+ "|| @within(com.taosdata.example.mybatisplusdemo.datasource.annotation.DataSource)")
public void dsPc() {
}
@Before("dsPc() && @annotation(dataSource)")
public void doBefore(DataSource dataSource) {
DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().getValue());
}
@After("dsPc()")
public void doAfter() {
DynamicDataSourceContextHolder.clearDataSourceType();
}
}?? 5.4 DruidConfiguration
driud配置類(lèi) 配置啟動(dòng)視圖和過(guò)濾規(guī)則
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean startViewServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
// IP白名單
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
// IP黑名單(共同存在時(shí),deny優(yōu)先于allow)
servletRegistrationBean.addInitParameter("deny","127.0.0.1");
//控制臺(tái)管理用戶
servletRegistrationBean.addInitParameter("loginUsername","admin");
servletRegistrationBean.addInitParameter("loginPassword","123456");
//是否能夠重置數(shù)據(jù)
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加過(guò)濾規(guī)則
filterRegistrationBean.addUrlPatterns("/*");
//忽略過(guò)濾的格式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}?? 5.5 DynamicDataSource
動(dòng)態(tài)數(shù)據(jù)源決策
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* @description: 動(dòng)態(tài)數(shù)據(jù)源決策
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
String dataSourceType = DynamicDataSourceContextHolder.getDataSourceType();
return dataSourceType;
}
}?? 5.6 DynamicDataSourceContextHolder
多數(shù)據(jù)源上下文
public class DynamicDataSourceContextHolder {
public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
/**
* 使用ThreadLocal維護(hù)變量,ThreadLocal為每個(gè)使用該變量的線程提供獨(dú)立的變量副本,
* 所以每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)影響其它線程所對(duì)應(yīng)的副本。
*/
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
/**
* 設(shè)置數(shù)據(jù)源的變量
*/
public static void setDataSourceType(String dsType) {
log.info("切換到{}數(shù)據(jù)源", dsType);
CONTEXT_HOLDER.set(dsType);
}
/**
* 獲得數(shù)據(jù)源的變量
*/
public static String getDataSourceType() {
return CONTEXT_HOLDER.get();
}
/**
* 清空數(shù)據(jù)源變量
*/
public static void clearDataSourceType() {
CONTEXT_HOLDER.remove();
}
}?? 總結(jié):
至此,一個(gè)非常簡(jiǎn)單的多數(shù)據(jù)源配置就基本搞定了。
以上就是SpringBoot+Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Druid多數(shù)據(jù)源的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽(tīng)詳解
這篇文章主要介紹了Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽(tīng)詳解,Curtor框架中一共有三個(gè)實(shí)現(xiàn)監(jiān)聽(tīng)的方式,一種是NodeCache監(jiān)聽(tīng)指定節(jié)點(diǎn),一種是pathChildrenCache監(jiān)聽(tīng)子節(jié)點(diǎn),一種是TreeCache可以監(jiān)控所有節(jié)點(diǎn) 相當(dāng)于以上兩種的合集,需要的朋友可以參考下2023-12-12
使用maven項(xiàng)目pom.xml文件配置打包功能和靜態(tài)資源文件自帶版本號(hào)功能
在Maven項(xiàng)目中,通過(guò)pom.xml文件配置打包功能,可以控制構(gòu)建過(guò)程,生成可部署的包,同時(shí),為了緩存控制與版本更新,可以在打包時(shí)給靜態(tài)資源文件如JS、CSS添加版本號(hào),這通常通過(guò)插件如maven-resources-plugin實(shí)現(xiàn)2024-09-09
mybatis中sql語(yǔ)句CDATA標(biāo)簽的用法說(shuō)明
這篇文章主要介紹了mybatis中sql語(yǔ)句CDATA標(biāo)簽的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
基于Springboot實(shí)現(xiàn)JWT認(rèn)證的示例代碼
本文主要介紹了基于Springboot實(shí)現(xiàn)JWT認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java concurrency之LockSupport_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么
這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Mybatis如何動(dòng)態(tài)創(chuàng)建表
這篇文章主要介紹了Mybatis如何動(dòng)態(tài)創(chuàng)建表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

