Springboot里集成Mybatis-plus、ClickHouse

news2024/11/15 7:55:54

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄

🌹简历模板、学习资料、面试题库、技术互助

🌹文末获取联系方式 📝

在这里插入图片描述


Springboot里集成Mybatis-plus、ClickHouse目录

  • 前言
  • 1、构建JDK8 + Springboot 2.6.13项目
    • 1.1、修改Server URL,支持Java8
    • 1.2、 选择Springboot 版本、选择加载的依赖包
    • 1.3、查看pom.xml文件
    • 1.4、检查项目结构
      • 1.4.1、检查项目设置
      • 1.4.2、检查模块
    • 1.5、检查项目配置
      • 1.5.1、配置Maven环境
      • 1.5.2、检查Java编译配置
  • 2、集成Mybatis-plus、ClickHouse
    • 2.1、加载Mybatis-plus、ClickHouse依赖包
    • 2.2、修改配置文件
  • 3、在clickhouse里添加表
  • 4、在Springboot项目里创建商品表的操作类
    • 4.1、添加雪花ID实现
    • 4.2、添加Mybatis-plus写法的表操作
  • 5、测试
    • 5.1、新增数据
    • 5.2、查询数据
  • 结尾


【基于ClickHouse的大数据开发系列文章】

第一章 Linux部署-安装jdk以及shell脚本检查jdk


第二章 阿里云CentOs ClickHouse安装


第三章 Springboot里集成Mybatis-plus、ClickHouse


前言

上一章节讲解在阿里云ECS centos服务器上安装ClickHouse。
这一章节我们在Springboot里集成Mybatis-plus、ClickHouse。
环境:JDK8 + Springboot 2.6.13 + ClickHouse

1、构建JDK8 + Springboot 2.6.13项目

JDK8 + Springboot 2.x基本上都可以,保险起见,2.5-2.7左右最好。

1.1、修改Server URL,支持Java8

在Idea里创建一个Springboot项目,首先修改Server URL,默认的Server URL已经不支持JDK8。
在这里插入图片描述

1.2、 选择Springboot 版本、选择加载的依赖包

在这里插入图片描述

1.3、查看pom.xml文件

构建完成之后,就会生成一个Springboot项目,文件里最主要是pom.xml文件。
在这里插入图片描述

1.4、检查项目结构

在这里插入图片描述

1.4.1、检查项目设置

与我们的项目里选择的JDK8保持一致
在这里插入图片描述

1.4.2、检查模块

检查项目结构,语言级别、Sources、Resources、Test Resources等。
在这里插入图片描述

1.5、检查项目配置

检查项目的Settings。

1.5.1、配置Maven环境

(JDK8 对应的是3.3 - 3.9等,一般使用3.6、3.8最佳)
在这里插入图片描述

1.5.2、检查Java编译配置

检查Java编译配置,1.8、8都可以,代表使用java8编译Java文件。
在这里插入图片描述

2、集成Mybatis-plus、ClickHouse

2.1、加载Mybatis-plus、ClickHouse依赖包

在pom.xml文件里加载Mybatis-plus、ClickHouse依赖包。
顺道把fastjson也加入进去。

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

        <!--Mybatis-plus ORM-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.33</version>
        </dependency>

2.2、修改配置文件

把默认的application.properties文件修改为 application.yaml文件

spring:
  application:
    name: clickhouse-project
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:clickhouse://clickhouse远程主机:8123/default
    driver-class-name: ru.yandex.clickhouse.ClickHouseDriver
    username: default
    password:

mybatis-plus:
  # 搜索指定包别名
  type-aliases-package: com.xique.springbootclick.entity
  configuration:
    map-underscore-to-camel-case: true  #开启驼峰命名
    cache-enabled: false #开启二级缓存
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台日志
  check-config-location: true # 检查xml是否存在
  type-enums-package: com.gton.enumPackage  #通用枚举开启
  global-config:
    db-config:
      logic-not-delete-value: 1
      logic-delete-field: isDel
      logic-delete-value: 0
      table-prefix: t_
server:
  port: 18123

在这里插入图片描述

3、在clickhouse里添加表

创建一张商品表,skuId、url、image、country、name、price、freight等字段。

