时序数据库 IoTDB 集成 MyBatisPlus,告别复杂编码,简化时序数据 ORM 开发

代码简洁、高效开发,让你的时序数据应用构建更"丝滑"!

在物联网后台与服务模块的开发过程中,复杂编码与重复操作始终是开发团队难以绕开的挑战,不仅增加额外工作量,也抬高了系统的长期维护成本。

为有效缓解这一痛点,国产原生时序数据库 IoTDB 实现了与代码生成工具 MyBatisPlus 的深度集成,使开发者能够借助其强大的通用数据操作能力,以更简洁、更符合工程习惯的方式,高效管理时序数据。

  • 开箱即用,告别繁琐:借助 MyBatisPlus 的通用 Mapper,无需编写基础 CRUD 代码,即可快速完成企业级增删改查操作。
  • 高度兼容,无缝融入:集成设计充分尊重原有开发习惯,现有 MyBatisPlus 项目可平滑引入 IoTDB,时序数据与业务数据可用同一套架构统一处理。
  • 条件构造,灵活查询:支持通过 Lambda 表达式构建复杂查询条件,让时序数据的筛选与统计像操作传统数据库一样直观方便。

欢迎查看用户手册(可点击下方阅读原文直接进入)了解更多内容!

|--------|----------|
| 01 | 功能简介 |
| 02 | 使用步骤 |
| 03 | 使用示例 |

01

功能简介

MyBatis-Plus Generator 是 MyBatis-Plus 框架内置的代码生成工具,基于数据库表结构自动生成标准化的实体类、Mapper 接口、Service 层及 Controller 层代码,集成 MyBatis-Plus 的通用 CRUD 方法(如 BaseMapper 内置增删改查)和条件构造器(QueryWrapper),支持 Lombok、Swagger 等扩展注解,通过简单配置即可快速构建符合企业级规范的持久层代码,大幅减少单表操作的重复开发工作,适用于快速搭建后台管理系统或标准化数据服务模块。

下文将介绍如何使用 Mybatis-Plus Generator 连接 IoTDB,并生成数据库表对应的实体类、Mapper 接口、Service 层及 Controller 层代码文件。

02

使用步骤

(1) 版本要求

  • IoTDB:>= 2.0.2-SNAPSHOT
  • mybatisPlus:>= 3.5.10
  • iotdb-jdbc:>= 2.0.4-SNAPSHOT

(2) 操作流程

IoTDB 环境搭建

  1. 下载、安装并启动 IoTDB 服务,具体可参考官网快速上手页面:https://www.timecho.com/docs/zh/UserGuide/latest-Table/QuickStart/QuickStart_timecho.html

  2. 创建数据库 database1 及表 table1 / table2,相关 SQL 语句可参考官网示例数据:https://www.timecho.com/docs/zh/UserGuide/latest-Table/Reference/Sample-Data.html

创建 Maven 项目

  1. 创建 Maven 项目。

  2. 在 pom 中增加如下依赖配置:

