第十七节 在SpringBoot项目操作TDengine时序数据库

亮子 | 2026-03-04 13:42:08 | 39 | 0 | 0 | 0

1、添加依赖

<!-- TDengine -->
<dependency>
    <groupId>com.taosdata.jdbc</groupId>
    <artifactId>taos-jdbcdriver</artifactId>
    <version>3.8.1</version>
</dependency>

<!-- Druid 连接池 (可选,但推荐) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.27</version>
</dependency>

2、修改配置文件

server:
  port: 9201

# Spring
spring:
  application:
    # 应用名称
    name: demo-boot
  profiles:
    # 环境配置
    active: dev
  datasource:
    # 使用Druid连接池
    type: com.alibaba.druid.pool.DruidDataSource
    # TDengine的JDBC驱动类名
    driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
    # JDBC URL: jdbc:TAOS://{host}:{port}/{database_name}
    url: jdbc:TAOS-WS://192.168.80.192:6041/demo?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8
    username: root
    password: taosdata

    # Druid连接池配置示例
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 10
      max-wait: 30000
      # 验证连接是否有效的SQL (TDengine特定)
      validation-query: select server_status()
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
  #配置json时间格式
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
# MyBatis配置
mybatis:
  # mapper XML文件的位置
  mapper-locations: classpath:mapper/*.xml
  # 实体类所在的包
  type-aliases-package: com.shenmazong.entity
  configuration:
    # 开启驼峰命名自动转换
    map-underscore-to-camel-case: true

# 日志 (方便调试SQL)
logging:
  level:
    com.shenmazong.mapper: debug

3、编写mapper

(1)mapper接口

package com.shenmazong.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.shenmazong.entity.VehiclePosition;
import org.apache.ibatis.annotations.Mapper;

import java.sql.Timestamp;
import java.util.List;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2026/3/3 11:31
 */

@Mapper
public interface VehiclePositionMapper extends BaseMapper<VehiclePosition> {
    int insertVehiclePosition(VehiclePosition record);
    List<VehiclePosition> selectAllByVin(String vin, String beginTime, String endTime);
    List<VehiclePosition> selectAllByImei(String imei, String beginTime, String endTime);
}

(2)mapper的xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.shenmazong.mapper.VehiclePositionMapper">
    <insert id="insertVehiclePosition" parameterType="com.shenmazong.entity.VehiclePosition">
        INSERT INTO demo.#{vin}
            USING demo.vihicle_location
        TAGS (
            #{vin},
            #{imei}
        ) VALUES (
            NOW,
            #{lon},
            #{lat},
            #{speed},
            #{direction},
            #{altitude}
         );
    </insert>


    <select id="selectAllByVin" resultType="com.shenmazong.entity.VehiclePosition">
        select * from demo.vihicle_location where vin=#{vin} and ts between #{beginTime} and #{endTime} order by ts
    </select>
    <select id="selectAllByImei" resultType="com.shenmazong.entity.VehiclePosition">
        select * from demo.vihicle_location where imei= #{imei} and ts between #{beginTime} and #{endTime} order by ts
    </select>
</mapper>

4、编写service

(1)service接口

package com.shenmazong.service;

import com.shenmazong.entity.VehiclePosition;

import java.sql.Timestamp;
import java.util.List;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2026/3/3 11:25
 */


public interface IVehiclePositionService {

    int insertVehiclePosition(VehiclePosition record);
    List<VehiclePosition> selectAllByVin(String vin, String beginTime, String endTime);
    List<VehiclePosition> selectAllByImei(String imei, String beginTime, String endTime);
}

(2)service实现类

package com.shenmazong.service.impl;

import com.shenmazong.entity.VehiclePosition;
import com.shenmazong.mapper.VehiclePositionMapper;
import com.shenmazong.service.IVehiclePositionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.List;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2026/3/3 11:25
 */

@Service
public class VehiclePositionServiceImpl implements IVehiclePositionService {

    @Autowired
    VehiclePositionMapper vehiclePositionMapper;

    @Override
    public int insertVehiclePosition(VehiclePosition record) {
        return vehiclePositionMapper.insertVehiclePosition(record);
    }

    @Override
    public List<VehiclePosition> selectAllByVin(String vin, String beginTime, String endTime) {

        List<VehiclePosition> vehiclePositions = vehiclePositionMapper.selectAllByVin(vin, beginTime, endTime);

        return vehiclePositions;
    }

    @Override
    public List<VehiclePosition> selectAllByImei(String imei, String beginTime, String endTime) {

        List<VehiclePosition> vehiclePositions = vehiclePositionMapper.selectAllByImei(imei, beginTime, endTime);

        return vehiclePositions;
    }
}

5、编写controller

package com.shenmazong.controller;

import com.shenmazong.entity.VehiclePosition;
import com.shenmazong.service.IVehiclePositionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2026/3/4 10:50
 */

@RestController
@Slf4j
@RequestMapping("/boot")
public class BootController {

    @Autowired
    IVehiclePositionService vehiclePositionService;

    @PostMapping("/add")
    public Object add(@RequestBody VehiclePosition vehiclePosition) {

        long time = new Date().getTime();
        vehiclePosition.setTs(new Timestamp(time));

        int i = vehiclePositionService.insertVehiclePosition(vehiclePosition);
        return i > 0 ? "添加成功" : "添加失败";
    }

    @PostMapping(("/queryByVin"))
    public Object queryByVin(@RequestParam("vin") String vin, @RequestParam("beginTime") String beginTime, @RequestParam("endTime") String endTime) {
        List<VehiclePosition> vehiclePositions = vehiclePositionService.selectAllByVin(vin, beginTime, endTime);

        return vehiclePositions;
    }

    @PostMapping(("/queryByImei"))
    public Object queryByImei(@RequestParam("imei") String imei, @RequestParam("beginTime") String beginTime, @RequestParam("endTime") String endTime) {
        List<VehiclePosition> vehiclePositions = vehiclePositionService.selectAllByImei(imei, beginTime, endTime);

        return vehiclePositions;
    }
}

6、操作效果

(1) 时序数据的添加接口

image.png

(2)根据标签和时间区间查询

image.png

image.png

本文源码

https://gitee.com/ywbingchuan/demo-tdengine.git