CREATE TABLE default.t_product
(
    `skuId`  String,
    `url` String,
    `image` String,
    `country` String,
    `name` String,
    `price` String,
    `freight` String
)
ENGINE = SummingMergeTree
PARTITION BY country
ORDER BY skuId 
SETTINGS index_granularity = 8192 

数据库表创建成功,使用show tables命令,就可以看到我们创建的表了。
在这里插入图片描述

4、在Springboot项目里创建商品表的操作类

4.1、添加雪花ID实现

我们这次采用雪花ID生成商品SkuId,所以添加雪花ID实现

public class SnowflakeIdWorker {
    /**
     * 开始时间截 (2015-01-01)
     */
    private final long twepoch = 1420041600000L;
    /**
     * 机器id所占的位数
     */
    private final long workerIdBits = 5L;
    /**
     * 数据标识id所占的位数
     */
    private final long datacenterIdBits = 5L;
    /**
     * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
     */
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
    /**
     * 支持的最大数据标识id,结果是31
     */
    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
    /**
     * 序列在id中占的位数
     */
    private final long sequenceBits = 12L;
    /**
     * 机器ID向左移12位
     */
    private final long workerIdShift = sequenceBits;
    /**
     * 数据标识id向左移17位(12+5)
     */
    private final long datacenterIdShift = sequenceBits + workerIdBits;
    /**
     * 时间截向左移22位(5+5+12)
     */
    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    /**
     * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
     */
    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
    /**
     * 工作机器ID(0~31)
     */
    private long workerId;
    /**
     * 数据中心ID(0~31)
     */
    private long datacenterId;
    /**
     * 毫秒内序列(0~4095)
     */
    private long sequence = 0L;
    /**
     * 上次生成ID的时间截
     */
    private long lastTimestamp = -1L;
    /**
     * 构造函数
     * @param workerId     工作ID (0~31)
     * @param datacenterId 数据中心ID (0~31)
     */
    public SnowflakeIdWorker(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }
    /**
     * 获得下一个ID (该方法是线程安全的)
     * @return SnowflakeId
     */
    public synchronized long nextId() {
        long timestamp = timeGen();
        // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
        if (timestamp < lastTimestamp) {
            throw new RuntimeException(
                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }
        // 如果是同一时间生成的,则进行毫秒内序列
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            // 毫秒内序列溢出
            if (sequence == 0) {
                //阻塞到下一个毫秒,获得新的时间戳
                timestamp = tilNextMillis(lastTimestamp);
            }
        }
        // 时间戳改变,毫秒内序列重置
        else {
            sequence = 0L;
        }
        // 上次生成ID的时间截
        lastTimestamp = timestamp;
        // 移位并通过或运算拼到一起组成64位的ID
        return ((timestamp - twepoch) << timestampLeftShift) //
                | (datacenterId << datacenterIdShift) //
                | (workerId << workerIdShift) //
                | sequence;
    }
    /**
     * 阻塞到下一个毫秒,直到获得新的时间戳
     * @param lastTimestamp 上次生成ID的时间截
     * @return 当前时间戳
     */
    protected long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }
    /**
     * 返回以毫秒为单位的当前时间
     * @return 当前时间(毫秒)
     */
    protected long timeGen() {
        return System.currentTimeMillis();
    }

}

通过Common类去调用

public class Common {

    public static volatile SnowflakeIdWorker idWorker = null;

    public static synchronized SnowflakeIdWorker getIdWorker() {
        if (null == idWorker) {
            idWorker = new SnowflakeIdWorker(0, 0);
        }
        return idWorker;
    }

}

4.2、添加Mybatis-plus写法的表操作

可以使用Mybatis代码生成工具,逆向ClickHouse数据库生成代码,并复制到项目里面,省时省力。
不会的同学可以去学习我的【Springboot】专栏。
在这里插入图片描述

5、测试

增加单元测试。

package com.qhkj.clickhousedemo;

import com.alibaba.fastjson.JSON;
import com.qhkj.clickhousedemo.constant.Common;
import com.qhkj.clickhousedemo.entity.Product;
import com.qhkj.clickhousedemo.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@Slf4j
@SpringBootTest
public class ProductTest {

    @Resource
    private ProductService productService;

