一、配置
准备一个 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
使用
docker-compose up -d
先把这两个服务启动起来创建一个基础的 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>
创建 Mysql 和 TDengine 测试用例
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');
TDengine
-- 创建一个能源库,并且保留记录为365天
CREATE DATABASE energy PRECISION 'ns' KEEP 365;
-- 创建一个原始数据的超级表
CREATE STABLE `energy`.`data_original_record`(
ts timestamp,
current float
)TAGS(
device_id int
);
修改 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
启动当前项目后出现下面的说明配置成功了
二、业务
项目总体结构如下
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;
}
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;
}
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> {
}
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> {
}
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> {
}
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> {
}
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 {
}
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 {
}
修改启动类加入下面的注解
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)]
}
}
评论区