物联网-01-Spring Boot + MyBatis‑Plus 操作 IoTDB(表模型)
用 Apache IoTDB(≥2.0 版本)的表模型(Table Model)当关系型数据库用做 Web 开发,但要看业务场景。
下面给你一个全面的判断和实操引:
Spring Boot + MyBatis‑Plus 操作 IoTDB(表模型)实践方案。
✅ IoTDB 2.0+ 表模型能做什么(接近关系型)
IoTDB 2.0 引入了标准 SQL 表模型,支持:
-
CREATE TABLE、INSERT、SELECT、UPDATE(仅 ATTRIBUTE 列)、DELETE -
WHERE、JOIN(INNER/LEFT/RIGHT/FULL)、GROUP BY、ORDER BY、LIMIT、子查询 -
主键(
PRIMARY KEY)、STRING / INT / FLOAT / DOUBLE / TIMESTAMP / BOOLEAN 等类型 -
JDBC 驱动,可对接 Spring Boot + MyBatis / MyBatis-Plus
简单示例:
CREATE DATABASE web_app;
USE web_app;
CREATE TABLE user_info (
user_id STRING PRIMARY KEY,
create_time TIMESTAMP,
username STRING,
email STRING,
status INT
);
INSERT INTO user_info (user_id, create_time, username, email, status)
VALUES ('U001', NOW(), 'alice', 'alice@test.com', 1);
一、依赖配置(Spring Boot 3.x 示例)
Java 侧用 iotdb-jdbc配数据源即可接 MyBatis:
1️⃣ Maven 依赖
<dependencies>
<!-- IoTDB JDBC 客户端 -->
<dependency>
<groupId>org.apache.iotdb</groupId>
<artifactId>iotdb-jdbc</artifactId>
<version>2.0.3</version>
</dependency>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<!-- Lombok(可选) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
⚠️ 前提:IoTDB ≥ 2.0(已开启表模型),否则下面内容不适用。
2️⃣ application.yml
spring:
datasource:
driver-class-name: org.apache.iotdb.jdbc.IoTDBDriver
# 关键:jdbc:iotdb://ip:port?sql_dialect=table 开启表模式
url: jdbc:iotdb://127.0.0.1:6667?sql_dialect=table
username: root
password: root
hikari:
maximum-pool-size: 10
⚠️ 与真正关系型数据库(MySQL/PG)的核心差异
|
方面 |
MySQL/PostgreSQL |
IoTDB 表模型(需注意) |
|---|---|---|
|
事务 |
完整 ACID、行锁 |
无跨行事务,弱隔离级别,不适合强一致性账务系统 |
|
UPDATE |
任意列可更新 |
UPDATE 只允许 ATTRIBUTE/TAG 列,TIME 和 FIELD 列通常不可 UPDATE |
|
外键/约束 |
支持 FK、UNIQUE、CHECK |
无外键、无唯一约束(PK 仅标识) |
|
索引 |
B+Tree、复合索引丰富 |
内部按时间+Tag 分区索引,不适合高频任意字段等值查询 |
|
设计初衷 |
OLTP 业务 CRUD |
时序+分析优先,时间列是隐含核心 |
🎯 适合 / 不适合的场景
✅ 适合这样用:
-
IoT / 监控系统后台(设备档案、告警规则、状态表 + 时序数据混合)
-
带有时间属性的业务数据(操作日志、审计轨迹、工单状态变更历史)
-
内管后台的字典表、配置表(量不大、更新少)
❌ 不建议这样用:
-
电商订单、支付账户、库存扣减等强事务 OLTP 系统
-
大量多表复杂 JOIN、频繁单行列 UPDATE 的纯 CRUD 系统
-
依赖外键约束、触发器保证数据一致性的场景
💡 推荐做法
如果做 Web 开发,常见合理架构是:
-
MySQL/PostgreSQL —— 存放用户、订单、权限等核心业务数据(ACID 需求)
-
IoTDB(表模型) —— 存放设备测点、日志流水、带时间戳的状态快照,供 Web 后台查询/图表展示
简单说:IoTDB 2.0 表模型可以跑 Web 项目的基础 CRUD,JDBC + MyBatis 能打通,但只要你的业务涉及强事务或外键约束,就别完全替代 MySQL/PG,建议混用。
二、整体可行性说明(先看这个)
✅ 可以做的事情
-
使用
iotdb-jdbc -
使用 MyBatis / MyBatis‑Plus
-
执行
SELECT / INSERT / DELETE -
分页查询(MP 分页插件)
-
实体映射(POJO ↔ Table)
❌ 不能做的事情
-
MP 的
updateById / update大部分会失败-
IoTDB 表模型中 FIELD 列不可 UPDATE
-
仅
ATTRIBUTES列允许更新(需显式 SQL)
-
-
不支持外键、唯一约束、乐观锁
-
不推荐依赖 MP 的自动填充、逻辑删除
👉 正确姿势:
MyBatis‑Plus 只当「增强版 CRUD + 分页」用,UPDATE 自己写 SQL。
三、IoTDB 表设计(非常关键)
IoTDB 表模型 必须理解清楚:
|
列类型 |
是否可 UPDATE |
用途 |
|---|---|---|
|
TIME |
❌ |
隐式时间列 |
|
TAG |
❌ |
维度 |
|
FIELD |
❌ |
数值 |
|
ATTRIBUTE |
✅ |
类似关系型字段 |
IoTDB 表模型中,只有 ATTRIBUTE列可以用标准 SQL 的 UPDATE … SET … WHERE语句直接修改;FIELD(测点列)、TAG、TIME列均不支持 UPDATE 语句。
FIELD 列"改值"的正确方式——重插同时间戳
IoTDB 的 FIELD 是时序测点值,相同 TAG + 相同 time 重新 INSERT 即为覆盖(更新):
✅ Web 开发推荐写法
CREATE DATABASE web_db;
USE web_db;
USE web_db;
CREATE TABLE device_info (
device_id STRING TAG, -- 标签列,不可 UPDATE
time TIMESTAMP TIME, -- 时间列,不可 UPDATE
temperature FLOAT FIELD, -- 测点列 ❌ 不能用 UPDATE 语句改
humidity DOUBLE FIELD, -- 测点列 ❌ 不能用 UPDATE 语句改
location STRING ATTRIBUTE, -- 属性列 ✅ 可用 UPDATE 改
owner STRING ATTRIBUTE -- 属性列 ✅ 可用 UPDATE 改
);
四、MyBatis‑Plus 实体类
@Data
@TableName("web_db.device_info")
public class DeviceInfo {
@TableId(value = "device_id", type = IdType.INPUT)
private String deviceId;
private Timestamp createTime;
private String deviceName;
private String location;
private Integer status;
}
✅ 说明:
-
@TableId必须手动赋值 -
不需要
@TableField(update = false)(MP 不支持 IoTDB 语义)
五、Mapper(继承 BaseMapper)
@Mapper
public interface DeviceInfoMapper extends BaseMapper<DeviceInfo> {
}
六、CRUD 实战(重点)
✅ 插入(OK)
DeviceInfo device = new DeviceInfo();
device.setDeviceId("D001");
device.setCreateTime(new Timestamp(System.currentTimeMillis()));
device.setDeviceName("温度传感器");
device.setLocation("北京");
device.setStatus(1);
deviceInfoMapper.insert(device);
✅ 查询(OK)
QueryWrapper<DeviceInfo> wrapper = new QueryWrapper<>();
wrapper.eq("device_id", "D001")
.ge("create_time", "2026-01-01 00:00:00");
List<DeviceInfo> list = deviceInfoMapper.selectList(wrapper);
✅ 分页查询(OK)
配置分页插件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
使用
Page<DeviceInfo> page = new Page<>(1, 10);
Page<DeviceInfo> result =
deviceInfoMapper.selectPage(page, null);
❌ 更新(不要用 MP 自带方法)
// ❌ 大概率报错
deviceInfoMapper.updateById(device);
✅ 正确方式:手写 SQL
Mapper
@Update("""
UPDATE web_db.device_info
SET status = #{status}
WHERE device_id = #{deviceId}
""")
int updateStatus(@Param("deviceId") String deviceId,
@Param("status") Integer status);
✅ 删除(OK)
deviceInfoMapper.deleteById("D001");
Spring Boot + MyBatis-Plus 的注意点
// ❌ MyBatis-Plus 自带的 updateById 如果试图改 FIELD 列会失败
deviceRecordMapper.updateById(record);
// ✅ 手写 SQL 只 UPDATE ATTRIBUTE 列
@Update("UPDATE web_db.device_record SET location=#{loc},
owner=#{owner} WHERE device_id=#{id}")
int updateAttribute(@Param("id") String id,
@Param("loc") String loc, @Param("owner") String owner);
// ✅ FIELD 列用 insert 覆盖(同 device_id + time)
deviceRecordMapper.insert(record);
简单记:IoTDB 表里"不变的描述信息"(ATTRIBUTE) 用 UPDATE,"随时间变的测点"(FIELD) 用 INSERT 覆盖,TAG/时间不能改。
七、Service 层推荐写法
@Service
public class DeviceService {
@Autowired
private DeviceInfoMapper deviceInfoMapper;
public void saveDevice(DeviceInfo device) {
device.setCreateTime(new Timestamp(System.currentTimeMillis()));
deviceInfoMapper.insert(device);
}
public List<DeviceInfo> listDevices() {
return deviceInfoMapper.selectList(null);
}
public void changeStatus(String deviceId, Integer status) {
deviceInfoMapper.updateStatus(deviceId, status);
}
}
八、最佳实践总结(非常重要)
✅ 推荐
-
用 MP 做 查询 + 分页 + 插入
-
表结构按 IoTDB 设计哲学来
-
UPDATE 全部手写 SQL
-
核心业务数据仍用 MySQL / PostgreSQL
❌ 不推荐
-
用 MP 的 update / saveOrUpdate
-
用逻辑删除、乐观锁
-
把 IoTDB 当纯 OLTP 数据库
九、典型 Web 架构建议
┌─────────────┐
│ Web API │
└──────┬──────┘
│
┌─────▼─────┐
│ MySQL/PG │ ← 用户、订单、权限
└─────┬─────┘
│
┌─────▼─────┐
│ IoTDB │ ← 设备、日志、状态、指标
└───────────┘
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)