这篇文章我们重点实现 SpringBoot 与 MyBatisPlus 、 TDengine 的集成,完成 ORM 以及 CRUD 。我们通常说的数据表 CRUD (Create, Retrieve, Update, Delete),这里仅涉及到了插入与查询,为什么?因为 TDengine 甚至都用不到我们自己在程序中进行更新、删除操作(可以在建库时设置更新、删除配置),所以重点就是查询啦,这里先体验基础查询,下一篇文章详细介绍高级查询功能:海量数据的条件查询、按时间范围查询、聚合查询、分页查询、TopN查询、降采样等。
业务场景在真正进行编码之前,我们需要先明确下具体的应用场景,这一场景是在我们实际物联网业务当中抽象出来的一个相对简单的模块。
模拟场景场景:在两个省份的多个城市、每个城市安装100个物联网设备。
{{"太原", "大同", "阳泉", "长治", "晋城", "朔州", "晋中", "运城", "忻州", "临汾", "吕梁"},
{"西安", "铜川", "宝鸡", "咸阳", "渭南", "延安", "汉中", "榆林", "安康", "商洛"}};
数据模型设计
根据具体业务,设计超级表与子表。(以下是经过简化后的,仅写入两条数据,说明问题即可)
-- ts, 时间戳
-- voltage, 电压
-- currente, 电流
-- temperature, 温度
-- sn, 设备序号
-- city, 时间戳
-- groupid, 分组编号
-- 超级表
create stable if not exists iot.power(ts timestamp, voltage int, currente float, temperature float) tags(sn int, city nchar(64), groupid int)
-- 子表
create table if not exists iot.device1 using iot.power tags(#{sn}, #{city}, #{groupid})
模拟数据
create table if not exists iot.device0 using iot.power tags(0, "太原", 0);
create table if not exists iot.device1 using iot.power tags(1, "西安", 1);
insert into iot.device0 values("2021-11-10 21:03:38.734", 1, 1.0, 1.0);
insert into iot.device1 values("2021-11-10 21:03:40.734", 2, 2.0, 2.0);
编码实现
先看下经过本文操作后的项目结构。
Note: 我们的配置文件中通过 com.taosdata.jdbc.TSDBDriver 建立与 TDengine 数据库的连接,端口为 6030 ,记得同时开放 TCP 、 UDP 。
iptables -I INPUT -p TCP --dport 6030 -j ACCEPT iptables -I INPUT -p UDP --dport 6030 -j ACCEPTpom依赖
添加 MyBatisPlus 、 TDengine 的依赖信息。
com.baomidou
mybatis-plus-boot-starter
3.1.2
com.taosdata.jdbc
taos-jdbcdriver
2.0.37
Note:这里一定要注意依赖文件 taos-jdbcdriver 的版本,最好与使用 TDengine 服务以及客户端的版本相一致,或者至少要兼容,否则会出现莫名其妙的问题,甚至直接无法建立连接。关于兼容性,官方文档里有个兼容矩阵。
| taos-jdbcdriver 版本 | TDengine 2.0.x.x 版本 | TDengine 2.2.x.x 版本 | TDengine 2.4.x.x 版本 | JDK 版本 |
|---|---|---|---|---|
| 2.0.38 | X | X | 2.4.0.14 及以上 | 1.8.x |
| 2.0.37 | X | X | 2.4.0.6 及以上 | 1.8.x |
| 2.0.36 | X | 2.2.2.11 及以上 | 2.4.0.0 - 2.4.0.5 | 1.8.x |
| 2.0.35 | X | 2.2.2.11 及以上 | 2.3.0.0 - 2.4.0.5 | 1.8.x |
| 2.0.33 - 2.0.34 | 2.0.3.0 及以上 | 2.2.0.0 及以上 | 2.4.0.0 - 2.4.0.5 | 1.8.x |
| 2.0.31 - 2.0.32 | 2.1.3.0 - 2.1.7.7 | X | X | 1.8.x |
| 2.0.22 - 2.0.30 | 2.0.18.0 - 2.1.2.1 | X | X | 1.8.x |
| 2.0.12 - 2.0.21 | 2.0.8.0 - 2.0.17.4 | X | X | 1.8.x |
| 2.0.4 - 2.0.11 | 2.0.0.0 - 2.0.7.3 | X | X | 1.8.x |
在配置文件中新增以下内容,主要是 TDengine 数据库的连接配置以及 MyBatisPlus 调试日志打印配置。
spring:
datasource:
driver-class-name: com.taosdata.jdbc.TSDBDriver
url: jdbc:TAOS://iot1:6030/iot?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
username: root
password: taosdata
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
logging:
level:
com:
heartsuit:
storage:
mapper: debug
修改包扫描
修改之前 ResultAdvice.java 中对 Controller 的包扫描配置。
@RestControllerAdvice(basePackages = "com.heartsuit.common.controller") 改为 @RestControllerAdvice(basePackages = "com.heartsuit")新增类
- Power.java
@Data
public class Power {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8")
private Timestamp ts;
private Integer voltage;
private Float currente;
private Float temperature;
private Integer sn;
private String city;
private Integer groupid;
}
- PowerMapper.java
@Mapper @Repository public interface PowerMapper extends BaseMapper{ @Insert("insert into device${sn}(ts,voltage,currente,temperature) values(#{ts}, #{voltage}, #{currente}, #{temperature})") int insertOne(Power one); }
Note: Insert 操作这里仅在 Mapper 层添加了一个插入接口,并没有在 Controller 层调用;我们将在 EMQX 处使用 Spring 事件与监听机制当 WebHook 收到实时数据时执行插入操作。
- PowerMapper.xml
ts, voltage, currente, temperature, city, groupid
- PowerController.java
这里的查询接口直接使用了 MyBatisPlus 的 selectList 以及 selectCount 方法。
@RestController
@RequestMapping("power")
public class PowerController {
@Autowired
private PowerMapper powerMapper;
@GetMapping("select")
public Result selectList() {
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.last("limit 10");
List powerList = powerMapper.selectList(wrapper);
powerList.forEach(System.out::println);
return Result.success(powerList);
}
@GetMapping("total")
public Result selectCount() {
int count = powerMapper.selectCount(null);
return Result.success(count);
}
}
小总结
至此, TDengine 闪亮登场,并且我们完成了 TDengine 集成 SpringBoot 、 MyBatisPlus 实现了 ORM 与 基础的 CRUD 功能。下一篇文章将详细介绍 TDengine 高级查询功能:海量数据的条件查询、按时间范围查询、聚合查询、分页查询、TopN查询、降采样。
Reference- https://www.taosdata.com/cn/getting-started/
- https://www.taosdata.com/docs/cn/v2.0/connector/java
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!



