Mybatis Plus + Spring 分包配置 ClickHouse 和 Mysql 双数据源

 

目录

一、背景

二、各个配置文件总览(文件位置因人而异)

2.1 DataSourceConfig

2.2 MybatisClickHouseConfig (ClickHouse 配置类)

2.3 MybatisMysqlConfig(Mysql 配置类)

2.4 application.properties 配置

2.5 mapper 分包情况

2.6  主类中的 @MapperScan 去掉,因为在上面 ClickHouse 配置类 和 Mysql配置类 中已经定义

2.7 引用依赖(关键性依赖)

三、参考大神,感谢分享!


一、背景

业务需求,连接池之前用的 Hikari,换成了 Druid 注意一下 ~

我选择 分包 配置动态双数据源

二、各个配置文件总览(文件位置因人而异)

2.1 DataSourceConfig

package xxx.xxx.xxx.common.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;

/**
 * 双数据源配置类
 *
 * @Author Elenda
 * @Date 2024/03/12 10:10
 * @Version 1.0
 */
@Configuration
public class DataSourceConfig {

    /**
     * Mysql
     *
     * @return DataSource
     */
    @Bean(name = "mysqlDatasource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.mysql")
    public DataSource mysqlDatasource() {
        return new DruidDataSource();
    }

    /**
     * ClickHouse
     *
     * @return DataSource
     */
    @Bean(name = "clickHouseDatasource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.clickhouse")
    public DataSource clickHouseDatasource() {
        return new DruidDataSource();
    }
}

2.2 MybatisClickHouseConfig (ClickHouse 配置类)

package xxx.xxx.xxx.common.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * clickHouse数据源配置
 *
 * @Author Elenda
 * @Date 2024/03/12 10:10
 * @Version 1.0
 */
@Configuration
@MapperScan(basePackages = {"xxx.xxx.xxx.mapper.clickhouse"}, sqlSessionFactoryRef = "sqlSessionFactoryDsClickhouse")
public class MybatisClickHouseConfig {

    @Autowired
    @Qualifier("clickHouseDatasource")
    private DataSource clickHouseDatasource;

    @Bean
    public SqlSessionFactory sqlSessionFactoryDsClickhouse() throws Exception {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setDataSource(clickHouseDatasource);
        /*factoryBean.setMapperLocations(
                //设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath:/mappings/clickhouse/*.xml")
        );*/
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDsClickhouse() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryDsClickhouse());
        return template;
    }

    @Bean
    public DataSourceTransactionManager transactionManagerClickhouse() {
        return new DataSourceTransactionManager(clickHouseDatasource);
    }
}

2.3 MybatisMysqlConfig(Mysql 配置类)

package xxx.xxx.xxx.common.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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 javax.sql.DataSource;

/**
 * mysql数据源配置
 *
 * @Author Elenda
 * @Date 2024/03/12 10:10
 * @Version 1.0
 */
@Configuration
@MapperScan(basePackages = {"xxx.xxx.xxx.mapper.mysql"}, sqlSessionFactoryRef = "sqlSessionFactoryDsMysql")
public class MybatisMysqlConfig {

    @Autowired
    @Qualifier("mysqlDatasource")
    private DataSource mysqlDatasource;

