ClickHouse数据库之Java篇

标签: Clickhouse 分类: 数据库 创建时间:2019-12-19 11:24:02 更新时间:2025-01-17 10:39:22

上一篇( Post not found: ClickHouse数据库 ClickHouse数据库 ) 我写了关于ClickHouse数据库的安装以及数据到,接下来就是实际的用代码操作查询了。

1.pom.xml中添加相关的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!--	Mybatis	-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-configuration-processor </artifactId>
<optional> true </optional>
</dependency>
<!--clickhouse-->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.1.53</version>
</dependency>
<!-- Druid 数据连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>

2.修改application.yml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
click:
driverClassName: ru.yandex.clickhouse.ClickHouseDriver
url: jdbc:clickhouse://192.168.1.53:8123/default
initialSize: 10
maxActive: 100
minIdle: 10
maxWait: 6000
mybatis:
configuration:
map-underscore-to-camel-case: true
## 实体类包名称
type-aliases-package: com.bibichuan.Entity
mapper-locations: classpath:mapper/*.xml

如果要输入用户名密码的话,使用:jdbc:clickhouse://192.168.1.53:8123/lsmfhx?user=admin&password=1q2w3e4r

3.添加Druid的两个配置类

JdbcParamConfig配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.bibichuan.Durid;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.datasource.click")
public class JdbcParamConfig {
private String driverClassName ;
private String url ;
private Integer initialSize ;
private Integer maxActive ;
private Integer minIdle ;
private Integer maxWait ;
// 省略get和set
}

DruidConfig的配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.bibichuan.Durid;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;

@Configuration
public class DruidConfig {
@Resource
private JdbcParamConfig jdbcParamConfig;
@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());
return datasource;
}
}

注意
这里有一点我想提醒一下,@Component注解所在的包名尽量和main函数即@SpringBoot注解所在的包名相同,否则就要在main使用@ComponentScan(basePackages = {“com.**”})添加扫描的包路径,我时常犯这个错误,明明写了注解,就是找不到这个Bean所在的位置,搞了好长时间才找到原因。

4.resources下新建mybatis-config.xml文件(这一步不要也行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 开启驼峰式命名自动转换 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--设置别名-->
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
</typeAliases>
</configuration>

5.新建实体类,映射数据表

1
2
3
4
5
6
7
8
9
10
package com.bibichuan.Entity;

import javax.persistence.Entity;
import javax.persistence.Id;

public class RealTime {
private Long id;
// 省略get和set
}

6.在resource文件夹下新建mapper文件夹

在resource文件夹下新建mapper文件夹并添加一个实体类的映射文件RealTime.xml

1
2
3
4
5
6
7
8
9
10
11
<?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">
<!--namespace 指定映射对应的mapper接口类-->
<mapper namespace="com.proheng.gis.mapper.VClientMapper">
<!--查询全部-->
<select id="searchAll" resultType="com.bibichuan.Entity.RealTime">
select * from realtime;
</select>

</mapper>

这里的映射文件还是不太熟悉。

7.在springboot的启动类上,添加扫描注解

在springboot的启动类main上,添加@MapperScan注解,指定上面创建的mapper接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.bibichuan.mapper")
public class BigdataApplication {

public static void main(String[] args) {
SpringApplication.run(BigdataApplication.class, args);
}

}

注意
@MapperScan注解要找准扫描的类路径,和mapper/*.xml中定义的路径差不多。

8.使用mapper

在控制器中引入realTimeMapper,有些地方又多加了服务层,我这里比较简单,就直接把服务层去掉了,直接用控制层调用dao层。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.bibichuan.bigdata.Ctrl;

import com.bibichuan.bigdata.mapper.RealTimeMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/api")
public class ApiCtrl {
@Resource
private RealTimeMapper realTimeMapper;

@RequestMapping("/helloword")
public String getData(){
System.out.println("helloworld");
System.out.println(realTimeMapper.searchAll());
return "helloworld";
}
}

注意
这里还是要注意searchAll()方法要和RealTime.xml里面定义的方法一至,否则会报错:

总结
1.pom.xml中接入依赖包
2.application.yml编写配置信息
3.编写DruidConfig的配置类和JdbcParamConfig配置类
4.编写实体类,映射数据表
5.编写Mapper接口及接口方法,选择、插入、删除等
6.编写resource/mapper下的映射文件*.xml,方法对应Mapper接口,namespace对应Mapper接口包名
7.在启动类上添加Mapper接口扫描
8.编写控制层或者服务层调用,注入Mapper接口

问题

也不能说是问题吧,其实也不影响查询,执行查询的时候,出现:testWhileIdle is true, validationQuery not set。

(1) 编写配置文件,在click属性下添加如下两个属性

1
2
validationQuery: SELECT 1
testWhileIdle: true

(2) 修改JdbcParamConfig类,添加上面两个属性

1
2
3
private Boolean testWhileIdle;
private String validationQuery;
// 省略set/get

(3) 将属性注入到dataSource的bean中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
public class DruidConfig {
@Resource
private JdbcParamConfig jdbcParamConfig;
@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.setValidationQuery(jdbcParamConfig.getValidationQuery());
datasource.setTestWhileIdle(jdbcParamConfig.getTestWhileIdle());

return datasource;
}
}

上面三步,就完成了。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。