Influxdb整合springboot

Influxdb整合springboot

使用方法

使用influxdb-spring-boot-starter 完事

POM 文件加入 依赖


<dependency>
    <groupId>plus.ojbk</groupId>
    <artifactId>influxdb-spring-boot-starter</artifactId>
    <version>1.0.2</version>
</dependency>

yml 配置

#---------
# Influxdb
#---------
influxdb:
    url: http://127.0.0.1:8086
    username: admin
    password: admin
    database: test


目录结构

image

Device.java

package io.springboot.influxdb.entity;

import lombok.Data;
import org.influxdb.annotation.Column;
import org.influxdb.annotation.Measurement;
import plus.ojbk.influxdb.annotation.Count;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * @author wxm
 * @version 1.0
 * @since 2021/6/17 18:26
 *
 * 瞎编的设备模型
 *
 */
@Data
@Measurement(name = "device")
public class Device {
    /**
     * 设备编号
     */
    @Column(name="device_no", tag = true)  //tag 可以理解为influxdb的索引
    private String deviceNo;
    /**
     * 数据值
     */
    @Count("value")
    @Column(name="value")
    private BigDecimal value;
    /**
     * 电压
     */
    @Column(name="voltage")
    private Float voltage;
    /**
     * 状态
     */
    @Column(name="state")
    private Boolean state;
    /**
     * 上报时间
     */
    @Column(name="time")
    private LocalDateTime time;

}



Test类

package io.springboot.influxdb;

import com.alibaba.fastjson.JSON;
import io.springboot.influxdb.entity.Device;
import org.influxdb.dto.QueryResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import plus.ojbk.influxdb.core.Delete;
import plus.ojbk.influxdb.core.InfluxdbTemplate;
import plus.ojbk.influxdb.core.Op;
import plus.ojbk.influxdb.core.Order;
import plus.ojbk.influxdb.core.Query;
import plus.ojbk.influxdb.core.model.DeleteModel;
import plus.ojbk.influxdb.core.model.QueryModel;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

@SpringBootTest
class InfluxdbDemoApplicationTests {

    @Autowired
    private InfluxdbTemplate influxdbTemplate;

    private String measurement = "device";
    @Test
    void getCount() {
        QueryModel countModel = new QueryModel();
        ///countModel.setMeasurement(measurement);
        countModel.setMeasurement(InfluxdbUtils.getMeasurement(Device.class));
        countModel.setStart(LocalDateTime.now().plusHours(-2L));
        countModel.setEnd(LocalDateTime.now());
        //countModel.setSelect(Query.count("voltage"));  //只能count field字段
        countModel.setSelect(Query.count(InfluxdbUtils.getCountField(Device.class)));
        countModel.setWhere(Op.where(countModel));
        //获得总条数
        long count = influxdbTemplate.count(Query.build(countModel));
        System.err.println(count);
    }

    @Test
    void getData() {
        QueryModel model = new QueryModel();
        model.setCurrent(1L);
        model.setSize(10L);
        //model.setMeasurement(measurement);
        model.setMeasurement(InfluxdbUtils.getMeasurement(Device.class));
        model.setStart(LocalDateTime.now().plusHours(-2L));
        model.setEnd(LocalDateTime.now());
        model.setUseTimeZone(true);  //时区
        model.setOrder(Order.DESC);  //排序
        //where 条件中额外参数可放入model.setMap();
        model.setWhere(Op.where(model));
        //分页数据
        List<Device> deviceList = influxdbTemplate.selectList(Query.build(model), Device.class);
        System.err.println(JSON.toJSONString(deviceList));
    }
    @Test
    void insert() {
        List<Device> deviceList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Device device = new Device();
            device.setDeviceNo("device-" + i);
            device.setValue(new BigDecimal(12.548));
            device.setState(true);
            device.setVoltage(3.5F);
            //  device.setTime(LocalDateTime.now());
            deviceList.add(device);
        }
        influxdbTemplate.insert(deviceList);
    }
    @Test
    void delete() {
        Map<String, Object> map = new TreeMap<>();
        map.put("device_no", "device-1");
        DeleteModel model = new DeleteModel();
        model.setMap(map);
        //model.setStart(LocalDateTime.now().plusHours(-10L));
        //model.setEnd(LocalDateTime.now());
        model.setMeasurement(measurement);
        model.setWhere(Op.where(model));
        influxdbTemplate.delete(Delete.build(model));
    }


    void other(){
        influxdbTemplate.execute("自己写sql");
    }
}

运行结果

先插入数据 执行 insert();

获取条数 getCount();

获取数据 getData();

删除数据delete();



可以看到 device-1 被删除了 。
当然不推荐使用删除 毕竟这玩意一般用来存历史数据 仅插入和查询 :sweat_smile:

demo代码

2 Likes

注意一点 如果是 windows环境装的 influxdb 不支持使用tz('Asia/Shanghai')
请将model.setUseTimeZone(false);

强行使用请装go环境

爱死明哥了

现在可以拉1.0.1 版本了 :joy:

您好,请问一下,如果我不想通过配置文件自动配置,手动进行配置InfluxdbTemplate,该如何实现哈
我把配置文件修改为:
influxdb:
enable: false
url: XXX
username: XXX
password: XXX
database: XXX
就报错了,王大师,能否让我们可以取消自动配置,进行手动配置呢 :grinning:

1 Like

你的版本是,什么具体的错误是什么
你配置看起来是对的。加上 false 就不会自动配置了

influxdb:
  enable: false
  url: http://127.0.0.1:8086
  username: admin
  password: admin
  database: test