侧边栏壁纸
  • 累计撰写 49 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

SpringBoot3实现Mysql+TDengine

阿砖
2024-12-12 / 0 评论 / 0 点赞 / 237 阅读 / 11775 字

一、配置

  1. 准备一个 Mysql 和 TDengine 的服务,我这里选用的是 docker-compose 来实现基础服务

services:
  #  Mysql 请自己从数据库拿到相应的表然后导入,默认不含有任何的数据库
  mysql:
    image: mysql:8.4.2
    container_name: "laboratory-mysql"
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 123qwe
    ports:
      - 6033:3306
    volumes:
      - ./mysql/data/:/var/lib/mysql
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    command:
      - --mysql-native-password=on
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
      - --lower_case_table_names=1
      # 最大链接数
      - --max_connections=10000
      #      - --sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
      - --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  tdengine:
    image: tdengine/tdengine:latest
    container_name: "laboratory-tdengine"
    ports:
      - "6030:6030"
      - "6041:6041"
      - "6043:6043"
      - "6044-6049:6044-6049"
      - "6044-6045:6044-6045/udp"
      - "6060:6060"
    restart: unless-stopped
    volumes:
      - ./dnode/data:/var/lib/taos
      - ./dnode/log:/var/log/taos
    hostname: tdengine-server
  1. 使用 docker-compose up -d 先把这两个服务启动起来

  2. 创建一个基础的 springboot web 服务,并添加下面 maven 坐标

        <!-- mysql -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- TDengine  -->
        <dependency>
            <groupId>com.taosdata.jdbc</groupId>
            <artifactId>taos-jdbcdriver</artifactId>
            <version>3.3.3</version>
        </dependency>
        <!-- ORM -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!-- 多数据源 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
            <version>4.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
  1. 创建 Mysql 和 TDengine 测试用例

    1. mysql

-- 创建数据库
CREATE DATABASE `tdengine-mybatis-demo` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';


-- 创建数据表
CREATE TABLE `device` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `code` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


-- 新增两个设备
INSERT INTO `tdengine-mybatis-demo`.`device` (`id`, `name`, `code`) VALUES (1, '空调外机01', 'AC01');
INSERT INTO `tdengine-mybatis-demo`.`device` (`id`, `name`, `code`) VALUES (2, '空调外机02', 'AC02');
  1. TDengine

-- 创建一个能源库,并且保留记录为365天
CREATE DATABASE energy PRECISION 'ns' KEEP 365;

-- 创建一个原始数据的超级表
CREATE STABLE `energy`.`data_original_record`(
    ts timestamp,
    current float
)TAGS(
    device_id int
);
  1. 修改 application.yml 配置

server:
  port: 18000

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://localhost:6033/tdengine-mybatis-demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
          username: root
          password: 123qwe
          driver-class-name: com.mysql.jdbc.Driver
        taosdata:
          driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
          url: jdbc:TAOS-RS://localhost:6041/energy?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
          username: root
          password: taosdata

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false

logging:
  level:
    com.runbrick.tdengine: debug
  1. 启动当前项目后出现下面的说明配置成功了

二、业务

项目总体结构如下

  1. DataOriginalRecord.java

package com.runbrick.tdengine.domain;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.sql.Timestamp;

@Data
@TableName("data_original_record")
public class DataOriginalRecord {

    private Timestamp ts;
    private float current;


    @TableField(value = "device_id")
    private Integer deviceId;

    /**
     * 子表名称,因为有超级表所有必须要有这个
     */
    private String tbname;
}
  1. Device.java

package com.runbrick.tdengine.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("device")
public class Device {

    private Integer id;

    private String name;

    private String code;
}
  1. DataOriginalRecordMapper.java

package com.runbrick.tdengine.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.runbrick.tdengine.domain.DataOriginalRecord;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface DataOriginalRecordMapper extends BaseMapper<DataOriginalRecord> {
}
  1. DeviceMapper.java

package com.runbrick.tdengine.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.runbrick.tdengine.domain.Device;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface DeviceMapper extends BaseMapper<Device> {
}
  1. IDeviceService.java

package com.runbrick.tdengine.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.runbrick.tdengine.domain.Device;

public interface IDeviceService extends IService<Device> {
}
  1. IDataOriginalRecordService.java

package com.runbrick.tdengine.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.runbrick.tdengine.domain.DataOriginalRecord;

public interface IDataOriginalRecordService extends IService<DataOriginalRecord> {
}
  1. DataOriginalRecordServiceImpl.java

package com.runbrick.tdengine.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runbrick.tdengine.domain.DataOriginalRecord;
import com.runbrick.tdengine.mapper.DataOriginalRecordMapper;
import com.runbrick.tdengine.service.IDataOriginalRecordService;
import org.springframework.stereotype.Service;

@Service
@DS("taosdata")
public class DataOriginalRecordServiceImpl extends ServiceImpl<DataOriginalRecordMapper, DataOriginalRecord> implements IDataOriginalRecordService {
}
  1. DeviceServiceImpl.java

package com.runbrick.tdengine.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runbrick.tdengine.domain.Device;
import com.runbrick.tdengine.mapper.DeviceMapper;
import com.runbrick.tdengine.service.IDeviceService;
import org.springframework.stereotype.Service;

@Service
public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements IDeviceService {
}

  1. 修改启动类加入下面的注解

package com.runbrick.tdengine;

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

@SpringBootApplication
// 加入此行注解
@MapperScan("com.runbrick.tdengine.mapper")
public class TdengineMybatisDemoApplication {

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

}

三、测试

package com.runbrick.tdengine;

import com.runbrick.tdengine.domain.DataOriginalRecord;
import com.runbrick.tdengine.domain.Device;
import com.runbrick.tdengine.service.IDataOriginalRecordService;
import com.runbrick.tdengine.service.IDeviceService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class TdengineMybatisDemoApplicationTests {

    @Autowired
    IDataOriginalRecordService iDataOriginalRecordService;

    @Autowired
    IDeviceService iDeviceService;

    @Test
    void contextLoads() {
        List<DataOriginalRecord> list = iDataOriginalRecordService.list();
        System.out.println(list);
        // 由于我这里没有做业务所以返回结果是 []
    }
    
    @Test
    void contextLoads1(){
        List<Device> list = iDeviceService.list();
        System.out.println(list);
        // 返回结果 [Device(id=1, name=空调外机01, code=AC01), Device(id=2, name=空调外机02, code=AC02)]
    }

}

0

评论区