clickhouse通过java jdbc实现增删改查,保姆级教程

news2024/11/25 19:20:44

一、clickhouse是一款开源的用于在线分析处理查询(OLAP :Online Analytical Processing)MPP架构的列式存储数据库。

二、clickhouse可以做用户行为分析,流批一体

三、我们现在用java通过jdbc的方式来操作clickhouse

四、先安装clickhouse,安装资料自行查找

五、操作步骤如下

5.1、在maven中引入clickhouse jar包

            <dependency>
				<groupId>com.clickhouse</groupId>
				<artifactId>clickhouse-jdbc</artifactId>
				<version>0.5.0</version>
			</dependency>
			<dependency>
				<groupId>com.clickhouse</groupId>
				<artifactId>clickhouse-client</artifactId>
				<version>0.5.0</version>
			</dependency>
			<dependency>
				<groupId>com.clickhouse</groupId>
				<artifactId>clickhouse-http-client</artifactId>
				<version>0.5.0</version>
			</dependency>

			<dependency>
				<groupId>org.apache.httpcomponents.client5</groupId>
				<artifactId>httpclient5</artifactId>
				<version>5.2.1</version>
			</dependency>
			<dependency>
				<groupId>org.apache.httpcomponents.client5</groupId>
				<artifactId>httpclient5-fluent</artifactId>
				<version>5.1.3</version>
			</dependency>

5.2、注意,httpclient5-fluent和httpclient5必须引入,否则会报错

5.3、编写一个DriverPropertyCreator 驱动接口

import java.sql.DriverPropertyInfo;
import java.util.Properties;

public interface DriverPropertyCreator {

	DriverPropertyInfo createDriverPropertyInfo(Properties properties);
}

5.4、编写一个ClickHouseQueryParam枚举


import java.sql.DriverPropertyInfo;
import java.util.Locale;
import java.util.Properties;

public enum ClickHouseQueryParam implements DriverPropertyCreator {

	DATABASE("database", null, String.class, "database name used by default"),
	USER("user", null, String.class, "user name, by default - default"),
	PASSWORD("password", null, String.class, "user password, by default null");

	private final String key;
	private final Object defaultValue;
	private final Class<?> clazz;
	private final String description;

	<T> ClickHouseQueryParam(String key, T defaultValue, Class<T> clazz, String description) {
		this.key = key;
		this.defaultValue = defaultValue;
		this.clazz = clazz;
		this.description = description;
	}

	public String getKey() {
		return key;
	}

	public Object getDefaultValue() {
		return defaultValue;
	}

	public Class<?> getClazz() {
		return clazz;
	}

	public String getDescription() {
		return description;
	}

	@Override
	public String toString() {
		return name().toLowerCase(Locale.ROOT);
	}

	@Override
	public DriverPropertyInfo createDriverPropertyInfo(Properties properties) {
		DriverPropertyInfo propertyInfo = new DriverPropertyInfo(key, driverPropertyValue(properties));
		propertyInfo.required = false;
		propertyInfo.description = description;
		propertyInfo.choices = driverPropertyInfoChoices();
		return propertyInfo;
	}

	private String[] driverPropertyInfoChoices() {
		return clazz == Boolean.class || clazz == Boolean.TYPE ? new String[] { "true", "false" } : null;
	}

	private String driverPropertyValue(Properties properties) {
		String value = properties.getProperty(key);
		if (value == null) {
			value = defaultValue == null ? null : defaultValue.toString();
		}
		return value;
	}
}

5.5、编写一个ClickHouseConnectionSettings枚举


import java.sql.DriverPropertyInfo;
import java.util.Properties;

public enum ClickHouseConnectionSettings implements DriverPropertyCreator {

	SOCKET_TIMEOUT("socket_timeout", 30000, "");

	private final String key;
	private final Object defaultValue;
	private final String description;
	private final Class<?> clazz;

	ClickHouseConnectionSettings(String key, Object defaultValue, String description) {
		this.key = key;
		this.defaultValue = defaultValue;
		this.clazz = defaultValue.getClass();
		this.description = description;
	}

	public String getKey() {
		return key;
	}

	public Object getDefaultValue() {
		return defaultValue;
	}

	public Class<?> getClazz() {
		return clazz;
	}

	public String getDescription() {
		return description;
	}

	public DriverPropertyInfo createDriverPropertyInfo(Properties properties) {
		DriverPropertyInfo propertyInfo = new DriverPropertyInfo(key, driverPropertyValue(properties));
		propertyInfo.required = false;
		propertyInfo.description = description;
		propertyInfo.choices = driverPropertyInfoChoices();
		return propertyInfo;
	}

