在springboot中如何集成clickhouse进行读写操作

 更新时间:2024年11月18日 09:41:08   作者:oNuoyi  
本文介绍了在Spring Boot中集成ClickHouse的步骤,包括引入依赖、配置数据源、编写实体类和Mapper类进行CRUD操作,特别提到批量插入时需要在SQL语句中添加`FORMAT`以避免错误,在实际应用中,与MySQL的操作类似,只需将ClickHouse当作MySQL使用

上篇文章讲了如何在docker中搭建clickhouse,本篇记录一下在springboot中如何集成clickhouse并进行读写

1、引入依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--升级 druid驱动 1.1.10支持ClickHouse-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.13</version>
        </dependency>

2、编写数据源配置

@Configuration
public class DruidConfig {

    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:clickhouse://localhost:8123/test");
        dataSource.setInitialSize(10);
        dataSource.setMaxActive(100);
        dataSource.setMinIdle(10);
        dataSource.setMaxWait(-1);
        return dataSource;
    }

}

3、编写表实体类

和mysql一模一样写法,对应的表我通过DBeaver已经创建好了

package cn.yufire.sync.sls.getway.logs.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;

import java.io.Serializable;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "getway_logs")
@Data
public class GetwayLogs implements Serializable {
    /**
     * id
     */
    @TableField(value = "id")
    private Long id;

    /**
     * 接口名称:网关上定义的名称
     */
    @TableField(value = "api_name")
    private String apiName;

    /**
     * 响应体
     */
    @TableField(value = "response_body")
    private String responseBody;

    /**
     * 调用环境:TEST、RELEASE、PRE
     */
    @TableField(value = "api_stage_name")
    private String apiStageName;

    /**
     * 错误码
     */
    @TableField(value = "error_code")
    private String errorCode;

    /**
     * 请求类型
     */
    @TableField(value = "http_method")
    private String httpMethod;

    /**
     * 接口请求地址
     */
    @TableField(value = "api_path")
    private String apiPath;

    /**
     * 接口请求全地址
     */
    @TableField(value = "api_full_path")
    private String apiFullPath;

    /**
     * 请求时间
     */
    @TableField(value = "request_time")
    private String requestTime;

    /**
     * 请求体
     */
    @TableField(value = "request_body")
    private String requestBody;

    /**
     * 网关请求阿里云创建
     */
    @TableField(value = "getway_request_id")
    private String getwayRequestId;

    /**
     * 阿里云网关应用id
     */
    @TableField(value = "getway_app_id")
    private String getwayAppId;

    /**
     * 请求协议,HTTP、HTTPS、...
     */
    @TableField(value = "request_protocol")
    private String requestProtocol;

    /**
     * 客户端调用产生的随机字符串
     */
    @TableField(value = "client_nonce")
    private String clientNonce;

    /**
     * 网关应用名称
     */
    @TableField(value = "getway_app_name")
    private String getwayAppName;

    /**
     * 网关分组id
     */
    @TableField(value = "getway_group_id")
    private String getwayGroupId;

    /**
     * 客户端ip
     */
    @TableField(value = "client_ip")
    private String clientIp;

    /**
     * 网关绑定域名
     */
    @TableField(value = "getway_bind_domain")
    private String getwayBindDomain;

    /**
     * 请求体大小
     */
    @TableField(value = "request_size")
    private Integer requestSize;

    /**
     * 响应体大小
     */
    @TableField(value = "response_size")
    private Integer responseSize;

    /**
     * 后端应用响应HTTP状态码
     */
    @TableField(value = "app_response_code")
    private Integer appResponseCode;

    /**
     * 分组名称
     * */
    @TableField(value = "apiGroupName")
    private String apiGroupName;
}

4、创建一个mapper类进行增删改查

因为我使用clickhouse只需要批量插入,所以就写了一个批量插入的sql,当然mybatis-plus也有自带的批量插入的方法,但是不是一条sql执行的,而是通过批量执行多条 SQL 语句来实现的,所以就手写了一个批次插入的sql,这里有一个坑,批量插入clickhouse会报错,单条插入没问题,百度了发现批量插入各种小问题,需要在 Values前加一个FORMAT ,即 insert into x(xx,xx) FORMAT Values (),处理后就没有报错了

package cn.yufire.sync.sls.getway.logs.mapper;

import cn.yufire.sync.sls.getway.logs.pojo.GetwayLogs;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Insert;

import java.util.List;

public interface GetwayLogsMapper extends BaseMapper<GetwayLogs> {

