springboot?整合?clickhouse的實現(xiàn)示例
1 ClickHouse準(zhǔn)備操作

使用的JDBC方式操作clickhouseclickhouse與springboot的整合使用
提前創(chuàng)建一張表,并為該表插入一些實驗數(shù)據(jù)
create table t_order01( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine =MergeTree partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id); insert into t_order01 values (101,'sku_001',1000.00,'2021-12-01 12:00:00'), (102,'sku_002',2000.00,'2021-12-01 11:00:00'), (102,'sku_004',2500.00,'2021-12-01 12:00:00'), (102,'sku_002',2000.00,'2021-12-01 13:00:00'), (102,'sku_002',12000.00,'2021-12-01 13:00:00'), (102,'sku_002',600.00,'2020-06-12 12:00:00');
2 使用jdbc方式操作ClickHouse
1、引入clickhouse的jdbc依賴
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.1.52</version>
</dependency>2、實例代碼
實大部分的操作和我們使用jdbc操作mysql的步驟類似,下面直接貼出代碼,可以結(jié)合注釋進(jìn)行參考使用
import oldlu.clickhouse.ClickHouseConnection;
import oldlu.clickhouse.ClickHouseDataSource;
import oldlu.clickhouse.settings.ClickHouseProperties;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CreateTableTest {
private static String username = "default";
private static String password = "你的連接密碼";
private static String address = "jdbc:clickhouse://clickhouse的連接IP地址:8123";
private static String db = "連接數(shù)據(jù)庫名稱(默認(rèn)數(shù)據(jù)庫:default)";
private static int socketTimeout = 600000;
public static void main(String[] args) throws Exception {
//getConn();
//queryTable();
//createTable("");
//insertOne();
//dropTable();
deleteById();
//updateById();
}
/**
* 查詢數(shù)據(jù)
*/
public static void queryTable(){
List<Map<String, Object>> list = new ArrayList<>();
String sql = "select * from user_info";
Connection connection = getConn();
try {
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
Map<String, Object> row = new HashMap<>();
for(int i = 1; i <= rsmd.getColumnCount(); i++){
row.put(rsmd.getColumnName(i), rs.getObject(rsmd.getColumnName(i)));
}
list.add(row);
}
} catch (SQLException e) {
e.printStackTrace();
}
//在此可以根據(jù)實際需求將解析的數(shù)據(jù)封裝到對象中
list.stream().forEach(item ->{
Map<String, Object> rowData = item;
System.out.println(rowData);
});
//System.out.println(list);
}
/**
* 創(chuàng)建表
* @throws Exception
*/
public static void createTable(String tableSql) throws Exception{
/*tableSql = "create table t_order02(\n" +
" id UInt32,\n" +
" sku_id String,\n" +
" total_amount Decimal(16,2),\n" +
" create_time Datetime\n" +
") engine =MergeTree\n" +
" partition by toYYYYMMDD(create_time)\n" +
" primary key (id)\n" +
" order by (id,sku_id);";*/
Connection connection = getConn();
Statement statement = connection.createStatement();
boolean execute = statement.execute(tableSql);
if(execute){
System.out.println(execute);
System.out.println("創(chuàng)建表成功");
}
}
/**
* 刪除表
* @throws Exception
*/
public static void dropTable() throws Exception{
Connection connection = getConn();
Statement statement = connection.createStatement();
statement.execute("drop table t_order01;");
System.out.println("刪除表成功");
}
/**
* 插入數(shù)據(jù)
* 實際使用時候,插入的語句里面的參數(shù)從外部傳入進(jìn)去
* @throws Exception
*/
public static void insertOne() throws Exception{
Connection connection = getConn();
PreparedStatement pstmt = connection.prepareStatement("insert into t_order01 values('103', 'sku_004', '2500.00','2021-06-01 12:00:00')");
pstmt.execute();
System.out.println("insert success");
}
/**
* 刪除數(shù)據(jù)
* 實際使用時候,刪除的語句里面的參數(shù)從外部傳入進(jìn)去
*/
public static void deleteById() throws Exception{
Connection connection = getConn();
//sku_id ='sku_001'
PreparedStatement pstmt = connection.prepareStatement("alter table t_order01 delete where sku_id = 'sku_002';");
pstmt.execute();
System.out.println("delete success");
}
/**
* 修改數(shù)據(jù)
* 實際使用時候,修改的語句里面的參數(shù)從外部傳入進(jìn)去
*/
public static void updateById() throws Exception{
Connection connection = getConn();
PreparedStatement pstmt = connection.prepareStatement("alter table t_order01 update total_amount=toDecimal32(2000.00,2) where id = '102'");
pstmt.execute();
System.out.println("update success");
}
public static Connection getConn() {
ClickHouseProperties properties = new ClickHouseProperties();
properties.setUser(username);
properties.setPassword(password);
properties.setDatabase(db);
properties.setSocketTimeout(socketTimeout);
ClickHouseDataSource clickHouseDataSource = new ClickHouseDataSource(address, properties);
ClickHouseConnection conn = null;
try {
conn = clickHouseDataSource.getConnection();
System.out.println(conn);
System.out.println("連接成功");
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}3、測試,選擇查詢和刪除一條數(shù)據(jù)為例做測試
查詢功能測試結(jié)果,見下面的控制臺數(shù)據(jù)打印

刪除功能測試結(jié)果,刪除 "sku_id = sku_002 "的數(shù)據(jù), 執(zhí)行方法之后,見下面的控制臺數(shù)據(jù)打印

3 SpringBoot的整合ClickHouse
在實際開發(fā)過程中,更多是與框架整合在一起進(jìn)行使用,比如很多項目中都使用springboot進(jìn)行開發(fā),下面演示如何在springboot中使用clickhouse
前置準(zhǔn)備
確保clickhouse服務(wù)正??捎?/p>
1、準(zhǔn)備一張表,以及表中插入一些實驗數(shù)據(jù)
CREATE TABLE user_info ( `id` UInt64, `user_name` String, `pass_word` String, `phone` String, `create_day` Date DEFAULT CAST(now(),'Date') )ENGINE = MergeTree primary key (id) order by (id); INSERT INTO user_info (id,user_name,pass_word,phone) VALUES (1,'xiaowang','123456','13325511231'), (2,'xiaoma','123456','13825511231'), (3,'xiaozhao','123456','18925511231');
2、執(zhí)行完畢上面的建表后,查詢下表數(shù)據(jù)

1、導(dǎo)入完整依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- clickHouse數(shù)據(jù)庫 -->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.1.53</version>
</dependency>
</dependencies>2、基礎(chǔ)配置文件
server:
port: 7010
# mybatis 配置
mybatis:
type-aliases-package: com.congge.entity
mapper-locations: classpath:/mapper/*.xml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
click:
driverClassName: ru.yandex.clickhouse.ClickHouseDriver
url: jdbc:clickhouse://IP地址:8123/default
username: default
password: 123456
initialSize: 10
maxActive: 100
minIdle: 10
maxWait: 60003、使用一個配置類,關(guān)聯(lián)第二步中的click配置屬性
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "spring.datasource.click")
public class ConnectionParamConfig {
private String driverClassName ;
private String url ;
private Integer initialSize ;
private Integer maxActive ;
private Integer minIdle ;
private Integer maxWait ;
private String username;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Integer getInitialSize() {
return initialSize;
}
public void setInitialSize(Integer initialSize) {
this.initialSize = initialSize;
}
public Integer getMaxActive() {
return maxActive;
}
public void setMaxActive(Integer maxActive) {
this.maxActive = maxActive;
}
public Integer getMinIdle() {
return minIdle;
}
public void setMinIdle(Integer minIdle) {
this.minIdle = minIdle;
}
public Integer getMaxWait() {
return maxWait;
}
public void setMaxWait(Integer maxWait) {
this.maxWait = maxWait;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}4、重寫datasource的配置,使用自定義的clickhouse的屬性配置
import javax.annotation.Resource;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DruidConfig {
@Resource
private ConnectionParamConfig jdbcParamConfig;
/**
* 重寫 DataSource
* @return
*/
@Bean
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(jdbcParamConfig.getUrl());
datasource.setDriverClassName(jdbcParamConfig.getDriverClassName());
datasource.setInitialSize(jdbcParamConfig.getInitialSize());
datasource.setMinIdle(jdbcParamConfig.getMinIdle());
datasource.setMaxActive(jdbcParamConfig.getMaxActive());
datasource.setMaxWait(jdbcParamConfig.getMaxWait());
datasource.setUsername(jdbcParamConfig.getUsername());
datasource.setPassword(jdbcParamConfig.getPassword());
return datasource;
}
}5、提供一個接口和mybatis的查詢xml文件
public interface UserInfoMapper {
void saveData (UserInfo userInfo) ;
UserInfo selectById (@Param("id") Integer id) ;
List<UserInfo> selectList () ;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.congge.mapper.UserInfoMapper">
<resultMap id="BaseResultMap" type="com.congge.entity.UserInfo">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="pass_word" jdbcType="VARCHAR" property="passWord" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="create_day" jdbcType="VARCHAR" property="createDay" />
</resultMap>
<sql id="Base_Column_List">
id,user_name,pass_word,phone,create_day
</sql>
<insert id="saveData" parameterType="com.congge.entity.UserInfo" >
INSERT INTO user_info
(id,user_name,pass_word,phone,create_day)
VALUES
(#{id,jdbcType=INTEGER},#{userName,jdbcType=VARCHAR},#{passWord,jdbcType=VARCHAR},
#{phone,jdbcType=VARCHAR},#{createDay,jdbcType=VARCHAR})
</insert>
<select id="selectById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user_info
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectList" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from user_info
</select>
</mapper>6、Service
@Service
public class UserInfoService {
@Resource
private UserInfoMapper userInfoMapper ;
public void saveData(UserInfo userInfo) {
userInfoMapper.saveData(userInfo);
}
public UserInfo selectById(Integer id) {
return userInfoMapper.selectById(id);
}
public List<UserInfo> selectList() {
return userInfoMapper.selectList();
}
}7、Controller
@RestController
public class UserInfoController {
@Resource
private UserInfoService userInfoService ;
//localhost:7010/saveData
@GetMapping("/saveData")
public String saveData (){
UserInfo userInfo = new UserInfo () ;
userInfo.setId(4);
userInfo.setUserName("xiaolin");
userInfo.setPassWord("54321");
userInfo.setPhone("18500909876");
userInfo.setCreateDay("2022-02-06");
userInfoService.saveData(userInfo);
return "success";
}
//localhost:7010/getById?id=1
@GetMapping("/getById")
public UserInfo getById (int id) {
return userInfoService.selectById(id) ;
}
@GetMapping("/getList")
public List<UserInfo> getList () {
return userInfoService.selectList() ;
}
}8、啟動類
@SpringBootApplication
@MapperScan(basePackages = {"com.congge.mapper"})
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
9、功能接口測試
查詢測試,調(diào)用接口:localhost:7010/getById?id=1

插入數(shù)據(jù)測試,調(diào)用接口:localhost:7010/saveData

然后再去clickhouse表中查詢下數(shù)據(jù)

總結(jié)
到此這篇關(guān)于springboot整合clickhouse的文章就介紹到這了,更多相關(guān)springboot 整合 clickhouse內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot2 整合 ClickHouse數(shù)據(jù)庫案例解析
- springboot+mybatis配置clickhouse實現(xiàn)插入查詢功能
- Springboot集成ClickHouse及應(yīng)用場景分析
- springboot?使用clickhouse實時大數(shù)據(jù)分析引擎(使用方式)
- SpringBoot配置Clickhouse的示例代碼
- SpringBoot實現(xiàn)mysql與clickhouse多數(shù)據(jù)源的項目實踐
- SpringBoot?mybatis-plus使用json字段實戰(zhàn)指南
- springboot+mybatis-plus實現(xiàn)自動建表的示例
- Springboot集成Mybatis-plus、ClickHouse實現(xiàn)增加數(shù)據(jù)、查詢數(shù)據(jù)功能
相關(guān)文章
SpringBoot啟動security后如何關(guān)閉彈出的/login頁面
這篇文章主要介紹了SpringBoot啟動security后如何關(guān)閉彈出的login頁面問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java多線程編程之使用Exchanger數(shù)據(jù)交換實例
這篇文章主要介紹了Java多線程編程之使用Exchanger數(shù)據(jù)交換實例,本文直接給出實例代碼,需要的朋友可以參考下2015-05-05
Java發(fā)送郵件javax.mail的實現(xiàn)方法
這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實現(xiàn)方法,具有一定的參考價值,代碼都有詳細(xì)的注釋,感興趣的小伙伴們可以參考一下2016-01-01
java中 spring 定時任務(wù) 實現(xiàn)代碼
java中 spring 定時任務(wù) 實現(xiàn)代碼,需要的朋友可以參考一下2013-03-03
在IntelliJ IDEA 搭建springmvc項目配置debug的教程詳解
這篇文章主要介紹了在IntelliJ IDEA 搭建springmvc項目配置debug的教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09

