前言
上一篇文章我们介绍并安装体验了 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松柏
,获取联系方式交流!