在完成数据库连接配置后,我们需要创建与 TDengine 表对应的 Java 实体类。实体类是 Java 对象与数据库表之间的映射,通过定义实体类,我们可以方便地在 Java 代码中操作数据库中的数据,实现数据的持久化和读取 。
假设我们在 TDengine 中创建了一个名为sensor_data的表,用于存储传感器数据,表结构如下:
CREATE TABLE sensor_data (
id INT AUTO_INCREMENT PRIMARY KEY,
sensor_id VARCHAR(50),
value FLOAT,
timestamp TIMESTAMP
);
在这个表中,id是主键,自增长;sensor_id表示传感器 ID;value表示传感器采集到的值;timestamp表示数据采集的时间戳 。
对应的 Java 实体类SensorData可以定义如下,将其放在src/main/java/com/example/springboottdengineintegration/entity目录下:
package com.example.springboottdengineintegration.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "sensor_data")
public class SensorData {
@Id
private int id; // 主键
private String sensorId; // 传感器ID
private float value; // 传感器值
private long timestamp; // 时间戳
// Getters 和 Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSensorId() {
return sensorId;
}
public void setSensorId(String sensorId) {
this.sensorId = sensorId;
}
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}
在这个实体类中,我们使用了 JPA(Java Persistence API)的注解来映射表结构和字段关系 。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
通过创建实体类并使用 JPA 注解进行映射,我们建立了 Java 对象与 TDengine 数据库表之间的联系,为后续的数据访问和业务逻辑处理奠定了基础 。
在 Spring Boot 项目中,数据访问对象(DAO)层负责与数据库进行交互,执行数据的增删改查(CRUD)操作。我们可以使用 Spring Data JPA 或 MyBatis 来实现 DAO 层,它们都提供了便捷的方式来操作数据库,并且与 Spring Boot 的集成非常方便 。
Spring Data JPA 是 Spring Data 的一部分,它基于 JPA 规范,提供了一种基于接口的、简洁的方式来访问数据库,大大减少了样板代码的编写 。在前面创建的 Spring Boot 项目中,我们已经添加了spring-boot-starter-data-jpa依赖,现在可以开始编写基于 Spring Data JPA 的 DAO 层代码。
首先,在src/main/java/com/example/springboottdengineintegration/dao目录下创建一个接口,例如SensorDataRepository,用于操作SensorData实体类对应的数据表。这个接口需要继承JpaRepository,JpaRepository是 Spring Data JPA 提供的一个基础接口,它已经包含了一些常用的 CRUD 方法,如save(保存实体)、findById(根据 ID 查找实体)、findAll(查找所有实体)、delete(删除实体)等,我们可以直接使用这些方法,无需编写具体实现 。
package com.example.springboottdengineintegration.dao;
import com.example.springboottdengineintegration.entity.SensorData;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SensorDataRepository extends JpaRepository
// 这里可以添加自定义查询方法,目前先使用JpaRepository提供的默认方法
}
在上述代码中:
MyBatis 是一个流行的持久层框架,它允许我们通过 XML 文件或注解来编写 SQL 语句,实现对数据库的灵活操作 。如果选择使用 MyBatis 来实现 DAO 层,首先需要在pom.xml文件中添加 MyBatis 和 TDengine JDBC 驱动的依赖(如果之前没有添加):
添加完依赖后,在src/main/java/com/example/springboottdengineintegration/dao目录下创建一个接口,例如SensorDataMapper:
package com.example.springboottdengineintegration.dao;
import com.example.springboottdengineintegration.entity.SensorData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface SensorDataMapper {
@Select("SELECT * FROM sensor_data")
List
// 这里可以添加更多自定义SQL方法,如插入、更新、删除等
}
在上述代码中:
同时,还需要在src/main/resources目录下创建mybatis/mapper文件夹(如果不存在),并在其中创建一个 XML 文件,例如SensorDataMapper.xml,用于编写更复杂的 SQL 语句(如果@Select注解中的简单 SQL 不能满足需求) 。XML 文件的内容如下:
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
在application.properties或application.yml文件中,还需要配置 MyBatis 的相关属性,例如:
# application.properties配置
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.example.springboottdengineintegration.entity
# application.yml配置
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.example.springboottdengineintegration.entity
上述配置中:
在实际开发中,除了使用框架提供的默认 CRUD 方法外,我们往往还需要定义一些自定义的查询方法来满足特定的业务需求 。无论是使用 Spring Data JPA 还是 MyBatis,都支持自定义查询方法 。
在 Spring Data JPA 中,我们可以通过在继承了JpaRepository的接口中定义符合特定命名规则的方法,或者使用@Query注解来实现自定义查询 。
List
在这个方法中,findBy是固定的前缀,表示查询操作,后面跟着实体类的属性名sensorId,Spring Data JPA 会自动生成 SQL 语句来查询sensorId等于传入参数的记录 。
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface SensorDataRepository extends JpaRepository
@Query("SELECT s FROM SensorData s WHERE s.value > :value AND s.timestamp BETWEEN :startTime AND :endTime")
List
}
在上述代码中:
如果需要使用原生 SQL 语句,可以在@Query注解中设置nativeQuery = true,例如:
@Query(value = "SELECT * FROM sensor_data WHERE value >?1 AND timestamp BETWEEN?2 AND?3", nativeQuery = true)
List
在这个方法中,?1、?2和?3是原生 SQL 中的占位符,按照参数顺序对应方法参数 。
在 MyBatis 中,我们可以在 Mapper 接口中使用注解或在 XML 文件中编写 SQL 语句来实现自定义查询 。
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
public interface SensorDataMapper {
@Insert("INSERT INTO sensor_data (sensor_id, value, timestamp) VALUES (#{sensorId}, #{value}, #{timestamp})")
int insertSensorData(@Param("sensorId") String sensorId, @Param("value") float value, @Param("timestamp") long timestamp);
}
在上述代码中:
UPDATE sensor_data
SET value = #{value}, timestamp = #{timestamp}
WHERE id = #{id}
在上述 XML 代码中:
在SensorDataMapper接口中,需要定义对应的方法来调用这个 XML 中的 SQL:
public interface SensorDataMapper {
int updateSensorData(SensorData sensorData);
}
这个方法的参数类型为SensorData实体类,MyBatis 会自动将实体类中的属性值与 XML 中 SQL 语句的占位符进行匹配和替换 。
通过以上方式,我们可以根据具体的业务需求,在 Spring Boot 与 TDengine 集成项目中灵活地编写 DAO 层的自定义查询方法,实现对 TDengine 数据库中时序数据的各种操作 。