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));
}