    @Bean
    @Primary
    public SqlSessionFactory sqlSessionFactoryDsMysql() throws Exception {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setDataSource(mysqlDatasource);
        factoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:/mappings/mysql/*.xml")
        );
        //向Mybatis过滤器链中添加拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        factoryBean.setPlugins(interceptor);
        return factoryBean.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate sqlSessionTemplateDsMysql() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryDsMysql());
        return template;
    }

    @Bean
    @Primary
    public DataSourceTransactionManager transactionManagerMysql() {
        return new DataSourceTransactionManager(mysqlDatasource);
    }

}

2.4 application.properties 配置

# datasource 配置
# clickhouse
spring.datasource.druid.clickhouse.test-while-idle=true
spring.datasource.druid.clickhouse.validation-query=SELECT 1
spring.datasource.druid.clickhouse.username=username
spring.datasource.druid.clickhouse.password=password
spring.datasource.druid.clickhouse.url=url
spring.datasource.druid.clickhouse.driver-class-name=com.clickhouse.jdbc.ClickHouseDriver
spring.datasource.druid.clickhouse.type=com.alibaba.druid.pool.DruidDataSource

# mysql
spring.datasource.druid.mysql.test-while-idle=true
spring.datasource.druid.mysql.validation-query=SELECT 1
spring.datasource.druid.mysql.username=username
spring.datasource.druid.mysql.password=password
spring.datasource.druid.mysql.url=url
spring.datasource.druid.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.mysql.type=com.alibaba.druid.pool.DruidDataSource

其中,spring.datasource.druid.clickhouse.validation-query=SELECT 1

该选项用来验证数据库连接的有效性

2.5 mapper 分包情况

2.6  主类中的 @MapperScan 去掉,因为在上面 ClickHouse 配置类 和 Mysql配置类 中已经定义

2.7 引用依赖(关键性依赖)

<!-- druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.15</version>
</dependency>
<!-- clickhouse-->
<dependency>
    <groupId>com.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.3.2-patch11</version>
</dependency>
<!-- mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency>

三、参考大神,感谢分享!

正确可用版:SpringBoot+Mybatis-plus+Druid 实现配置多数据源(数据库)_spring_Oxye-华为云开发者联盟前言此文介绍的是在SpringBoot中使用Mybatis配置多数据源(多个数据库),整合Druid网上有很多文章,翻了翻,但是都有问题啊,有的是没使用Druid,使用了默认的Hirika,有的是配置文件不给或者给的是Hirika能用的配置,层级不对,所以我自己来记一下代码pom文件maven依赖<dependency><groupId>com.alibaba</gr Oxye 华为云开发者联盟icon-default.png?t=N7T8https://huaweicloud.csdn.net/6387524cdacf622b8df8ab9f.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODI0NzQsImV4cCI6MTcxMDgwOTA1MywiaWF0IjoxNzEwMjA0MjUzLCJ1c2VybmFtZSI6IkVsZW5kYUxlZSJ9.EAq9dDI8MxXQwa-msFI9Urbg_N59E13lEQS3o95rCVw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/454113.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xterminal:未来的终端体验

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

Git版本控制工具简介

版本控制工具 分类 集中式版本控制工具 CVS、SVN、VSS 缺点&#xff1a;如果服务器一旦宕机&#xff0c;所有历史数据将会丢失 分布式版本控制工具 Git、Mercurial、Bazaar、Darcs...... 优势&#xff1a;本地即可进行版本控制&#xff0c;很好避免了单点故障 需要有一个远程…

软件设计师15--进程资源图

软件设计师15--进程资源图 考点1&#xff1a;进程资源图例题&#xff1a; 考点1&#xff1a;进程资源图 例题&#xff1a; 1、在如下所示的进程资源图中&#xff0c;D&#xff09;。 A、P1、P2、P3都是非阻塞节点&#xff0c;该图可以化简&#xff0c;所以是非死锁的 B、P1、…

基于SSH的物流配送管理系统的设计与实现

摘 要 当今社会&#xff0c;物流配送已成为影响经济发展的显著因素。而随着社会信息化发展&#xff0c;建立有效的物流配送管理体系不仅能够减少物流成本&#xff0c;更能够提升工作人员的工作效率与客户的满意度。而基于B/S架构的物流配送管理体系&#xff0c;不仅具有良好的…

ChatGPT提问技巧:受控生成提示

ChatGPT提问技巧&#xff1a;受控生成提示 受控生成提示是一种可以高度控制输出结果的文本生成技术。 具体做法是为模型提供一组特定的输入&#xff0c;如模板、特定词汇或一组约束&#xff0c;用于指导生成过程。 通过为模型提供一组可用于指导生成过程的特定输入&#xff…

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

解决ipconfig不是内部或外部命令,也不是可运行的程序或批处理文件

问题所示&#xff1a;ipconfig不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决办法如下: 1.右击此电脑&#xff0c;点击属性设置&#xff1a; 2.点击高级系统设置 3.点击进入环境变量 4.在系统变量中进行设置&#xff0c;双击PATH进行配置 5.点击新建&am…

yum安装mysql、数据库tab自动补全,快来浅了解下 ?

centos7上面没有mysql&#xff0c;它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

Kotlin:泛型

点击查看泛型中文文档 点击查看泛型英文文档 简介 与 Java 类似&#xff0c;Kotlin 中的类也可以有类型参数&#xff1a; class Box<T>(t: T) {var value t }一般来说&#xff0c;要创建这样类的实例&#xff0c;我们需要提供类型参数&#xff1a; val box: Box<…

SpringBoot项目中出现不同端口跨域问题,如何解决?

方法一&#xff1a;比较繁琐&#xff0c;适合少量Controller控制器类 方法二 &#xff1a;需要写一个全局的配置文件即可 在如图所示的common目录下新建一个CorsConfig的class文件 具体代码展示&#xff1a; import org.springframework.context.annotation.Bean; import o…

淘宝客必看:微信公众号如何快速接入抖音本地团购并提高CPS收益

抖音已经成为社交媒体新的流量高地&#xff0c;抖音团购完全复刻了美团的模式&#xff0c;外卖、到店、吃喝玩乐全覆盖。很多淘宝客一直在寻找通过微信公众号实现营销变现的有效途径&#xff1f;是否对于如何将抖音团购转变为自己的佣金收入感到困惑&#xff1f;微信公众号接入…

Eslint + Prettier 配置

setting.json {"eslint.autoFixOnSave": true, // 保存文件时自动修复可修复的问题"eslint.validate": [// 定义哪些文件类型应该由 ESLint 验证"javascript","javascriptreact","vue" // 如果你正在使用 Vue&#xff0c;确…

基于单片机的GPS定位信息显示系统

基于单片机的GPS定位信息显示系统 摘 要 在当今信息时代的发展中&#xff0c;GPS全球定位系统是一个重要的组成部分&#xff0c;其具有精度很高、应用广泛、性能强大的特点&#xff0c;因此在实际生活中GPS全球定位显示系统被广泛运用于各类领域当中。它也是至今为止最好的定…

HarmonyOS 发送系统通知 基础通知

harmonyos中 提供了 各种不同功能的通知 来满足我们不同的业务需求 本文呢 我们先来看 最基本的通知 它的场景和使用方式 最基本的 是 当应用被切入后台 而应用内部发生了一些变化 就可以用通知的方式 来提醒用户 就比如 我们微信 被切到了后台 而这时 别人发消息过来了 那么…

2014

1,写出计算Ack(m,n)的递归算法 #include<iostream> using namespace std; int A(int m,int n){if(m0){return n1;}else if(m>0&&n0){return A(m-1,1);}else{return A(m-1,A(m,n-1));} }int main(){int m,n;cout<<"please input two number"&l…

【深度学习笔记】7_7 AdaDelta算法

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.7 AdaDelta算法 除了RMSProp算法以外&#xff0c;另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的…

分享一个国内可用的AIGC网站,PC/手机端通用|免费无限制,支持Claude3 Claude2

背景 AIGC作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个AI爱好者&#xff0c;翻遍了各大基于AIGC的网站&#xff0c;终于找到一个免费&#xff01;免登陆&#xff01;手机电脑通用&#xff01;国内可直接对话的AIGC&am…

Aigtek:衡量基准电压源的技术指标有哪些

基准电压源在电子领域中扮演着至关重要的角色&#xff0c;它为各种应用提供了稳定、可靠的电压。为了确保电路的准确性和可靠性&#xff0c;工程师需要关注和评估基准电压源的技术指标。衡量基准电压源的技术指标有很多&#xff0c;下面将详细介绍其中几个重要的指标。 首先是输…

全面解析unityplayer.dll丢失的5种解决方法,轻松搞定dll丢失

在使用Unity开发的游戏或应用过程中&#xff0c;如果发现系统提示“找不到unityplayer.dll”文件&#xff0c;可能会引发一系列的问题与不便。这将直接导致游戏或应用程序无法正常启动运行&#xff0c;因为unityplayer.dll是Unity引擎的核心组件之一&#xff0c;负责处理关键的…

基于Web的论文管理系统设计

目 录 目 录 III 摘 要 V 关键词 V Abstract VI Key Word VI 第一章 绪论 6 1.1系统设计背景 1 1.2系统设计目的与意义 1 1.3国内外现状 2 1.4本文结构 3 第二章 需求分析 3 2.1系统需求分析 4 2.2系统角色设计 4 第三章 系统开发技术 4 3.1 PHP语言简介和特点 5 3.2 Mysql数据…