栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

物联网设备数据流转之数据如何存储:TDengine集成SpringBoot, MyBatisPlus实现ORM与CRUD

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

物联网设备数据流转之数据如何存储:TDengine集成SpringBoot, MyBatisPlus实现ORM与CRUD

背景

这篇文章我们重点实现 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 ACCEPT
pom依赖

添加 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.38XX2.4.0.14 及以上1.8.x
2.0.37XX2.4.0.6 及以上1.8.x
2.0.36X2.2.2.11 及以上2.4.0.0 - 2.4.0.51.8.x
2.0.35X2.2.2.11 及以上2.3.0.0 - 2.4.0.51.8.x
2.0.33 - 2.0.342.0.3.0 及以上2.2.0.0 及以上2.4.0.0 - 2.4.0.51.8.x
2.0.31 - 2.0.322.1.3.0 - 2.1.7.7XX1.8.x
2.0.22 - 2.0.302.0.18.0 - 2.1.2.1XX1.8.x
2.0.12 - 2.0.212.0.8.0 - 2.0.17.4XX1.8.x
2.0.4 - 2.0.112.0.0.0 - 2.0.7.3XX1.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!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/922070.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号