SpringBoot整合Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能
SpringBoot :
Spring Boot是一個基于Spring框架的開源Java開發(fā)框架,旨在簡化Spring應(yīng)用程序的開發(fā)、配置和部署。它提供了一種快速、敏捷的方式來構(gòu)建獨(dú)立的、生產(chǎn)級別的Spring應(yīng)用程序,同時還提供了許多開箱即用的功能和工具,如自動配置、內(nèi)嵌式Web容器、健康檢查、監(jiān)控和管理等。
Mybatis-Plus:
Mybatis-Plus是一個基于Mybatis的增強(qiáng)工具,它在Mybatis的基礎(chǔ)上擴(kuò)展了許多實(shí)用的功能,可以幫助開發(fā)人員更加高效地完成數(shù)據(jù)庫操作,提高開發(fā)效率和代碼質(zhì)量。
Druid:
Druid是一個高性能的數(shù)據(jù)庫連接池,它可以與各種關(guān)系型數(shù)據(jù)庫進(jìn)行集成,如MySQL、Oracle、PostgreSQL等。Druid提供了可擴(kuò)展、高可用、高性能的數(shù)據(jù)庫連接管理功能,可以幫助開發(fā)人員更加高效地完成數(shù)據(jù)庫操作。
有了基本的理解 接下來我們用這些組合實(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ù)源的一個簡單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)加載
在項目啟動類中排除druid屬性默認(rèn)加載(也可以直接在配置中加載 我的項目配置沒有成功就直接用這種方式了)
不加這個多數(shù)據(jù)源可能無法都加載出來
@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)境開啟 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(1000); performanceInterceptor.setFormat(true); return performanceInterceptor; } /** * 多數(shù)據(jù)源的創(chuàng)建 有幾個就寫幾個 */ @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(); } /** * 動態(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() //添加分頁功能 }); //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
切面處理類:
@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配置類 配置啟動視圖和過濾規(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黑名單(共同存在時,deny優(yōu)先于allow) servletRegistrationBean.addInitParameter("deny","127.0.0.1"); //控制臺管理用戶 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ī)則 filterRegistrationBean.addUrlPatterns("/*"); //忽略過濾的格式 filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }
?? 5.5 DynamicDataSource
動態(tài)數(shù)據(jù)源決策
public class DynamicDataSource extends AbstractRoutingDataSource { /** * @description: 動態(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為每個使用該變量的線程提供獨(dú)立的變量副本, * 所以每一個線程都可以獨(dú)立地改變自己的副本,而不會影響其它線程所對應(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é):
至此,一個非常簡單的多數(shù)據(jù)源配置就基本搞定了。
以上就是SpringBoot+Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Druid多數(shù)據(jù)源的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽詳解
這篇文章主要介紹了Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽詳解,Curtor框架中一共有三個實(shí)現(xiàn)監(jiān)聽的方式,一種是NodeCache監(jiān)聽指定節(jié)點(diǎn),一種是pathChildrenCache監(jiān)聽子節(jié)點(diǎn),一種是TreeCache可以監(jiān)控所有節(jié)點(diǎn) 相當(dāng)于以上兩種的合集,需要的朋友可以參考下2023-12-12使用maven項目pom.xml文件配置打包功能和靜態(tài)資源文件自帶版本號功能
在Maven項目中,通過pom.xml文件配置打包功能,可以控制構(gòu)建過程,生成可部署的包,同時,為了緩存控制與版本更新,可以在打包時給靜態(tài)資源文件如JS、CSS添加版本號,這通常通過插件如maven-resources-plugin實(shí)現(xiàn)2024-09-09mybatis中sql語句CDATA標(biāo)簽的用法說明
這篇文章主要介紹了mybatis中sql語句CDATA標(biāo)簽的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06基于Springboot實(shí)現(xiàn)JWT認(rèn)證的示例代碼
本文主要介紹了基于Springboot實(shí)現(xiàn)JWT認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11Java concurrency之LockSupport_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么
這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11