springboot整合mybatis-plus、clickhouse、mysql多数据源

2023-05-16

springboot的多数据源有多种方式,本文按照指定不同dao/mapper.xml的方式来实现访问不同的数据源。这样的好处是不用注解去切换数据源。

1、引入驱动

<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>${druid.version}</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatisplus.boot.version}</version>
</dependency>

<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<!-- clickhouse-->
<dependency>
    <scope>compile</scope>
    <groupId>com.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>${clickhouse-jdbc.version}</version>
</dependency>
<!-- 分页pagehelper-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${pagehelper.version}/version>
    <scope>compile</scope>
</dependency>

2、配置连接信息

spring:
  datasource:
    first:
      url: jdbc:mysql://192.168.11.89:3308/watch_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: zdxf123
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.mysql.cj.jdbc.Driver
    ch:
      url: jdbc:clickhouse://192.168.11.89:8123/watch_platform
      username: default
      password: zdxf@2022
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.clickhouse.jdbc.ClickHouseDriver
    #druid配置
    druid:
      validation-query: SELECT 1
      initial-size: 10 # 初始化连接:连接池启动时创建的初始化连接数量
      max-active: 1000 # 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量,如果设置为非正数则表示不限制
      min-idle: 10 # 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建
      max-wait: 60000 # 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
     login-username: druid # sql-stat监控用户名
       login-password: 123456 # sql-stat监控密码
     filter:
       stat:
         log-slow-sql: true
         slow-sql-millis: 1000
         merge-sql: false
       wall:
         config:
           multi-statement-allow: true

3、配置文件

mysql配置文件MysqlConf :


import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
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.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 lanbo
 *
 */

@Configuration
@MapperScan(basePackages = "com.xxxx.modules.*.dao", sqlSessionFactoryRef = "firstSqlSessionFactory")
public class MysqlConf {

    @Primary
    @Bean(name = "firstDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.first")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

    @Primary
    @Bean(name = "firstSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource,@Qualifier("mybatisConfiguration")MybatisConfiguration mybatisConfiguration,@Qualifier("globalConfig")GlobalConfig globalConfig) throws Exception {
    	MybatisSqlSessionFactoryBean  factoryBean = new MybatisSqlSessionFactoryBean();
        mybatisConfiguration.addInterceptor(new PaginationInterceptor());
        factoryBean.setConfiguration(mybatisConfiguration);
        GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
        dbConfig.setKeyGenerator(new OracleKeyGenerator());
        factoryBean.setGlobalConfig(globalConfig);
        factoryBean.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/**/*Dao.xml"));
        return factoryBean.getObject();
    }

    @Primary
    @Bean(name = "firstTransactionManager")
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("firstDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "firstSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(
            @Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

配置文件MybatisConfig :



import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 插件配置
 *
 * @author zj
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor pageClick = new PaginationInnerInterceptor(DbType.CLICK_HOUSE);
        PaginationInnerInterceptor pageMysql = new PaginationInnerInterceptor(DbType.MYSQL);
        mybatisPlusInterceptor.addInnerInterceptor(pageClick);
        mybatisPlusInterceptor.addInnerInterceptor(pageMysql);
        return mybatisPlusInterceptor;
    }
}

clickhouse的配置文件ChConfig:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Author LeeShaw
 * @Description 连接配置信息
 * @Date 2022/3/31 16:47
 **/
@ConfigurationProperties(prefix = "spring.datasource.ch")
@Data
@Component
public class ChConfig {
    private String url;
    private String username;
    private String password;
    private String type;
    private String driverClassName;

}

clickhouse的配置文件ClickHouseConfig:


import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.plugin.Interceptor;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * @Author LeeShaw
 * @Description
 * @Date 2022/3/31 9:45
 **/
@Configuration
@MapperScan(basePackages = "com.xxxx.clickhouse.dao", sqlSessionFactoryRef = "clickhouseSqlSessionFactory")
public class ClickHouseConfig {
    @Autowired
    private ChConfig config;

