最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Mybatis-Plus+Druid實現(xiàn)多數(shù)據(jù)源配置功能

 更新時間:2023年06月09日 09:02:38   作者:夢隨風揚  
本文主要講解springboot?+mybatisplus?+?druid?實現(xiàn)多數(shù)據(jù)源配置功能以及一些必要的準備及代碼說明,具有一定的參考價值,感興趣的小伙伴可以借鑒一下

SpringBoot :
Spring Boot是一個基于Spring框架的開源Java開發(fā)框架,旨在簡化Spring應用程序的開發(fā)、配置和部署。它提供了一種快速、敏捷的方式來構(gòu)建獨立的、生產(chǎn)級別的Spring應用程序,同時還提供了許多開箱即用的功能和工具,如自動配置、內(nèi)嵌式Web容器、健康檢查、監(jiān)控和管理等。
Mybatis-Plus:
Mybatis-Plus是一個基于Mybatis的增強工具,它在Mybatis的基礎上擴展了許多實用的功能,可以幫助開發(fā)人員更加高效地完成數(shù)據(jù)庫操作,提高開發(fā)效率和代碼質(zhì)量。
Druid:
Druid是一個高性能的數(shù)據(jù)庫連接池,它可以與各種關系型數(shù)據(jù)庫進行集成,如MySQL、Oracle、PostgreSQL等。Druid提供了可擴展、高可用、高性能的數(shù)據(jù)庫連接管理功能,可以幫助開發(fā)人員更加高效地完成數(shù)據(jù)庫操作。

有了基本的理解 接下來我們用這些組合實現(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. 排除默認加載

在項目啟動類中排除druid屬性默認加載(也可以直接在配置中加載 我的項目配置沒有成功就直接用這種方式了)
不加這個多數(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"})// 設置 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ù)據(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ù)源實例:

?? 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維護變量,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,
     * 所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
    /**
     * 設置數(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實現(xiàn)多數(shù)據(jù)源配置功能的詳細內(nèi)容,更多關于SpringBoot Druid多數(shù)據(jù)源的資料請關注腳本之家其它相關文章!

相關文章

  • Java Springboot全局異常處理

    Java Springboot全局異常處理

    這篇文章主要給大家介紹了關于Springboot全局異常處理的資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用SpringBoot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2021-11-11
  • java新手入門——String類詳解

    java新手入門——String類詳解

    在java、C#中,String類是不可變的,對String類的任何改變,都是返回一個新的String類對象。string>是C++標準程序庫中的一個頭文件
    2021-06-06
  • java靜態(tài)工具類注入service出現(xiàn)NullPointerException異常處理

    java靜態(tài)工具類注入service出現(xiàn)NullPointerException異常處理

    如果我們要在我們自己封裝的Utils工具類中或者非controller普通類中使用@Autowired注解注入Service或者Mapper接口,直接注入是報錯的,因Utils用了靜態(tài)方法,我們無法直接用非靜態(tài)接口的,遇到這問題,我們要想法解決,下面小編就簡單介紹解決辦法,需要的朋友可參考下
    2021-09-09
  • SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解

    SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解

    Spring對數(shù)據(jù)源的管理類似于策略模式,不懂策略模式也沒關系,其實就是有一個全局的鍵值對,類型是Map<String, DataSource>,當JDBC操作數(shù)據(jù)庫之時,會根據(jù)不同的key值選擇不同的數(shù)據(jù)源,本文介紹了SpringBoot配置動態(tài)數(shù)據(jù)源的方法,需要的朋友可以參考下
    2024-08-08
  • java對接微信支付之JSAPI支付(微信公眾號支付)

    java對接微信支付之JSAPI支付(微信公眾號支付)

    這篇文章主要給大家介紹了關于java對接微信支付之JSAPI支付(微信公眾號支付)的相關資料,微信JSAPI支付是近年來非常流行的一種支付方式,它使用了微信支付的SDK和demo來實現(xiàn)支付接口的對接,需要的朋友可以參考下
    2023-07-07
  • java通過HttpServletRequest獲取post請求中的body內(nèi)容的方法

    java通過HttpServletRequest獲取post請求中的body內(nèi)容的方法

    本篇文章主要介紹了java通過HttpServletRequest獲取post請求中的body內(nèi)容的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 淺談Java多線程編程中Boolean常量的同步問題

    淺談Java多線程編程中Boolean常量的同步問題

    這篇文章主要介紹了淺談Java多線程編程中Boolean常量的同步問題,主要針對線程之間同步了不同的布爾對象的問題,需要的朋友可以參考下
    2015-10-10
  • Filter在springboot中的使用方法詳解

    Filter在springboot中的使用方法詳解

    這篇文章主要介紹了Filter在springboot中的使用方法詳解,filter(過濾器)作用于在intreceptor(攔截器)之前,不像intreceptor一樣依賴于springmvc框架,只需要依賴于serverlet,需要的朋友可以參考下
    2023-08-08
  • 詳解用Spring Boot Admin來監(jiān)控我們的微服務

    詳解用Spring Boot Admin來監(jiān)控我們的微服務

    這篇文章主要介紹了用Spring Boot Admin來監(jiān)控我們的微服務,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • java 發(fā)送帶Basic Auth認證的http post請求實例代碼

    java 發(fā)送帶Basic Auth認證的http post請求實例代碼

    下面小編就為大家?guī)硪黄猨ava 發(fā)送帶Basic Auth認證的http post請求實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11

最新評論

迁西县| 巴东县| 甘德县| 滦平县| 宜阳县| 延庆县| 延庆县| 常德市| 崇信县| 日喀则市| 临城县| 封开县| 马边| 望奎县| 吉安市| 辰溪县| 贵阳市| 宁陕县| 宜兰县| 栾城县| 沭阳县| 五寨县| 定日县| 观塘区| 隆林| 千阳县| 清苑县| 青川县| 常德市| 揭东县| 星子县| 阳朔县| 凌海市| 仁怀市| 邯郸市| 鲁山县| 城市| 丽水市| 买车| 蒙阴县| 葵青区|