	private String[] driverPropertyInfoChoices() {
		return clazz == Boolean.class || clazz == Boolean.TYPE ? new String[] { "true", "false" } : null;
	}

	private String driverPropertyValue(Properties properties) {
		String value = properties.getProperty(key);
		if (value == null) {
			value = defaultValue == null ? null : defaultValue.toString();
		}
		return value;
	}
}

5.6、编写一个ClickHouseProperties类


import java.util.Properties;

public class ClickHouseProperties {

	private String user;
	private String password;
	private String database;
	private int socketTimeout;

	public ClickHouseProperties() {
		this(new Properties());
	}

	public ClickHouseProperties(Properties info) {
		this.socketTimeout = (Integer) getSetting(info, ClickHouseConnectionSettings.SOCKET_TIMEOUT);

		this.database = getSetting(info, ClickHouseQueryParam.DATABASE);

		this.user = getSetting(info, ClickHouseQueryParam.USER);
		this.password = getSetting(info, ClickHouseQueryParam.PASSWORD);
	}

	public Properties asProperties() {
		PropertiesBuilder ret = new PropertiesBuilder();
		ret.put(ClickHouseConnectionSettings.SOCKET_TIMEOUT.getKey(), String.valueOf(socketTimeout));
		ret.put(ClickHouseQueryParam.USER.getKey(), user);
		ret.put(ClickHouseQueryParam.PASSWORD.getKey(), password);
		ret.put(ClickHouseQueryParam.DATABASE.getKey(), database);
		return ret.getProperties();
	}

	public ClickHouseProperties(ClickHouseProperties properties) {
		setUser(properties.user);
		setPassword(properties.password);
		setDatabase(properties.database);
		setSocketTimeout(properties.socketTimeout);
	}

	private <T> T getSetting(Properties info, ClickHouseQueryParam param) {
		return getSetting(info, param.getKey(), param.getDefaultValue(), param.getClazz());
	}

	private <T> T getSetting(Properties info, ClickHouseConnectionSettings settings) {
		return getSetting(info, settings.getKey(), settings.getDefaultValue(), settings.getClazz());
	}

	@SuppressWarnings("unchecked")
	private <T> T getSetting(Properties info, String key, Object defaultValue, Class<?> clazz) {
		String val = info.getProperty(key);
		if (val == null) {
			return (T) defaultValue;
		}
		if (clazz == int.class || clazz == Integer.class) {
			return (T) clazz.cast(Integer.valueOf(val));
		}
		if (clazz == long.class || clazz == Long.class) {
			return (T) clazz.cast(Long.valueOf(val));
		}
		if (clazz == boolean.class || clazz == Boolean.class) {
			final Boolean boolValue;
			if ("1".equals(val) || "0".equals(val)) {
				boolValue = "1".equals(val);
			} else {
				boolValue = Boolean.valueOf(val);
			}
			return (T) clazz.cast(boolValue);
		}
		return (T) clazz.cast(val);
	}

	public int getSocketTimeout() {
		return socketTimeout;
	}