xml 复制代码
<properties>    <maven.compiler.source>17</maven.compiler.source>    <maven.compiler.target>17</maven.compiler.target>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
<dependencies>    <dependency>        <groupId>com.baomidou</groupId>        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>        <version>3.5.10</version>    </dependency>    <dependency>        <groupId>com.baomidou</groupId>        <artifactId>mybatis-plus-generator</artifactId>        <version>3.5.10</version>    </dependency>    <dependency>        <groupId>com.github.jeffreyning</groupId>        <artifactId>mybatisplus-plus</artifactId>        <version>1.7.5-RELEASE</version>    </dependency>    <dependency>        <groupId>org.apache.velocity</groupId>        <artifactId>velocity-engine-core</artifactId>        <version>2.0</version>    </dependency>    <dependency>        <groupId>org.apache.iotdb</groupId>        <artifactId>iotdb-jdbc</artifactId>        <version>2.0.4-SNAPSHOT</version>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter</artifactId>        <version>3.4.3</version>        <exclusions>            <exclusion>                <groupId>org.slf4j</groupId>                <artifactId>slf4j-api</artifactId>            </exclusion>            <exclusion>                <groupId>commons-logging</groupId>                <artifactId>commons-logging</artifactId>            </exclusion>        </exclusions>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>        <version>3.4.3</version>        <exclusions>            <exclusion>                <groupId>org.slf4j</groupId>                <artifactId>slf4j-api</artifactId>            </exclusion>            <exclusion>                <groupId>commons-logging</groupId>                <artifactId>commons-logging</artifactId>            </exclusion>        </exclusions>    </dependency>    <dependency>        <groupId>io.springfox</groupId>        <artifactId>springfox-swagger2</artifactId>        <version>3.0.0</version>    </dependency>    <dependency>        <groupId>io.springfox</groupId>        <artifactId>springfox-swagger-ui</artifactId>        <version>3.0.0</version>    </dependency>    <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>        <version>1.18.36</version>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-test</artifactId>        <version>3.4.3</version>        <scope>test</scope>    </dependency>    <dependency>        <groupId>org.slf4j</groupId>        <artifactId>slf4j-api</artifactId>        <version>2.0.13</version>    </dependency>    <dependency>        <groupId>ch.qos.logback</groupId>        <artifactId>logback-classic</artifactId>        <version>1.5.16</version>    </dependency>    <dependency>        <groupId>ch.qos.logback</groupId>        <artifactId>logback-core</artifactId>        <version>1.5.16</version>    </dependency></dependencies><build>    <plugins>        <plugin>            <groupId>org.mybatis.generator</groupId>            <artifactId>mybatis-generator-maven-plugin</artifactId>            <version>1.4.2</version>            <dependencies>                <dependency>                    <groupId>org.apache.iotdb</groupId>                    <artifactId>mybatis-generator-plugin</artifactId>                    <version>2.0.2-SNAPSHOT</version>                </dependency>            </dependencies>            <configuration>                <verbose>true</verbose>                <overwrite>true</overwrite>                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>            </configuration>        </plugin>    </plugins></build>
  1. 新建执行文件,修改目标 IoTDB 的 url/ username/password,和目标文件生成目录 outputDir/pathInfo:
java 复制代码
package org.apache.iotdb;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;import com.baomidou.mybatisplus.generator.config.DataSourceConfig;import com.baomidou.mybatisplus.generator.config.OutputFile;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;import org.apache.iotdb.jdbc.IoTDBDataSource;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.sql.Types;import java.util.Collections;

