iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何将Mybatis连接到ClickHouse
  • 532
分享到

如何将Mybatis连接到ClickHouse

2024-04-02 19:04:59 532人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

场景 最近在做数据分析项目,里面有这样一个业务:把匹配的数据打上标签,放到新的索引中。 数据量:累计亿级的数据 使用场景:可能会单次查询大量的数据,但不会设置复杂的条件,且这些数据

场景

最近在做数据分析项目,里面有这样一个业务:把匹配的数据打上标签,放到新的索引中。

数据量:累计亿级的数据

使用场景:可能会单次查询大量的数据,但不会设置复杂的条件,且这些数据不会被再次修改

原来使用的数据库elasticsearch

问题:上面也说了我这里打上标记后,这些数据几乎不会再修改了。ES 是一个全文检索引擎,更适用于进行大量文本检索的情况。这里与我上面的使用场景就不太匹配了。

技术选型的考虑:改用战斗民族开发的 ClickHouse,它适用于 OLAP 也就是数据分析的场景,当数据写入后,通过不同维度不断挖掘、分析,发现其中的商业价值。ClickHouse 适用于读远大于写的情况。

此外,相比ES,ClickHouse 占用的硬盘空间更小,也有利于降低运维成本。

下面是我在尝试接入 ClickHouse 时的一些实践,以及关于 ClickHouse数组类型转换问题的解决方案。

关于 ClickHouse 更详细的知识参考:https://zhuanlan.zhihu.com/p/98135840

示例代码已经上传到了 git,目前更新第 28 节:Https://GitHub.com/laolunsi/spring-boot-examples/

mybatis + ClickHouse

以前一直用 Mybatis 去操作 Mysql,其实 Mybatis 还可以操作 ClickHouse,这里用 Druid 进行连接管理。

Maven 配置


    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.5</version>
    </dependency>

    <dependency>
      <groupId>ru.yandex.clickhouse</groupId>
      <artifactId>clickhouse-jdbc</artifactId>
      <version>0.2.6</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.3</version>
    </dependency>

配置文件:


spring:
 datasource:
  type: com.alibaba.druid.pool.DruidDataSource

  # 注意这里是自定义的配置,通过 JdbcParamConfig 来加载配置到 Spring 中
  # 然后由 DruidConfig 来配置数据源
  click:
   driverClassName: ru.yandex.clickhouse.ClickHouseDriver
   url: jdbc:clickhouse://127.0.0.1:8123/test # ip:port/database
   userName: default
   passWord: default # 按照自己连接的 clickhouse 数据库来
   initialSize: 10
   maxActive: 100
   minIdle: 10
   maxWait: 6000
   validationQuery: SELECT 1

加载配置项的类:


@Component
@ConfigurationProperties(prefix = "spring.datasource.click")
public class JdbcParamConfig {
  private String userName;
  private String password;
  private String driverClassName ;
  private String url ;
  private Integer initialSize ;
  private Integer maxActive ;
  private Integer minIdle ;
  private Integer maxWait ;
  private String validationQuery;

  // ignore getters and setters
}

配置 Druid:


@Configuration
@MapperScan(basePackages = {
    "com.aeGIS.analysis.clickhousestorage.dao"
})
public class DruidConfig {
  @Resource
  private JdbcParamConfig jdbcParamConfig ;

  @Bean(name = "clickDataSource")
  public DataSource dataSource() throws ClassNotFoundException {
    Class classes = Class.forName("com.alibaba.druid.pool.DruidDataSource");
    DruidDataSource dataSource = (DruidDataSource) DataSourceBuilder
        .create()
        .driverClassName(jdbcParamConfig.getDriverClassName())
        .type(classes)
        .url(jdbcParamConfig.getUrl())
        .username(jdbcParamConfig.getUserName())
        .password(jdbcParamConfig.getPassword())
        .build();
    dataSource.setMaxWait(jdbcParamConfig.getMaxWait());
    dataSource.setValidationQuery(jdbcParamConfig.getValidationQuery());
    return dataSource;
  }

