目 录CONTENT

文章目录

influxdb理论及实战 第三篇:Springboot与InfluxDB

路口、下车
2025-08-26 / 0 评论 / 0 点赞 / 13 阅读 / 0 字
温馨提示:
本文最后更新于2025-08-26,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Springboot与InfluxDB

依赖

    <dependency>
        <groupId>org.influxdb</groupId>
        <artifactId>influxdb-java</artifactId>
        <version>2.19</version>
    </dependency>

yml配置

spring:
  influx:
    url: http://192.168.171.132:8086 #influxdb服务器的地址
    user: test #用户名
    password: 123456 #密码
    database: mydb #指定的数据库

简单例子

 /**
     * 普通插入数据
     */
    @Test
    public void addTest() {
        influxDB.setDatabase(database);
        Point point = Point.measurement("db_test")
                .tag("host", "server01")
                .tag("region", "zh-east")
                .addField("quotaName", "温度")
                .addField("unit", "摄氏度")
                .addField("value", 11.1D)
                .build();
        influxDB.write(point);
    }

    /**
     * 测试查找全部
     */
    @Test
    public void listTest() {
        Query sql = new Query("select * from db_test ", database);
        QueryResult result = influxDB.query(sql);
        result.getResults().forEach(System.out::println);
    }

封装实体类

依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.influxdb</groupId>
            <artifactId>influxdb-java</artifactId>
            <version>2.19</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.17</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

实体类

@Data
@Measurement(name = "quota")
public class QuotaInfo {
    @Column(name = "host",tag = true)
    private String host;

    @Column(name = "region",tag = true)
    private String region;

    @Column(name = "quotaId",tag = true)
    private String quotaId;

    @Column(name = "quotaName",tag = true)
    private String quotaName;

    @Column(name = "unit",tag = true)
    private String unit;

    @Column(name = "value")
    private Double value;
}

分页类

@Data
public class Pager<T> implements Serializable{
    /**
     * 总条数
     */
    private long counts;
    /**
     * 每页条数
     */
    private long pageSize;
    /**
     * 总页数
     */
    private long pages;
    /**
     * 当前页数
     */
    private long page;

    /**
     * mybaits-plus分页
     * 在controller 里面return new Pager<>(quotaService.queryNumberQuota(page,pageSize));
     */
    private List<T> items;

    /**
     * influxDB查询分页
     * @param page
     */
    public Pager(IPage page) {
        this.pageSize = page.getSize();
        this.counts = page.getTotal();
        this.page = page.getCurrent();
        this.pages = page.getPages();
        this.items = page.getRecords();
    }

    public Pager(Long counts, Long pageSize){
        this.counts = counts;
        this.pageSize = pageSize;
        if(pageSize <= 0){
            pages = 0;
        }else {
            pages = counts%pageSize ==0? (counts/pageSize) : (counts/pageSize) +1;
        }
    }
}

封装influxDao

@Slf4j
@Component
public class InfluxDao {

    @Resource
    private InfluxDB influxDB;
    @Value("${spring.influx.database}")
    private String database;

    /**
     * 添加实体类
     * @param object
     */
    public void addObject(Object object){
        influxDB.setDatabase(database);
        Point.Builder pointBuilder= Point.measurementByPOJO(object.getClass());

        Point point = pointBuilder.addFieldsFromPOJO(object)
                //influxDB的默认时间是UTC,比北京时间相差8小时;所以需要在此处手动处理下时间
                .time(LocalDateTime.now().plusHours(8).toInstant(ZoneOffset.of("+8")).toEpochMilli() , TimeUnit.MILLISECONDS)
                .build();
        influxDB.write(point);
        influxDB.close();
    }

    /**
     * 查询数据方法
     * @param sql
     * @param clazz
     * @return List<T>
     */
    public <T> List<T> queryList(String sql, Class<T> clazz){
        QueryResult queryResult = influxDB.query(new Query(sql, database));
        influxDB.close();
        //使用influx自带的解析类得到数据
        InfluxDBResultMapper resultMapper = new InfluxDBResultMapper();
        return resultMapper.toPOJO(queryResult, clazz);
    }
}    

测试类

@SpringBootTest
public class FristTest {
    @Resource
    private InfluxDB influxDB;
    @Value("${spring.influx.database}")
    private String database;
    @Autowired
    private InfluxDao influxDao;


​ @Test
​ public void addObjectTest() {
​ QuotaInfo quotaInfo = new QuotaInfo();
​ quotaInfo.setHost("server01");
​ quotaInfo.setRegion("zh-east");
​ quotaInfo.setQuotaId("00001");
​ quotaInfo.setQuotaName("温度");
​ quotaInfo.setUnit("摄氏度");
​ quotaInfo.setValue(12.30D);
​ influxDao.addObject(quotaInfo);
​ }

    @Test
    public void getListTest() {
        long page = 2;
        long pageSize = 3;
        //"select * from quota  order by desc limit 3 offset 3"
        //分页语句
        String pageSql = " limit " + pageSize + " offset " + (page - 1) * pageSize;
        //查询语句
        String sql = "select * from quota  order by time desc";

        List<QuotaInfo> quotaInfos = influxDao.queryList(sql + pageSql, QuotaInfo.class);
        for (QuotaInfo quotaInfo : quotaInfos) {
            System.out.println(JSONUtil.toJsonStr(quotaInfo));
        }
    }

}

分页

新增带时间戳的measurement

@Data
@Measurement(name = "quota")
public class QuotaAllInfo extends QuotaInfo{
    @Column(name = "time")
    private String time;
}

新增总条数的measurement

@Data
@Measurement(name = "quota")
public class QuotaCount {

    @Column(name = "count")
    private Long count;

}

分页类

@Data
public class Pager<T> implements Serializable{
    /**
     * 总条数
     */
    private long counts;
    /**
     * 每页条数
     */
    private long pageSize;
    /**
     * 总页数
     */
    private long pages;
    /**
     * 当前页数
     */
    private long page;

    /**
     * mybaits-plus分页
     * 在controller 里面return new Pager<>(quotaService.queryNumberQuota(page,pageSize));
     */
    private List<T> items;

    /**
     * influxDB查询分页
     * @param page
     */
    public Pager(IPage page) {
        this.pageSize = page.getSize();
        this.counts = page.getTotal();
        this.page = page.getCurrent();
        this.pages = page.getPages();
        this.items = page.getRecords();
    }

    public Pager(Long counts, Long pageSize){
        this.counts = counts;
        this.pageSize = pageSize;
        if(pageSize <= 0){
            pages = 0;
        }else {
            pages = counts%pageSize ==0? (counts/pageSize) : (counts/pageSize) +1;
        }
    }
}

0

评论区