@SpringBootApplication@MapperScan("org.apache.iotdb.mapper")public class Main{    public static void main(String[] args){        SpringApplication.run(Main.class, args);        IoTDBDataSource dataSource = new IoTDBDataSource();        dataSource.setUrl("jdbc:iotdb://127.0.0.1:6667/database1?sql_dialect=table");        dataSource.setUser("root");        dataSource.setPassword("root");        FastAutoGenerator generator = FastAutoGenerator.create(new DataSourceConfig.Builder(dataSource).driverClassName("org.apache.iotdb.jdbc.IoTDBDriver"));        generator                .globalConfig(builder -> {                    builder.author("IoTDB")                            .enableSwagger()                            .dateType(DateType.ONLY_DATE)                            .outputDir("src/main/java");                })                .packageConfig(builder -> {                    builder.parent("org.apache.iotdb")                            .mapper("mapper")                            .pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/java/org/apache/iotdb/xml"));                })                .dataSourceConfig(builder -> {                    builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {                        int typeCode = metaInfo.getJdbcType().TYPE_CODE;                        switch (typeCode) {                            case Types.FLOAT:                                return DbColumnType.FLOAT;                            default:                                return typeRegistry.getColumnType(metaInfo);                        }                    });                })                .strategyConfig(builder -> {                    builder.addInclude("table1");                    builder.entityBuilder()                            .enableLombok()//                            .addIgnoreColumns("create_time")                            .enableFileOverride();                    builder.serviceBuilder()                            .formatServiceFileName("%sService")                            .formatServiceImplFileName("%sServiceImpl")                            .convertServiceFileName((entityName -> entityName + "Service"))                            .enableFileOverride();                    builder.controllerBuilder()                            .enableRestStyle()                            .enableFileOverride();                })                .strategyConfig(builder -> {                    builder.addInclude("table2");                    builder.entityBuilder()                            .enableLombok()//                            .addIgnoreColumns("create_time")                            .enableFileOverride();                    builder.serviceBuilder()                            .formatServiceFileName("%sService")                            .formatServiceImplFileName("%sServiceImpl")                            .convertServiceFileName((entityName -> entityName + "Service"))                            .enableFileOverride();                    builder.controllerBuilder()                            .enableRestStyle()                            .enableFileOverride();                })                .execute();    }}

生成目标文件

  1. 运行 Main.java。

  2. 查看日志输出,如下所示即生成目标文件:

apache 复制代码
16:10:08.943 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator -- ==========================文件生成完成!!!==========================

查看目标文件

swift 复制代码
org/apache/iotdb/controller/Table1Controller.javaorg/apache/iotdb/controller/Table2Controller.javaorg/apache/iotdb/entity/Table1.javaorg/apache/iotdb/mapper/Table2.xmlorg/apache/iotdb/service/Table1Service.java  org/apache/iotdb/service/Table2Service.javaorg/apache/iotdb/service/impl/Table1ServiceImpl.java  org/apache/iotdb/service/impl/Table2ServiceImpl.javaorg/apache/iotdb/xml/Table1Mapper.xmlorg/apache/iotdb/xml/Table2Mapper.xml

修改注释

手动调整生成的代码 org/apache/iotdb/entity/Table1.java,org/apache/iotdb/entity/Table2.java 使其支持多主键查询。

perl 复制代码
// 新增 importimport com.github.jeffreyning.mybatisplus.anno.MppMultiId;
//  新增注解 @MppMultiId@MppMultiId// 修改注解 @TableId() -->> @TableField()@TableField("time")privateDate time;
//  新增注解 @MppMultiId@MppMultiId// 修改注解 @TableId() -->> @TableField()@TableField("region")privateString region;
//  新增注解 @MppMultiId@MppMultiId// 修改注解 @TableId() -->> @TableField()@TableField("plant_id")privateString plantId;
//  新增注解 @MppMultiId@MppMultiId// 修改注解 @TableId() -->> @TableField()@TableField("device_id")privateString deviceId;

03

使用示例

完整的使用示例可参考 GitHub 源码:https://github.com/apache/iotdb-extras/tree/master/examples/mybatisplus-generator

规上企业应用实例

能源电力: 中核武汉 |国网信通产业集团|华润电力|大唐先一|上海电气国轩|清安储能|某储能厂商|太极股份

航天航空: 中航机载共性|蓝箭航天|北邮一号卫星|北邮二、三号卫星

钢铁、金属冶炼: 宝武钢铁|中冶赛迪|中国恩菲

交通运输: 中车四方|长安汽车|城建智控|德国铁路

智慧工厂与物联: PCB 龙头企业|博世力士乐|德国宝马|北斗智慧物联|某物联大厂|昆仑数据|怡养科技|绍兴安瑞思

相关推荐
IT19954 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
夕除4 小时前
redis--IO 多路复用(select + poll)
数据库·sql
小刘在重生~5 小时前
Servlet_day2 (上)|Servlet 整合 JDBC|请求转发 forward|Request 作用域
hive·hadoop·servlet
lzhdim8 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
天河归来8 小时前
从原始消息到业务数据:三层数据架构的设计与实践
数据库·数据仓库·架构
数据库小学妹9 小时前
金融数据库成本怎么算?五笔钱加一张TCO表
数据库·金融行业·数据库选型·国产化替代·tco·金融数据库
KaiwuDB9 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式
auspicious航9 小时前
PostgreSQL的备份与恢复
数据库·postgresql
这个DBA有点耶10 小时前
从 MySQL 到时序数据库:我帮朋友做迁移的完整记录
数据库·架构·dba
泡海椒10 小时前
深度解析JQuick-SQL AST到逻辑计划转换机制|分布式SQL原理
数据库·分布式·sql