Java (MyBatis-Plus)整合 ClickHouse,踩坑指南!

前言

上一篇文章我们介绍并安装体验了 ClickHouse ,那么今天就来把它整合到 Java 的 Spring 体系中。

整合

引入依赖

首先我们引入下面这些基础依赖:

xml 复制代码
<dependency>
    <groupId>com.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.6.0</version>
    <!-- use uber jar with all dependencies included, change classifier to http for smaller jar -->
    <classifier>all</classifier>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>2.0.9</version>
</dependency>

为了能够灵活的在项目中切换 mysql 和 clickhouse ,我们可以引入以下依赖:

xml 复制代码
<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>3.5.2</version>
</dependency>

如果使用的是 SpringBoot3 的话要把依赖改成dynamic-datasource-spring-boot3-starter

配置文件

在配置文件中写下自己的真实配置,我本地的 ClickHouse 没有设置密码,所以就没有写:

yaml 复制代码
spring:
  # 数据库配置
  datasource:
    dynamic:
      # 设置默认的数据源或者数据源组,默认值为 master
      primary: mysql
      datasource:
        mysql:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/xxx?serverTimezone=Asia/Shanghai
          username: root
          password: 111111
        clickhouse:
          driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
          url: jdbc:ch://localhost/default?serverTimezone=Asia/Shanghai

整合 MyBatis-Plus

mapper 文件:

java 复制代码
/**
 * @author pine
 */
@DS("clickhouse")
public interface ClickHouseTestMapper extends BaseMapper<Table> {
}

这样,ClickHouseTestMapper就拥有基础的增删改查能力了。

(实测中,自定义 sql 会有问题,默认使用 selectOne 方法,查询多条数据会有异常,不知道是不是因为我使用的是 Java21 + Spring Boot3 的原因,有了解的哥们欢迎指教)

测试

接下来,我们进行一个简单的测试:

java 复制代码
/**
 * @author pine
 */
@SpringBootTest
public class MapperTest {
    @Resource
    private BackupMapper backupMapper;

    @Resource
    private ClickHouseTestMapper clickHouseTestMapper;

    @Test
    void mapperTest() {
        List<Table> o = clickHouseTestMapper.selectList(
                Wrappers.<Table>lambdaQuery()
                        .select(Table::getMessage)
        );
        System.out.println(o);
    }
}

ok,执行成功!

结尾

整体做下来感觉坑还是挺多的,比如最开始我是手动注入了 ClickHouse 的 DataSource Bean :

java 复制代码
/**
 * ClickHouse 配置
 *
 * @author pine
 */
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.clickhouse")
@Data
public class ClickHouseConfig {

    private String url;

    @Bean("clickHouseDataSource")
    public ClickHouseDataSource clickHouseDataSource() throws SQLException {
        System.out.println(url);
        return new ClickHouseDataSource(url);
    }
}

但是导致了 MySQL 无法正常使用,像是 DataSource 冲突覆盖了一样,然后才想到了用 dynamic-datasource。然后就是上面提到的自定义 sql 的问题,这里像是框架的原因。

ok,本文就到这里了,欢迎大家指出问题,一起学习交流!

也可以关注我的公众号co松柏,获取联系方式交流!

相关推荐
CodeSheep程序羊12 分钟前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
我是咸鱼不闲呀33 分钟前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
加油,小猿猿1 小时前
Java开发日志-双数据库事务问题
java·开发语言·数据库
yuluo_YX1 小时前
Reactive 编程 - Java Reactor
java·python·apache
山岚的运维笔记1 小时前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
南极企鹅2 小时前
springBoot项目有几个端口
java·spring boot·后端
清风拂山岗 明月照大江2 小时前
Redis笔记汇总
java·redis·缓存
xiaoxue..2 小时前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
忧郁的Mr.Li2 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
yq1982043011563 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端