	public void setSocketTimeout(int socketTimeout) {
		this.socketTimeout = socketTimeout;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getDatabase() {
		return database;
	}

	public void setDatabase(String database) {
		this.database = database;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	private static class PropertiesBuilder {
		private final Properties properties;

		public PropertiesBuilder() {
			properties = new Properties();
		}

		public void put(String key, String value) {
			if (value != null) {
				properties.put(key, value);
			}
		}

		public Properties getProperties() {
			return properties;
		}
	}
}

5.7、开始编写jdbc操作clickhouse的ClickhouseDemo


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.demoflowable.common.ClickHouseProperties;

import com.clickhouse.jdbc.ClickHouseConnection;
import com.clickhouse.jdbc.ClickHouseDataSource;


public class ClickhouseDemo {

	private static String username = "default";
	private static String password = "123456";
	private static String address = "jdbc:clickhouse://192.168.42.142:8123";
	private static String db = "bigdata";
	private static int socketTimeout = 600000;

	public static void main(String[] args) throws Exception {
		getConnection();
		dropTable();
		createTable(
				"create table t_demo_02(id UInt32,sku String,amount Decimal(16,2),create_time Datetime) engine =MergeTree partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku);");
		insertDemo();
		queryDemo();
		updateDemoById();
		deleteDemoById();
	}

	/**
	 * 查询数据
	 */
	public static void queryDemo() {
		List<Map<String, Object>> list = new ArrayList<>();
		String sql = "select * from t_demo";
		Connection connection = getConnection();
		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();
		}
		list.stream().forEach(item -> {
			Map<String, Object> rowData = item;
			System.out.println(rowData);
		});
		close(connection);
	}

	/**
	 * 创建表
	 * 
	 * @throws Exception
	 */
	public static void createTable(String tableSql) throws Exception {
		Connection connection = null;
		try {
			connection = getConnection();
			Statement statement = connection.createStatement();
			boolean execute = statement.execute(tableSql);
			if (execute) {
				System.out.println("创建表成功," + execute);
			}
		} finally {
			close(connection);
		}
	}

	/**
	 * 删除表
	 * 
	 * @throws Exception
	 */
	public static void dropTable() throws Exception {
		Connection connection = null;
		try {
			connection = getConnection();
			Statement statement = connection.createStatement();
			statement.execute("drop table t_demo_02;");
			System.out.println("删除表成功");
		} finally {
			close(connection);
		}
	}

	/**
	 * 
	 * @throws Exception
	 */
	public static void insertDemo() throws Exception {
		Connection connection = null;
		try {
			connection = getConnection();
			for (int i = 0; i < 5; i++) {
				String id = "10" + i;
				String sku = "sku20231108" + i;
				PreparedStatement pstmt = connection.prepareStatement(
						"insert into t_demo values(" + id + ", '" + sku + "', '6500.00','2023-11-08 12:00:00')");
				pstmt.execute();
			}
			System.out.println("insert success");
		} finally {
			close(connection);
		}
	}

	/**
	 */
	public static void deleteDemoById() throws Exception {
		Connection connection = null;
		try {
			connection = getConnection();
			PreparedStatement pstmt = connection.prepareStatement("delete from t_demo where sku = 'sku2023110801';");
			pstmt.execute();
			System.out.println("delete success");
		} finally {
			close(connection);
		}
	}

	/**
	 */
	public static void updateDemoById() throws Exception {
		Connection connection = null;
		try {
			connection = getConnection();
			PreparedStatement pstmt = connection
					.prepareStatement("alter table t_demo update amount=toDecimal32(1200.00,3) where id = '101'");
			pstmt.execute();
			System.out.println("update success");
		} finally {
			close(connection);
		}
	}

	public static Connection getConnection() {
		ClickHouseProperties properties = new ClickHouseProperties();
		properties.setUser(username);
		properties.setPassword(password);
		properties.setDatabase(db);
		properties.setSocketTimeout(socketTimeout);
		try {
			ClickHouseDataSource clickHouseDataSource = new ClickHouseDataSource(address, properties.asProperties());
			ClickHouseConnection conn = clickHouseDataSource.getConnection();
			System.out.println("连接成功");
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void close(Connection connection) {
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
}

整个过程就是这样,完全保姆级教程。操作后的效果,如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1186624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长春理工大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;主页 | 教育漏洞报告平台 兑换价格&#xff1a;10金币 获取条件&#xff1a;提交长春理工大学任意中危或以上级别漏洞

尚硅谷大数据项目《在线教育之实时数仓》笔记007

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P053 P054 P055 P056 P057 P058 P059 P060 P061 P062 P063 P064 P065 第9章 数仓开发之DWD层 P053 9.6 用户域用户注册事务事实表 9.6.1 主要任务 读…

kafka笔记要点和集群安装、消息分组、消费者分组以及与storm的整合机制

kafka笔记 1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端&#xff0c;一类叫producer&#xff08;消息生产者&#xff09;&#xff0c;一类叫做consumer&#xff08;消息消费者&#xff09;&#xff0c;客户端和broker服务器之间…

SAP BASIS SET_PARAMETER_ID_TOO_LONG

ji 原因 DATA:curvbelnid(40) TYPE c,"问题在这里curposnrid(40) TYPE c. "问题在这里curvbelnid sy-uname && VN.curposnrid sy-uname && PR.SET PARAMETER ID curvbelnid FIELD i_vbeln . SET PARAMETER ID curposnrid FIELD i_posnr . 改成 D…

【Proteus仿真】【STM32单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;系统运行后&#xff0c;系统开始运行&#xff0c;K1键控制左转向灯&#xff…

web前端-Gulp入门

web前端-Gulp入门 gulp的概述使用gulp准备工作gulp的常用APIgulp的常用插件gulpfile.js的初体验打包css文件打包scss文件打包js打包html打包images创建一个默认任务创建一个删除任务gulp启动服务创建一个监控任务 gulp的概述 gulp&#xff1a; 前端自动化打包固件工具&#xf…

uniapp在不需要后端数据的情况下 怎么记录用户进一次记录一次

目录 前言&#xff1a; html部分 js部分 完整代码 前言&#xff1a; 一时兴起&#xff0c;不喜勿喷&#xff0c;今天听到了这个问题想到了一个方法&#xff0c;解决方式如下。 html部分 他用于显示访问次数&#xff08;visitCount变量的值&#xff09;。 <template&…

Day24力扣打卡

打卡记录 寻找峰值&#xff08;二分法&#xff09; class Solution { public:int findPeakElement(vector<int> &nums) {int left -1, right nums.size() - 1; // 开区间 (-1, n-1)while (left 1 < right) { // 开区间不为空int mid left (right - left) / …

【Vue】vant2使用van-tree-select实现【全选、反选、搜索】,自定义组件,拿去即用。2.0版本保姆级教程

系列文章目录 这是原篇教程&#xff0c;本篇为升级版&#xff0c;旧版已废弃。对你们不友好。 【Vue】vue2移动端 &#xff0c;vant2使用van-tree-select分类选择实现【全选】和【取消全选】、【搜索过滤当前children】&#xff0c;只影响当前显示children&#xff0c;并且去重…

clickhouse.22.8.3.13单机版安装

介绍 1、clickhouse是一款优秀的开源MPP数据库。 安装ClickHouse的步骤如下&#xff1a; 2、下载clickhouse https://repo.clickhouse.tech/tgz/ 但是这个下载太慢了&#xff0c;找个国内的镜像 https://mirrors.aliyun.com/clickhouse/ 我们采用阿里云的镜像地址。 cli…

An error occurred while filtering resources

Description Path Resource Location Type An error occurred while filtering resources PMS line 1 Maven Java EE Configuration Problem不知道怎么跑出来了&#xff0c;update project 还是不行 但是不影响运行&#xff0c;奇…

记录两个Excel导出出现的问题

问题一&#xff1a;导出数据时&#xff0c;这行代码返回null&#xff0c;导致导出excel失败&#xff1b; Workbook workbook ExcelExportUtil.exportExcel(params, map);解决&#xff1a;排查出来&#xff0c;是因为版本问题&#xff0c;autopoi版本是1.2.1&#xff1b; 升级…

MCU系统的调试技巧

MCU系统的调试技巧对于确保系统稳定性和性能至关重要。无论是在嵌入式系统开发的初期阶段还是在产品维护和优化的过程中&#xff0c;有效的调试技巧可以帮助开发人员快速发现和解决问题&#xff0c;本文将讨论一些MCU系统调试的技巧。 首先&#xff0c;使用调试工具是非常重要…

小程序day05

使用npm包 Vant Weapp 类似于前端boostrap和element ui那些的样式框架。 安装过程 注意:这里建议直接去看官网的安装过程。 vant-weapp版本最好也不要指定 在项目目录里面先输入npm init -y 初始化一个包管理配置文件: package.json 使用css变量定制vant主题样式&#xff0…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程控制软件总结

红队专题 招募六边形战士队员[30]远控班第一期课程与远控总结 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [30]远控班第一期课程与远控总结 一.Bug修复(1)生成路径(2)显示系统版本号二.内存泄露(1)如何检查内存泄露 #define CRTDBG_…

Modbus通讯模拟仿真环境的搭建

文章目录 一、概要二、所需工具介绍三、搭建虚拟仿真环境1.Modbus RTU虚拟仿真环境搭建1.1.虚拟串口工具&#xff08;VSPD&#xff09;使用1.2.虚拟从站工具&#xff08;ModSim32&#xff09;使用1.3.虚拟主站工具&#xff08;Modscan32&#xff09;使用1.4.更改虚拟从站工具&a…

如何处理数据集内的缺失值?

照片 奥坎耶尼贡 由Pierre Bamin在Unsplash上拍摄 一、说明 也许数据科学或机器学习问题研究中要求最高的阶段是数据预处理阶段&#xff0c;其目的是最终创建有用的数据集。如果说处理很酷的机器学习模型是阿喀琉斯的热门&#xff0c;那么数据预处理就是被诅咒的西西弗斯。…

Git的高效使用 git的基础 高级用法

Git的高效使用 git的基础 高级用法 前言 什么是Git 在日常的软件开发过程中&#xff0c;软件版本的管理都离不开使用Git&#xff0c;Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linu…

认识EPLAN软件中的各种“点”

原文是网络上的一篇文章&#xff0c;内容有很多错字&#xff0c;我重新编辑了一下发出来&#xff0c;供参考。 在 EPLAN 中&#xff0c;有很多"点"&#xff0c;不同的点的具体含义各有不同&#xff0c;只有弄清楚了不同点的含义&#xff0c;在软件应用中才会得心应手…

【爬虫】Java爬虫爬取某招聘网站招聘信息

目录 前言 一、爬虫程序的基本架构 二、如何获取目标网站的页面内容 三、解析HTML页面&#xff0c;提取所需信息 四、代理IP的使用 五、完整代码 总结 前言 随着互联网的普及&#xff0c;越来越多的人开始关注网络上的招聘信息&#xff0c;而传统的求职方式愈发显得不够…