    @Test
    void saveProduct() {
        Product product = Product.builder()
                .skuId(String.valueOf(Common.getIdWorker().nextId()))
                .url("http://xxx.com/skuid=xxxx")
                .country("EN")
                .image("http://image.xxx.com/skuid=xxxx")
                .name("DIABLO 4 GOLD SEASON 5")
                .price("275美元")
                .freight("15美元运费")
                .build();
        productService.save(product);
        log.info("商品信息保存成功");
    }

    @Test
    void selectAll() {
        List<Product> productList = productService.selectAll();
        log.info("productList:{}", JSON.toJSONString(productList));
    }


}

5.1、新增数据

构造一个商品类,新增一条数据并执行
在这里插入图片描述

5.2、查询数据

查询所有数据。
在这里插入图片描述

结尾

本章节,讲解Springboot + mybatis-plus 集成ClickHouse,实现增加数据、查询数据。
下一章节,我们在项目里集成RabbitMq,使用消息队列来接收数据,并存储到ClickHouse。
数据来源我们另外构造一个系统,使用Springboot + Jsoup解析ebay网数据,去获取耳机、显卡、iPhone等类目的热卖商品,使用RabbitMq发送数据。

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

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

相关文章

第2章-09-浏览器同源策略及跨域

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

RPA自动化流程机器人助力企业财务数字化转型

在数字经济时代&#xff0c;企业需要快速响应市场变化&#xff0c;而财务数字化转型是企业适应现代商业环境、提升竞争力的必要步骤。财务数字化转型不仅涉及企业财务能力的提升&#xff0c;推动了财务管理与决策模式的转变。RPA自动化流程机器人因其能通过自动化技术帮助企业实…

【Hot100】LeetCode—200. 岛屿数量

目录 1- 思路DFS 深搜 2- 实现⭐200. 岛屿数量——题解思路 3- ACM 思路 题目连接&#xff1a;200. 岛屿数量 1- 思路 DFS 深搜 在遍历中对 res 结果进行 操作 。遇到一个陆地结果为 1 的地方&#xff0c; 就将他们直接填充为 0 思路 ① 先遍历&#xff0c;收集 res② 之后…

Springboot打包、部署

一、导入maven打包插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build> 二、执行打包操作&#xff08;…

【消息中间件】RabbitMQ

1 基础篇 1.1 为什么需要消息队列 1.2 什么是消息队列 1.3 RabbitMQ简介 1.4 RabbbitMQ安装 一、安装 # 拉取镜像 docker pull rabbitmq:3.13-management# -d 参数&#xff1a;后台运行 Docker 容器 # --name 参数&#xff1a;设置容器名称 # -p 参数&#xff1a;映射端口号…

MFC对话框程序界面UI优化Demo

目录 1. 修改MFC对话框背景色 1.1 在对话框头文件中申明画刷对象 1.2 在对话框源文件中OnInitDialog()函数中创建画刷对象 1.3 重载OnCtlColor&#xff0c;即WM_CTLCOLOR消息 2 修改文本框等控件的背景色、文字颜色 3 修改文本框等控件的字体大小 4 修改按钮控件的背景色…

在DDD中应用模式

深层模型和柔性设计并非唾手可得。要想取得进展&#xff0c;必须学习大量领域知识并进行充分的讨论&#xff0c;还需要经历大量的尝试和失败。但有时我们也能从中获得一些优势。一位经验丰富的开发人员在研究领域问题时&#xff0c;如果发现了他所熟悉的某种职责或某个关系网&a…

Puppeteer Web 抓取:使用 Browserless 的 Docker

Docker 镜像介绍 Docker 镜像是用于在 Docker 容器中执行代码的文件。它类似于构建 Docker 容器的指令集&#xff0c;就像一个模板。换句话说&#xff0c;它们相当于虚拟机环境中的快照。 Docker 镜像包含运行容器所需的所有库、依赖项和文件&#xff0c;使其成为容器的独立可…

虚拟机Ubuntu误操作导致无法自动联网的解决办法

直接上解决办法&#xff1a;安装netplan.io。 sudo apt install netplan.io sudo netplan apply 问题描述&#xff1a; 虚拟机的Ubuntu由于我的乱操作不小心删除了很多东西&#xff0c;导致开机无法自动联网了。而且在设置里边也没了设置网络的地方。 尝试不同办法发现用sudo…