    @Bean(name = "clickhouseDataSource")
    public DataSource druidDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(config.getUrl());
        druidDataSource.setUsername(config.getUsername());
        druidDataSource.setPassword(config.getPassword());
        druidDataSource.setDbType(config.getType());
        druidDataSource.setDriverClassName(config.getDriverClassName());
        return druidDataSource;
    }

    @Bean(name = "clickhouseSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("clickhouseDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.addInterceptor(new PaginationInterceptor());
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(configuration);
        factoryBean.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        PageInterceptor pageHelper = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("reasonable", "true");
        properties.setProperty("supportMethodsArguments", "false");
        properties.setProperty("returnPageInfo", "check");
        properties.setProperty("params", "count=countSql");
        pageHelper.setProperties(properties);
        factoryBean.setPlugins(new Interceptor[] { pageHelper });
        factoryBean.setMapperLocations(resolver.getResources("classpath*:clickhouse/*Dao.xml"));
        return factoryBean.getObject();
    }

    @Bean(name = "clickhouseTransactionManager")
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("clickhouseDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "clickhouseSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(
            @Qualifier("clickhouseSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

4、目录结构

mysql的dao/mapper文件放在常规的目录下;clickhouse在单独目录下,如果想修改,在ClickHouseConfig里修改 @MapperScan(basePackages = "com.xxxx.yyyy.dao", sqlSessionFactoryRef = "clickhouseSqlSessionFactory")和 factoryBean.setMapperLocations(resolver.getResources("classpath*:clickhouse/*Dao.xml"));
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot整合mybatis-plus、clickhouse、mysql多数据源 的相关文章

  • 手写一个生产者--消费者模型例子

    在并发编程中 xff0c 比较经典的编程例子就是生产者和消费者模型 下面就是一个例子来诠释一下什么是生产者和消费者以及他们的特点和注意点 1 先定义一个数据对象 xff0c span class hljs keyword public sp
  • android R的一些selinux配置经验分享

    1 编译报 xff1a violated by allow avm3d service avm3d service exec file read getattr map execute open entrypoint 定位 xff1a 没有
  • 华为服务器安装Centos6.5

    1 登陆对应华为服务器 xff1a 100 100 100 206 默认ip为192 168 2 100 默认账号 xff1a root 默认密码 xff1a Huawei12 联想服务器 xff1a 默认ip为192 168 70 125
  • android系统应用之Settings

    Setting作为安卓一个比较重要的系统级应用 xff0c 为用户提供一些系统项的设置 原生android系统的源码路径 xff1a packages apps Settings 但MTK厂商的源码包中对该应用进行了重构其源码路径 xff1
  • 无人机的偏航角,滚动角,俯仰角解释

    1 偏航角 xff08 yaw xff09 简单的定义 xff1a 就是实际航向与计划航向之间的夹角 xff0c 如图所示 深刻的定义 xff1a 机轴 xff08 沿机头方向 xff09 水平投影与地轴的夹角 xff0c 如图所示 或者
  • ubuntu通过deepin-wine安装和windows一样效果微信、QQ等。

    开发中 xff0c 大家都使用ubuntu xff0c 但要用到微信 QQ等一些软件时 xff0c 很头痛 xff0c 因为腾讯不提供linux下的安装软件 xff0c 这是我们就要通过三方wine来进行安装 结果和windows中使用效果
  • 从根本解决AndroidStudio Unable to parse template "Class" Error message

    Unable to parse template 34 Class 34 Error message This template did not produce a Java class or an interface 根据template
  • android 解决BottomNavigationView+nav_host_fragment实现tab,fragment重建问题

    重建原因 xff1a 源码FragmentNavigator中对fragment的管理时通过replace实现的 xff0c 所以会导致每次切换时重建 解决思路 xff1a 继承FragmentNavigator 把replace的实现方式
  • git速查

    git速查 文章目录 git速查git init clone 仓库git config 配置git add rm mv添加 删除git commit提交git fetch remote pull push reset 远程同步git bra
  • ViewBinding的简单使用

    ViewBinding的作用就是为了避免编写findViewById xff0c 和kotlin android extensions插件类似 xff0c 项目工程模块的build gradle中加入以下配置 xff1a android b
  • 蓝牙HC05主从设置连接说明

    蓝牙HC05是主从一体的蓝牙串口模块 xff0c 简单的说 xff0c 当蓝牙设备与蓝牙设备配对连接成功后 xff0c 我们可以忽视蓝牙内部的通信协议 xff0c 直接将将蓝牙当做串口用 当建立连接 xff0c 两设备共同使用一通道也就是同
  • 英雄联盟无法开始第二局(已解决,亲测有效)

    目录 1 使用记事本打开hosts文件 xff0c 添加这一行113 250 3 73 prod rso lol qq com 编辑 2 在地址栏输入cmd xff08 个人觉得这样打开对小白方便些 xff0c 主要是打开cmd就行 xff
  • Windows下Zookeeper启动zkServer.cmd闪退问题的解决方案

    本人今天在使用RPC的过程中使用Zookeeper作为中间节点服务器 在windows中启动Zookeeper 在windows启动Zookeeper双击zkServer cmd xff08 但是需要保证安装了java环境 xff09 但是
  • (二叉树)高度平衡二叉树的判定

    题目描述 给定一个二叉树 xff0c 判断它是否是高度平衡的二叉树 本题中 xff0c 一棵高度平衡二叉树定义为 xff1a 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1 题目分析 由题意可知 xff0c 高度平衡二叉树是指树
  • 屏蔽快捷键

    屏蔽鼠标右键 function document oncontextmenu event returnValue 61 false 屏蔽F1帮助 function window onhelp return false 屏蔽其他功能键 fun
  • SpringBoot中使用防止用户重复点击,后台实现

    lt 64 Aspect需要的包 gt lt https mvnrepository com artifact aopalliance aopalliance gt lt dependency gt lt groupId gt aopall
  • Java基础-基本语法

    1 Java 语言有哪些特点 简单易学 有丰富的类库 面向对象 xff08 Java最重要的特性 xff0c 让程序耦合度更低 xff0c 内聚性更高 xff09 与平台无关性 xff08 JVM是Java跨平台使用的根本 xff09 可靠
  • Spring常用注解

    bean注入与装配的方式有很多种 xff0c 可以通过xml xff0c get set方式 xff0c 构造函数或者注解等 简单易用的方式就是使用Spring的注解 xff0c Spring提供了大量的注解方式 64 Required注解
  • RabbitMQ

    什么是 RabbitMQ xff1f RabbitMQ 是使用 Erlang 语言来编写的 xff0c 并且是基于 AMQP 协议 最大的特点就是 消费并不需要确保提供方存在 xff0c 实现了服务之间的高度解耦 AMQP xff1a Ad
  • word批量设置图片大小和对齐,使用宏定义

    word使用宏定义来批量设置图片大小 打开word中开发工具 xff0c 文件 选项 word选项 新建Visual Basic文件 点击 插入 模块 复制下列任意代码 xff0c 粘贴到右侧 xff08 注意可以灵活设置Myheigth或

随机推荐

  • postman设置不更新

    一 关闭自动更新目前有两种方案 xff1a 第一种 xff1a Hosts文件配置以下地址屏蔽连接 xff1a 1 以下配置粘贴到文件中 xff0c 文件位置 xff1a C Windows System32 drivers etc 0 0
  • ECharts多个折线图动态获取json数据

    ECharts 多个折线图动态获取json数据 效果图如下 xff1a 一 html部分 lt p id 61 34 TwoLineChart 34 style 61 34 width 100 height 400px 34 gt lt p
  • JS中setTimeout()的用法详解

    setTimeout 是属于 window 的 method 但我们都是略去 window 这顶层物件名称 这是用来设定一个时间 时间到了 就会执行一个指定的 method 1 SetTimeOut 1 1 SetTimeOut 语法例子
  • Java写个程序00001递增到99999

    NumberFormat f 61 new DecimalFormat 34 00000 34 for int i 61 1 i lt 10000 i 43 43 System out println f format i ER 00001
  • JQuery判断数组中是否包含某个元素

    inArray 34 元素字符串 34 数组名称 var arry 61 34 C 34 34 html 34 34 css 34 34 JavaScript 34 var result 61 inArray 34 C 34 arry 如果
  • JSP获得当前时间并显示

    lt 64 page import 61 34 java text SimpleDateFormat 34 gt lt 64 page import 61 34 java util 34 gt lt 64 page language 61
  • js 判断字符串是否包含另外一个字符串

    lt script type 61 34 text javascript 34 gt var str 61 34 测试一个字符串 ehtrzes 是否包含另外一个字符串 34 if str indexOf 34 ehtrzes 34 gt
  • js判断函数是否存在、判断是否为函数

    lt script type 61 34 text javascript 34 gt 判断是否为函数 try if typeof FunName 61 61 61 34 function 34 是函数 其中 FunName 为函数名称 al
  • python中的类和对象,属性和方法

    一 面向对象的概述 面向对象是一种描述业务问题 设计业务实体和实体之间关系的方法 二 类和对象 1 类和对象得区别 xff1a 类是对客观世界中事物得抽象 xff0c 而对象是类实例化后的实体 例如 xff1a 汽车模型就是一个类 xff0
  • 什么是“约瑟夫环”

    今天遇到一个关于 约瑟夫环 的问题 xff0c 于是上网查了下什么是 约瑟夫环 出自百度 xff1a 约瑟夫问题 xff08 有时也称为约瑟夫斯置换 xff0c 是一个出现在计算机科学和数学中的问题 在计算机编程的算法中 xff0c 类似问
  • 使用Fontcreator字体制作软件及字体设计学习

    fontcreator对于字体修改爱好者而言是一款极好的文字编辑工具 xff0c 门槛要求低 专业性强 集设计和修改为一体 xff0c 可用来制作 编辑 修改ttf xff0c otf xff0c ttc格式的字体文件 xff0c 非常的实
  • 远程连接centos 7 图形化桌面

    使用xrdp工具 xff0c 类似windows系统的远程桌面 xff08 rdp xff09 xff0c 需要在服务端安装远程桌面服务 如果你的服务器可以使用阿里的yum源 xff0c 可以直接使用epel仓库安装 xff0c 执行以下命
  • selinux - Android编写sepolicy

    为service编写sepolicy 由init启动的service服务要在各自的selinux domain中运行 具体flow如下 init devices rc中声明service xff0c 将在init时启动 xff1a Note
  • Spring Boot结合easyExcel实现自增序号

    有些业务功能要求能导出序号 xff0c 现在提供两种实现方式 通过mysql查询实现 xff1b 实现RowWriteHandler接口 xff0c 自定义拦截器 xff1b 一 通过mysql查询实现 通过自定义变量实现每行数据 43 1
  • Spring Boot 实体里的List集合参数验证

    Spring Boot 实体里的List集合参数验证 Spring Boot 通过Hibernate Validator 加验证大家都知道 不知道的话可以参考这篇文章SpringBoot里参数校验 参数验证 今天讲一下Spring Boot
  • 树形结构工具类,如:菜单、部门等

    1 树节点 span class token keyword package span span class token namespace com span class token punctuation span zjson span
  • EasyPoiUtil导出工具

    span class token keyword package span span class token namespace com span class token punctuation span zjson span class
  • ffmpeg部署和springboot使用

    视频存储部署 一 环境安装 1 1 yasm安装 在编译ffmpeg时 xff0c 执行 configure xff0c 报出了如下错误 xff1a nasm yasm not found or too old Use disable x8
  • 【docker】安装clickhouse

    一 联网安装clickhouse 1 为了方便安装 xff0c 将clickhouse的工作目录和数据目录都在同一个目录下 xff0c 在home下创建目录 mkdir clickhouse cd clickhouse 创建日志 配置文件
  • springboot整合mybatis-plus、clickhouse、mysql多数据源

    springboot的多数据源有多种方式 xff0c 本文按照指定不同dao mapper xml的方式来实现访问不同的数据源 这样的好处是不用注解去切换数据源 1 引入驱动 span class token generics span c