  @Bean
  public sqlSessionFactory clickHouseSqlSessionFactoryBean() throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource());
    // 实体 model的 路径 比如 com.order.model
    factory.setTypeAliasesPackage("com.example.clickhousedemo.model");
    //添加XML目录
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    factory.setMapperLocations(resolver.getResources("classpath:mapper
public class ClickArrayToIntHandler extends BaseTypeHandler<Integer[]> {

  @Override
  public void setNonNullParameter(PreparedStatement preparedStatement, int i, Integer[] integers, JdbcType jdbcType) throws SQLException {
    preparedStatement.setObject(i, integers);
  }

  @Override
  public Integer[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
    Object obj = resultSet.getObject(s);
    return parseClickHouseArrayToInt(obj);
  }

  @Override
  public Integer[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
    Object obj = resultSet.getObject(i);
    return parseClickHouseArrayToInt(obj);
  }

  @Override
  public Integer[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
    Object obj = callableStatement.getObject(i);
    return parseClickHouseArrayToInt(obj);
  }

  private Integer[] parseClickHouseArrayToInt(Object obj) {
    if (obj instanceof ClickHouseArray) {
      int[] res = new int[0];
      try {
        res = (int[]) ((ClickHouseArray) obj).getArray();
      } catch (SQLException ex) {
        ex.printStackTrace();
      }

      if (res != null && res.length > 0) {
        Integer[] resI = new Integer[res.length];
        for (int i = 0; i < res.length; i++) {
          resI[i] = res[i];
        }

        return resI;
      }
    }
    return new Integer[0];
  }
}

DAO.xml 也给一个示例:


<?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">
<mapper namespace="com.aegis.analysis.clickhousestorage.dao.UserInfoMapper">
  <resultMap id="BaseResultMap" type="com.example.clickhousedemo.model.UserInfo">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="name" property="name" />
    <result column="score" property="score" />
    <result column="score2" property="score2" />
    <result column="state" property="state" />
    <result column="createTime" property="createTime" />
    <!-- <result column="ranks" property="ranks" jdbcType="JAVA_OBJECT" javaType="java.lang.Object" />-->
    <result column="ranks" property="ranks" typeHandler="com.example.clickhousedemo.dao.ClickArrayToIntHandler" />
  </resultMap>

  <sql id="Base_Column_List">
    *
  </sql>

  <insert id="saveData" parameterType="com.aegis.analysis.clickhousestorage.model.UserInfo" >
    INSERT INTO user
      (id,name, score, score2, state, createTime, ranks)
    VALUES
    (#{id},#{name}, #{score}, #{score2}, #{state}, #{createTime}, #{ranks, jdbcType=ARRAY,
    typeHandler=com.example.clickhousedemo.dao.ClickArrayToIntHandler})
  </insert>

  <select id="selectById" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from user
    where id = #{id}
    limit 1
  </select>

  <select id="selectList" resultMap="BaseResultMap" >
    select
    <include refid="Base_Column_List" />
    from user
  </select>
</mapper>

具体代码可以去我的 Git 仓库里查看,还有 SpringBoot 整合其他中间件技术的示例,欢迎 Star!

https://github.com/laolunsi/spring-boot-examples

以上就是如何将Mybatis连接到ClickHouse的详细内容,更多关于Mybatis连接到ClickHouse的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何将Mybatis连接到ClickHouse

本文链接: https://www.lsjlt.com/news/121587.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何将Mybatis连接到ClickHouse
    场景 最近在做数据分析项目,里面有这样一个业务:把匹配的数据打上标签,放到新的索引中。 数据量:累计亿级的数据 使用场景:可能会单次查询大量的数据,但不会设置复杂的条件,且这些数据...
    99+
    2024-04-02
  • 怎么将Mybatis连接到ClickHouse
    这篇文章主要讲解了“怎么将Mybatis连接到ClickHouse”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么将Mybatis连接到ClickHouse”吧!场景最近在做数据分析项目,...
    99+
    2023-06-14
  • 如何使用go连接clickhouse
    这篇文章主要介绍“如何使用go连接clickhouse”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用go连接clickhouse”文章能帮助大家解决问题。近段时间业务在一个局点测试click...
    99+
    2023-07-05
  • 如何将mybatis配置到springmvc中
    MyBatis简介MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原...
    99+
    2023-05-30
    mybatis springmvc
  • 如何将myeclipse与navicat连接
    这篇文章主要介绍如何将myeclipse与navicat连接,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!myeclipse与navicat连接的步骤:1.安装mysql2.安装my...
    99+
    2024-04-02
  • 如何将手机app连接到阿里云服务器
    本文主要介绍如何将手机app连接到阿里云服务器,包括所需的步骤和注意事项。 手机app是现代生活中的必备工具,它能够帮助我们完成各种任务,从购物到社交,再到工作和学习。然而,为了使手机app能够正常运行,我们需要将它连接到服务器。阿里云服务...
    99+
    2023-12-17
    阿里 连接到 如何将
  • Idea连接clickhouse异常驱动类找不到Driver class ‘ru.yandex.clickhouse.ClickHouseDriver‘ not found.
    背景描述 Idea连接clickhouse时,报驱动类找不到。 报错信息如下: Driver class ‘ru.yandex.clickhouse.ClickHouseDriver’ not ...
    99+
    2023-09-28
    intellij-idea clickhouse java
  • html如何连接到css
    在 html 中连接到 css 有两种主要方法:在 \ 部分使用 \<link> 元素,指定要连接的样式表的 url。在 \ 元素内直接编写 css 代码。两种方法各有优缺...
    99+
    2024-04-11
    css
  • 如何使用 Node.js 将 MongoDB 连接到您的应用程序
    目录使用 Node.js 将 MongoDB 连接到您的应用程序第 1 步。创建一个帐户步骤 2. 部署您的第一个集群步骤 3. 创建用户名和密码第 4 步。添加您的 IP 地址第5...
    99+
    2024-04-02
  • 如何把navicat连接到eclipse
    要将Navicat连接到Eclipse,可以按照以下步骤操作:1. 在Navicat中创建一个新的数据库连接,确保您已经安装和配置好...
    99+
    2023-09-15
    navicat eclipse
  • springboot如何整合mybatis将sql打印到日志
    这篇文章主要介绍了springboot如何整合mybatis将sql打印到日志,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在前台请求数据的时候,sql语句一直都是打印到控制...
    99+
    2023-05-30
    mybatis spring boot
  • 如何将gitee与服务器连接
    随着云计算和开源力量的不断壮大,越来越多的开发者开始使用Git进行团队协作和代码管理。作为一款国产的Git代码托管平台,Gitee已成为了许多国内开发者的首选。如果你想将Gitee与服务器连接,下面将为你提供详细的步骤。步骤一:创建SSH公...
    99+
    2023-10-22
  • 如何连接到云服务器
    要连接到云服务器,请按照以下步骤操作: 打开浏览器,登录至您的云服务提供商的官方网站。 在页面顶部,点击“关于”链接。 在页面底部,找到“关于我们”和“隐私政策”。 在页面底部的“常见问题”部分,找到关于连接云服务器的常见问题和答案。 ...
    99+
    2023-10-26
    连接到 服务器
  • 如何连接到mysql服务器
    连接到mysql服务器的方法首先,使用组合键“win+R”运行cmd,进入DOS查看;进入DOS查看后,在DOS窗口中使用以下命令启动mysql服务;net start mysql 最后,mysql服务启动后,输入mysql数据库的用户名和...
    99+
    2024-04-02
  • 在MyBatis中如何将Mapper文件引用到resultMap中
    今天就跟大家聊聊有关在MyBatis中如何将Mapper文件引用到resultMap中,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ClassesMapper.xml:<res...
    99+
    2023-05-31
    mybatis resultmap mapper
  • 如何连接到Oracle数据库
    要连接到Oracle数据库,可以使用以下几种方法: 使用SQL*Plus命令行工具:可以通过在命令行窗口中输入sqlplus命令...
    99+
    2024-04-09
    Oracle
  • xshell如何连接到虚拟机
    本文小编为大家详细介绍“xshell如何连接到虚拟机”,内容详细,步骤清晰,细节处理妥当,希望这篇“xshell如何连接到虚拟机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2022-12-01
    xshell 虚拟机
  • 如何使用将新浪长连接转为短连接的API
    这篇文章将为大家详细讲解有关如何使用将新浪长连接转为短连接的API,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。新浪短网址api是新浪官方对外公开的长链接转为短链接的API,可以将冗长的链接地址缩短生成 ...
    99+
    2023-06-02
  • mybatis无法连接数据库如何解决
    如果MyBatis无法连接数据库,可以按照以下步骤进行排查和解决:1. 确认数据库配置:检查MyBatis的数据库配置是否正确,包括...
    99+
    2023-10-20
    mybatis 数据库
  • 如何将文件与实时接口连接起来?
    在计算机领域中,文件和实时接口是两个非常重要的概念,文件可以用来存储数据,而实时接口可以让程序和外部设备进行实时交互。那么,如何将文件与实时接口连接起来呢?本文将为你详细介绍如何实现这个目标。 一、文件的读写 在计算机中,文件是一种存储数...
    99+
    2023-08-20
    文件 实时 接口
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作