基于javaweb+jsp的鲜花商城系统

基于javawebjsp的鲜花商城系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisJSP 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台 后台 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行…

超越GPT4V,最强多模态MiniCPM-V2.6模型分享

MiniCPM-V2.6是由OpenBMB开发的一款多模态大型语言模型&#xff08;MLLM&#xff09;&#xff0c;专为视觉-语言理解设计。 MiniCPM-V2.6模型能够处理图像、视频和文本输入&#xff0c;并提供高质量的文本输出。 MiniCPM-V 2.6模型在单图像理解方面超越了广泛使用的专有模型&…

78 Linux libusb库USB HID应用编程笔记

1 前言 这几天搞另外一个项目&#xff0c;基于Ubuntu开发一个小的应用程序&#xff0c;就是通过USB HID与设备通信。因此需要在Linux环境编写对应USB HID通信应用。 目前libusb库已经很好的支持USB相关应用的开发&#xff0c;库中提供了丰富的USB接口&#xff0c;用户可以直接调…

gptk是什么意思?Mac电脑如何在crossover里安装gptk2.0测试版?借助GPTK玩《原神》《黑神话悟空》游戏

很人多都听说使用 gptk2.0 beta 可以让《黑神话&#xff1a;悟空》等游戏的帧数提高&#xff0c;但自己并不知道如何安装&#xff0c;下面就给大家说下如何在crossover里安装 gptk2.0 beta 。安装前请先确认自己的电脑里已经安装好了crossover软件。 Game Porting Toolkit 简介…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

堆排序算法及优化(java)

目录 1.1 引言 1.2 堆排序的历史 1.3 堆排序的基本原理 1.3.1 堆的概念 1.3.2 堆排序的过程 1.3.3 堆调整 1.3.4 堆排序算法流程 1.4 堆排序的Java实现 1.4.1 简单实现 1.4.2 代码解释 1.4.3 优化实现 1.4.4 代码解释 1.5 堆排序的时间复杂度 1.5.1 分析 1.5.2 …

Flutter ListView滑动

在Flutter中&#xff0c;ScrollController可以精确地控制和管理滚动行为。通过ScrollController&#xff0c;可以监听滚动的位置、速度&#xff0c;甚至可以在用户滚动时触发自定义的动作。此外&#xff0c;ScrollController还提供了对滚动位置的直接控制&#xff0c;可以编程地…

Aiseesoft PDF Converter Ultimate 3.3.62 + crack

Aiseesoft PDF Converter Ultimate 是一个用于将 PDF 文件转换为其他格式的程序。它允许您将 PDF 转换为 Word、Text、Excel、PowerPoint、ePub、HTML、JPG、TIFF、PNG、GIF 等。 以下是该程序主要功能的简要说明: 支持不同的格式。该程序支持超过 25 种不同的格式,用于从 P…

PyTorch深度学习网络(一:MLP)

全连接神经网络&#xff0c;又称多层感知机&#xff08;MLP&#xff09;&#xff0c;是深度学习最基础的神经网络。全连接神经网络主要由输入层、隐藏层和输出层构成。本文实现了一个通用MLP网络&#xff0c;包括以下功能&#xff1a; 根据输入的特征数、类别数、各隐藏层神经…

Canvas 动画: atan2 三角函数与鼠标跟随效果

这个案例展示了如何使用HTML5的Canvas和JavaScript实现一个动态效果&#xff1a;在画布上绘制一个箭头&#xff0c;并让它实时跟随鼠标移动。这个小项目不仅有趣&#xff0c;还能帮助你理解编程和基本数学概念的实际应用。 项目需求 我们的目标是在一个画布上绘制一个箭头&…

java-4 final、单例类、枚举类、抽象类、接口

final 1. 认识final 2. 常量 大项目中经常将常量集中写在Constant文件中 单例类 &#xff08;设计模式&#xff09; 为什么要把构造器私有化&#xff0c;你不是私有化&#xff0c;别人就可以 new 好多个对象&#xff0c;还怎么是单例吖 定义一个类变量、类方法&#xff0c;…