    /**
     * 批量插入网关日志
     *
     * @param list 数据
     * @return
     */
    @Insert("<script>insert into getway_logs(" +
            "api_name," +
            "response_body," +
            "api_stage_name," +
            "error_code," +
            "http_method," +
            "api_path," +
            "api_full_path," +
            "request_time," +
            "request_body," +
            "getway_request_id," +
            "getway_app_id," +
            "request_protocol," +
            "client_nonce," +
            "getway_app_name," +
            "getway_group_id," +
            "client_ip," +
            "getway_bind_domain," +
            "request_size," +
            "response_size," +
            "app_response_code" +
            ") FORMAT Values " +
            " <foreach collection=\"list\" item=\"item\" index=\"index\" separator=\",\">\n" +
            "     (" +
            "#{item.apiName}," +
            "#{item.responseBody}," +
            "#{item.apiStageName}," +
            "#{item.errorCode}," +
            "#{item.httpMethod}," +
            "#{item.apiPath}," +
            "#{item.apiFullPath}," +
            "#{item.requestTime}," +
            "#{item.requestBody}," +
            "#{item.getwayRequestId}," +
            "#{item.getwayAppId}," +
            "#{item.requestProtocol}," +
            "#{item.clientNonce}," +
            "#{item.getwayAppName}," +
            "#{item.getwayGroupId}," +
            "#{item.clientIp}," +
            "#{item.getwayBindDomain}," +
            "#{item.requestSize}," +
            "#{item.responseSize}," +
            "#{item.appResponseCode}" +
            ")\n" +
            "        </foreach>" +

            "</script>")
    Integer batchInsert(List<GetwayLogs> list);


}

在业务中调用

@Autowired
private GetwayLogsMapper getwayLogsMapper;

log.info("批量插入至数据库中...,是否添加成功:{}", getwayLogsMapper.batchInsert(logs));

可以看到增删改查操作和操作mysql的一模一样,也就是说给clickhouse当成mysql用就行

在springboot中集成clickhouse中也遇到了一些报错

ClickHouse exception, code: 1002

使用了clickhouse的依赖和jpa依赖总是跑不起来,一直报没有驱动,给了驱动也不对

clickhouse集成springboot报错Unable to determine Dialect to use [name=ClickHouse, majorVersion=22]; user must register resolver or explicitly set 'hibernate.dialect'

百度了各种最后看到这个,直接给clickhouse的依赖和jpa的依赖去掉就给clickhouse当成mysql结果就正常了

在docker中搭建部署clickhouse教程

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java操作mongodb示例分享

    java操作mongodb示例分享

    这篇文章主要介绍了java操作mongodb示例,实现了简单的条件查询和复杂的条件查询,需要的朋友可以参考下
    2014-02-02
  • Java 实现倒计时功能(由秒计算天、小时、分钟、秒)

    Java 实现倒计时功能(由秒计算天、小时、分钟、秒)

    最近做项目遇到这样的需求,天、小时、分钟、秒的数值都是隔开的,服务器端只返回一个时间戳长度,怎么实现这样的功能呢?下面小编给大家带来了Java 实现倒计时功能的方案,需要的朋友参考下吧
    2018-01-01
  • idea新建mapper.xml文件详细步骤如:mybatis-config

    idea新建mapper.xml文件详细步骤如:mybatis-config

    这篇文章主要介绍了idea新建xml模板设置,例如:mybatis-config,本文分步骤通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • mybatis TypeHandler注入spring的依赖方式

    mybatis TypeHandler注入spring的依赖方式

    这篇文章主要介绍了mybatis TypeHandler注入spring的依赖方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java中的WeakHashMap、LinkedHashMap、TreeMap与Set详解

    Java中的WeakHashMap、LinkedHashMap、TreeMap与Set详解

    这篇文章主要介绍了Java中的WeakHashMap、LinkedHashMap、TreeMap与Set详解,在JVM中,一个对象如果不再被使用就会被当做垃圾给回收掉,判断一个对象是否是垃圾,我们的WeakHashMap就是基于弱引用,需要的朋友可以参考下
    2023-09-09
  • Java扑克牌速算24的方法

    Java扑克牌速算24的方法

    这篇文章主要为大家详细介绍了Java扑克牌速算24的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • FactoryBean使用及真实应用场景分享

    FactoryBean使用及真实应用场景分享

    这段文章详细介绍了FactoryBean在Spring中的应用,包括其定义、使用方法以及在Spring Boot中的实例,同时,探讨了如何利用FactoryBean整合MyBatis,简化了MyBatis与Spring的集成过程,通过FactoryBean,第三方库可以被优雅地加载到Spring容器中,提升了系统的灵活性和可扩展性
    2026-05-05
  • Java将集合List转换成String字符串(或String转换成List)详解

    Java将集合List转换成String字符串(或String转换成List)详解

    今天在写项目的时候遇到一个问题,就是要把得到的一个集合转换成字符串,下面这篇文章主要给大家介绍了关于Java将集合List转换成String字符串(或String转换成List)的相关资料,需要的朋友可以参考下
    2023-06-06
  • Java数据结构之选择排序算法的实现与优化

    Java数据结构之选择排序算法的实现与优化

    选择排序:(Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。本文主要为大家介绍一下选择排序的实现与优化,希望对大家有所帮助
    2023-01-01
  • Java实现获取两个日期之间的所有日期的开始时间集合

    Java实现获取两个日期之间的所有日期的开始时间集合

    这篇文章主要为大家详细介绍了如何使用Java实现获取两个日期之间的所有日期的开始时间集合,文中的示例代码简洁易懂,有需要的小伙伴可以参考下
    2026-03-03

最新评论