1. pom 引入
<dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.4.6</version></dependency><dependency><groupId>org.roaringbitmap</groupId><artifactId>RoaringBitmap</artifactId><version>0.9.31</version></dependency>
RoaringBitmap 个人觉得比较好用,可以不用引入。
2. JDBC 配置
/*** 在高版本中 ClickHouseProperties 类已去掉,直接使用Properties。* url 格式:jdbc:clickhouse://host1:port,host2:port.../db* 集群模式也不再使用 BalancedClickhouseDataSource * @return* @throws SQLException*/public ClickHouseConnection getConnection() throws SQLException {Properties pro = new Properties();pro.setProperty("socket_timeout", 60000);//pro.setProperty(ClickHouseClientOption.SOCKET_TIMEOUT.getKey(),60000);ClickHouseDataSource clickHouseDataSource = new ClickHouseDataSource(url,pro);return clickHouseDataSource.getConnection(username,password);}/*** 和 ClickHouseDataSource 创建连接底层一致都是用 ClickHouseJdbcUrlParser.parse(url, properties)* @return* @throws SQLException*/public Connection getConnectionByJDBC() throws SQLException {//DriverManager.getConnection(url, pro );return DriverManager.getConnection(url, username, password);}
源码中有注明 jdbcurl 格式,集群模式,多个节点直接用","隔开
客户端参数设置,源码中ClickHouseClientOption 类中设置了参数的默认值,可以查看该类,依据自己需要通过Properties进行修改。
还有非客户端参数,可以通过 ClickHouseHttpOption 里面的参数设置,如:设置custom_http_headers 相关参数
pro.set(ClickHouseHttpOption.CUSTOM_HEADERS.getKey(),"xxx")
可以参考官方 github 升级说明:clickhouse-java/clickhouse-jdbc at v0.4.6 · ClickHouse/clickhouse-java · GitHub
3. 查询
/*** 执行查询,返回ResultSet* @param sql* @return* @throws SQLException*/public static ResultSet executeQuery(String sql) throws SQLException {return getConnection().createStatement().executeQuery(sql);}/*** 获取bitmap, sql 只返回一个字段 字段结构为bitmap* @param sql* @return* @throws SQLException*/public static ClickHouseBitmap getBitmap(String sql) throws SQLException {ResultSet resultSet = executeQuery(sql);if (resultSet.next()){return resultSet.getObject(1,ClickHouseBitmap.class);}else {return ClickHouseBitmap.empty();}}/*** 将结果转为 RoaringBitmap,比 ClickHouseRoaringBitmap 好用一些* @param sql* @return* @throws SQLException*/public static RoaringBitmap getRoaringBitmap(String sql) throws SQLException {ClickHouseBitmap clickHouseBitmap = getBitmap(sql);return (RoaringBitmap) clickHouseBitmap.unwrap();}
ResultSet 必须调用 next() 方法。查看源码currentRow 初始为null,直接取ResultSet 取不到。
获取ResultSet 中的多个字段
ResultSet resultSet = ClickhouseService.executeQuery(sql);while (resultSet.next()){ResultSetMetaData rsmd = resultSet.getMetaData();String column1= resultSet.getString(rsmd.getColumnName(1));String column2= resultSet.getString(rsmd.getColumnName(2));String column3= resultSet.getString(rsmd.getColumnName(3));}