IoTDB数据库整合MyBatis实现SpringBoot项目CRUD

遇到的问题:

1.启动项目提示:testWhileIdle is true, validationQuery not set。
2023-04-26 14:05:39.282 ERROR 13864 --- [           main] com.alibaba.druid.pool.DruidDataSource   : testWhileIdle is true, validationQuery not set

原因:没有在配置文件中设置(最先的作者可能没遇到这个,不过报错也能用,可以不管)

druid:
validation-query: 连接测试语句

2.查询一直报错

  2.1错误一:mismatched input ‘<EOF>,’ excepting ‘{FROM,INTO}‘

反复检查:是因为validation-query:的连接测试语句不能写成网络上大家正对mysql设置的select

2.2错误二:java.lang.NullPointerException

原因:返回结果集的时候类型不能是jdbcType,改成JavaType问题解决,但是…

  2.3错误三:Error attempting to get column “Time” from result set

原因:不管你需不需要Time字段(需要也不能在select后面写),查询结果都会返回Time字段的值,这是iotdb特有的主键,但是本人试了LONG,VARCHAR,DATE等能想到的类型,都无济于事,但是可以通过Java.lang.String接收到返回的Long类型时间值,通过resultMapper就是无法实现。

最终解决:通过Map<String,Object>类型将所有数据接收出来,然后再处理(目前我只能这样操作,希望有更好办法的兄弟交流学习)

 3.删除操作,提示成功,但是去库里查询,还在!!!

我这就无语了,没删除就没删除呗,有错你就提呗,你来个成功,然后结果未实现。

原因:删除的时候,比如要删除某个时间段的一组数据,必须在设备id后面添加.*,如:

delete from root.XXX.XXX.demo20130424_4.* where time > XXXXXX

最后总算成功通过mybatis实现了自己想要的功能,不过还是有很多不足,还希望有兴趣的同学一起研究。

接下来上代码:

1.主要依赖:

<dependency>
			<groupId>org.apache.iotdb</groupId>
			<artifactId>iotdb-jdbc</artifactId>
			<version>1.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.3.1</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.2.16</version>
		</dependency>

2.数据库配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: org.apache.iotdb.jdbc.IoTDBDriver
      url: jdbc:iotdb://127.0.0.1:6667/
      username: root
      password: root
      initial-size: 5
      max-active: 20
      min-idle: 1
      max-wait: 60000
      remove-abandoned: true
      remove-abandoned-timeout: 30
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      test-while-idle: false
      test-on-borrow: false
      test-on-return: false

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

WeatherEntity

package com.example.wys.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 添加说明
 *
 * @author kit
 * @version 1.0
 * @date 2023/11/7 17:02
 */
@Data
@Builder
public class WeatherEntity {
    /**
     * 固定对应Time字段
     */
    private long timestamp;

    /**
     * 采样时间时间戳
     */
    private String samplingTime;

    /**
     * 采样时间字符
     */
    private String samplingTimeStr;

    /**
     * 城市编码
     */
    private Integer cityKey;

    /**
     * 城市
     */
    private String city;

    /**
     * 温度 ℃
     */
    private float temperature;

    /**
     * 湿度 %
     */
    private float humidity;

    /**
     * pm10
     */
    private float pm10;

    /**
     * pm10
     */
    private float pm25;

    /**
     * 空气质量
     */
    private String quality;

    /**
     * 天气描述
     */
    private String remark;


}

Rst

package com.example.wys.utils;

import java.io.Serializable;
import java.util.LinkedHashMap;

/**
 * 返回结果
 *
 * @author kit
 * @version 1.0
 * @date 2023/11/9 11:23
 */
public class Rst extends LinkedHashMap<String, Object> implements Serializable {

    private static final long serialVersionUID = 1L;    // 序列化版本号
    public static final int CODE_SUCCESS = 200;
    public static final int CODE_ERROR = 500;

    public Rst() {
    }

    public Rst(int code, String msg, Object data) {
        this.setCode(code);
        this.setMsg(msg);
        this.setData(data);
    }

    /**
     * 获取code
     *
     * @return code
     */
    public Integer getCode() {
        return (Integer) this.get("code");
    }

    /**
     * 获取msg
     *
     * @return msg
     */
    public String getMsg() {
        return (String) this.get("msg");
    }

    /**
     * 获取data
     *
     * @return data
     */
    public Object getData() {
        return (Object) this.get("data");
    }

    /**
     * 给code赋值,连缀风格
     *
     * @param code code
     * @return 对象自身
     */
    public Rst setCode(int code) {
        this.put("code", code);
        return this;
    }

    /**
     * 给msg赋值,连缀风格
     *
     * @param msg msg
     * @return 对象自身
     */
    public Rst setMsg(String msg) {
        this.put("msg", msg);
        return this;
    }

    /**
     * 给data赋值,连缀风格
     *
     * @param data data
     * @return 对象自身
     */
    public Rst setData(Object data) {
        this.put("data", data);
        return this;
    }

    // 构建成功
    public static Rst ok() {
        return new Rst(CODE_SUCCESS, "ok", null);
    }

    public static Rst ok(String msg) {
        return new Rst(CODE_SUCCESS, msg, null);
    }

    public static Rst code(int code) {
        return new Rst(code, null, null);
    }

    public static Rst data(Object data) {
        return new Rst(CODE_SUCCESS, "ok", data);
    }

    // 构建失败
    public static Rst error() {
        return new Rst(CODE_ERROR, "error", null);
    }

    public static Rst error(String msg) {
        return new Rst(CODE_ERROR, msg, null);
    }

    @Override
    public String toString() {
        return "{"
                + "\"code\": " + this.getCode()
                + ", \"msg\": " + transValue(this.getMsg())
                + ", \"data\": " + transValue(this.getData())
                + "}";
    }

    private String transValue(Object value) {
        if (value instanceof String) {
            return "\"" + value + "\"";
        }
        return String.valueOf(value);
    }
}

3.controller,

package com.example.wys.controller;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;

import com.example.wys.entity.WeatherEntity;
import com.example.wys.service.WeatherService;
import com.example.wys.utils.Constant;
import com.example.wys.utils.Rst;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.math.RoundingMode;
import java.util.Date;

/**
 * 添加说明
 *
 * @author kit
 * @version 1.0
 * @date 2023/11/7 16:50
 */
@RestController
@RequestMapping("/weather")
public class WeatherController {

    @Resource
    WeatherService weatherService;

    /**
     * 新增
     *
     * @return
     */
    @GetMapping("add")
    public Rst add() {
        Date date = new Date();
        Long dateTime = date.getTime();
        // 模拟数据
        // 此处涉及到的字符串的,必须前后加',如下面的city字段,quality字段, remark字段
        WeatherEntity testEntity = WeatherEntity.builder()
                .samplingTime(dateTime.toString())
                .samplingTimeStr("'" + DateUtil.format(date, "yyyy-MM-dd HH:mm:ss") + "'")
                .cityKey(101190101)
                .city("'南京'")
                .temperature(NumberUtil.parseFloat(StrUtil.toString(RandomUtil.randomDouble(-18.2, 30.5, 1, RoundingMode.HALF_UP))))
                .humidity(NumberUtil.parseFloat(StrUtil.toString(RandomUtil.randomDouble(1, 100, 1, RoundingMode.HALF_UP))))
                .pm10(NumberUtil.parseFloat(StrUtil.toString(RandomUtil.randomDouble(0, 300, 0, RoundingMode.HALF_UP))))
                .pm25(NumberUtil.parseFloat(StrUtil.toString(RandomUtil.randomDouble(0, 300, 1, RoundingMode.HALF_UP))))
                .quality("'" + Constant.QUALITY_OPTIONS[RandomUtil.randomInt(0, 3)] + "'")
                .remark("'模拟插入'").build();
        return Rst.data(weatherService.addWeather(testEntity));
    }

    /**
     * 分页
     *
     * @param page     第几页
     * @param pageSize 每页多少条
     * @return
     */
    @GetMapping("page")
    public Rst page(Integer page, Integer pageSize) {
        return Rst.data(weatherService.pageWeather(page, pageSize));
    }

    /**
     * 删除数据
     * 对于delete语句,其中子句只能包含时间表达式,目前不支持值筛选
     *
     * @param startTime 需要固定格式为yyyy-MM-dd HH:mm:ss
     * @param endTime   需要固定格式为yyyy-MM-dd HH:mm:ss
     * @return
     */
    @GetMapping("delete")
    public Rst delete(String startTime, String endTime) {
        // 官方对于delete语句,其中子句只能包含时间表达式,目前不支持其他值筛选
        return Rst.data(weatherService.deleteWeather(startTime, endTime));
    }
}


4.service

package com.example.wys.service;



import com.example.wys.entity.WeatherEntity;

import java.util.List;

/**
 * 添加说明
 *
 * @author kit
 * @version 1.0
 * @date 2023/11/7 16:50
 */
public interface WeatherService {

    Integer addWeather(WeatherEntity weatherEntity);

    List<WeatherEntity> pageWeather(Integer page, Integer pageSize);

    Integer deleteWeather(String startTime, String endTime);
}

4.2实现类

package com.example.wys.service.impl;


import com.example.wys.entity.WeatherEntity;
import com.example.wys.mapper.WeatherMapper;
import com.example.wys.service.WeatherService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 添加说明
 *
 * @author kit
 * @version 1.0
 * @date 2023/11/7 16:50
 */
@Service
public class WeatherServiceImpl implements WeatherService {

    @Resource
    WeatherMapper weatherMapper;

    @Override
    public Integer addWeather(WeatherEntity testEntity) {
        return weatherMapper.addWeather(testEntity);
    }

    @Override
    public List<WeatherEntity> pageWeather(Integer page, Integer pageSize) {
        if (page == null || page < 1) {
            page = 1;
        }
        if (pageSize == null || pageSize < 1) {
            pageSize = 10;
        }
        int offset = (page - 1) * pageSize;

        List<WeatherEntity> entityList = weatherMapper.pageWeather(pageSize, offset);

        System.out.println(entityList);
        return entityList;
    }

    @Override
    public Integer deleteWeather(String startTime, String endTime) {
        return weatherMapper.deleteWeather(startTime, endTime);
    }
}


5.mapper

package com.example.wys.mapper;

import com.example.wys.entity.WeatherEntity;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 添加说明
 *
 * @author kit
 * @version 1.0
 * @date 2023/11/7 16:52
 */
@Mapper
public interface WeatherMapper {

    Integer addWeather(WeatherEntity weatherEntity);

    List<WeatherEntity> pageWeather(@Param("pageSize") Integer pageSize, @Param("offset") Integer offset);

    Integer deleteWeather(@Param("startTime") String startTime, @Param("endTime") String endTime);
}

6.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.example.wys.mapper.WeatherMapper">

    <resultMap id="BaseResultMap" type="com.example.wys.entity.WeatherEntity">
        <result column="Time" property="timestamp" />
        <result column="root.ln.weather.samplingTime" property="samplingTime"/>
        <result column="root.ln.weather.samplingTimeStr" property="samplingTimeStr"/>
        <result column="root.ln.weather.cityKey" property="cityKey"/>
        <result column="root.ln.weather.city" property="city"/>
        <result column="root.ln.weather.temperature" property="temperature"/>
        <result column="root.ln.weather.humidity" property="humidity"/>
        <result column="root.ln.weather.pm10" property="pm10"/>
        <result column="root.ln.weather.pm25" property="pm25"/>
        <result column="root.ln.weather.quality" property="quality"/>
        <result column="root.ln.weather.remark" property="remark"/>
    </resultMap>

    <insert id="addWeather" parameterType="com.example.wys.entity.WeatherEntity">
        insert into root.ln.weather(samplingTime, samplingTimeStr, cityKey, city, temperature, humidity, pm10, pm25,
                                    quality, remark)
        values (#{samplingTime}, #{samplingTimeStr}, #{cityKey}, #{city}, #{temperature}, #{humidity}, #{pm10}, #{pm25},
                #{quality}, #{remark})
    </insert>

    <select id="pageWeather" resultMap="BaseResultMap">
        select amplingTime, samplingTimeStr,city, temperature, humidity, pm10, pm25,quality, remark from root.ln.weather
    </select>

    <delete id="deleteWeather" parameterType="java.lang.String">
        delete
        from root.ln.weather.*
        where time <![CDATA[ >= ]]> ${startTime}
          and time <![CDATA[ <= ]]> ${endTime};
    </delete>

</mapper>

postman 测试

127.0.0.1:8083/weather/page

注意:利用postman测试时,传入的string类型的属性值和整合mysql的用法有区别:

  平时传入的json如下:
{

    "timestamp":"2023-05-04T18:28:20.689+08:00",

    "name":"小明",

    "age":20,

    "sex":"男",

    "address":"西安108号"

}
    但是这里json传参需要给String类型加上单引号' ',否则,运行会报sql错误
{

    "timestamp":"2023-05-04T18:28:20.689+08:00",

    "name":"'小明'",

    "age":20,

    "sex":"'男'",

    "address":"'西安108号'"

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AIGC算法2:LLM的复读机问题

1. 什么是LLM的复读机问题 字符级别重复&#xff0c;指大模型针对一个字或一个词重复不断的生成例如在电商翻译场景上&#xff0c;会出现“steckdose steckdose steckdose steckdose steckdose steckdose steckdose steckdose…”&#xff1b;语句级别重复&#xff0c;大模型针…

不容错过的 IntelliJ IDEA 插件 Top 10

虽然 IntelliJ IDEA 功能齐全&#xff0c;您仍然可以增添一些个性化的设置。 JetBrains Marketplace 上有着大量实用插件&#xff0c;可以满足您个人或企业的特定需求。 内容库非常庞大&#xff0c;可能会让人眼花缭乱。 在这篇博文中&#xff0c;我们将分享最近和一直以来最受…

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中&#xff0c;没有实现windows平台视频播放的功能&#xff0c;需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网&#xff1a;网址 下载完成后&#x…

如何配置Postgres的自动扩展功能以应对数据增长

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1&#xff1a;创建表空间示例2&#xff1a;创建分区表示例3&#xff1a;调整配置参数示例4&#xff1a;使用监控和告警工具 总结 在PostgreSQL中&#xff0c;随着数据的…

Spring Boot:Web应用开发之登录与退出的实现

Spring Boot 前言实现登录功能配置拦截器 实现退出功能 前言 登录与退出功能作为 Web 应用中的基础且重要的组成部分&#xff0c;直接关系到用户的安全和隐私保护。通过实现登录与退出功能&#xff0c;可以对用户的身份进行验证和授权&#xff0c;确保只有合法的用户才能访问特…

吃鸡游戏msvcp140.dll丢失的解决方法

msvcp140.dll 是一个与 Microsoft Visual C Redistributable 相关的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;是 Windows 操作系统中众多应用程序正常运行所必需的关键组件之一。以下是对 msvcp140.dll 文件的总体介绍和msvcp140.dll丢失的多个解决方案分享。 *…

Java项目实现Excel导出(Hutool)

官网&#xff1a; Excel生成-ExcelWriter (hutool.cn) 1.使用Hutool工具实现Excel导出&#xff08;.xlsx格式&#xff09; 业务场景&#xff1a; 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 第零步&#xff1a;导入依赖 <!-…

NPL预训练模型-GPT-3

简介及特点 GPT-3是一个由OpenAI开发的自然语言处理&#xff08;NLP&#xff09;预训练模型&#xff0c;它是生成式预训练变换器&#xff08;Generative Pretrained Transformer&#xff09;系列的第三代模型。GPT-3以其巨大的规模和强大的语言处理能力而闻名&#xff0c;具有…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧&#xff0c;大多数互联网公司&#xff0c;服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令&#xff0c;在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

游戏、app抓包

文章目录 协议app抓包游戏抓包 协议 在抓包之前&#xff0c;首先我们要对每个程序使用什么协议有个大致的了解&#xff0c;比如网页这种就是走的http协议。 在一些app中我们通过发送一个请求&#xff0c;然后服务器接受&#xff0c;响应&#xff0c;返回一个数据包&#xff0c…

数字人解决方案——EMAGE面部加肢体动画实现从音频生成数字人表情与动作

概述 AI数字人面部与肢体的驱动算法是数字人研发中至关重要的一环&#xff0c;它能够有效降低VR Chat、虚拟直播和游戏NPC等应用场景中的成本。随着技术的发展&#xff0c;基于语音的面部、肢体和手部动作生成模型已经逐步成熟并得到广泛应用。然而&#xff0c;当尝试将这些独…

反激电源——TL431及光耦反馈电路计算(不涉及环路补偿)

一、TL431及光耦反馈电路 TL431以及光耦电路是反激的副边反馈类型电路中的常见应用。 其反馈工作原理为&#xff1a;当副边的输出电压升高时&#xff0c;TL431的REF点采样电压也会升高&#xff0c;使得TL431的导通量增加&#xff0c;同时光耦内部的发光二极管流过的电流也增大&…

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课&#xff0c;我们学了线性表 单向存储结构&#xff08;也就是单链表&#xff09;&#xff0c;这个是企业常用的技术&#xff0c;且是后面各种的基本&#xff0c;一定要牢牢掌握&#xff0c;如果没有掌握&#xff0c;下面的课程会云里雾里。 一 &#xff0c;循环链表 1…

遥测终端赋能水库泄洪监测预警,筑牢度汛安全防线!

4月10日&#xff0c;水利部召开水库安全度汛视频会议。会议要求着力强化水库防洪“四预”措施&#xff0c;加快构建雨水情监测预报“三道防线”&#xff0c;完善预警信息发布机制&#xff0c;推进数字孪生水利工程建设&#xff0c;为科学调度指挥决策提供支持。强调坚决牢牢守住…

基于3D点云的散货库存体积计算

首先&#xff0c;你需要散货库存的点云。 我将使用 IntelRealSense 捕获的散货库存的 .ply文件。 然而&#xff0c;任何其他产生点云的成像技术都同样有效。 点击这里查看本教程的 Github 上的代码。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - …

二叉树的中序遍历 - LeetCode 热题 36

大家好&#xff01;我是曾续缘&#x1f603; 今天是《LeetCode 热题 100》系列 发车第 36 天 二叉树第 1 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输…

爬楼梯(c)

文章目录 描述分析思路关键代码运行结果 描述 给定一个整数数组 cost &#xff0c;其中 cost[i]是从楼梯第i 个台阶向上爬需要支付的费用&#xff0c;下标从0开始。-旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶 要求&#xff1a;请你计算并返回达到楼梯顶部的…

4.17

while(1) { HAL_ADC_Start(&hadc); adcVal HAL_ADC_GetValue(&hadc); TIM3->CCR3 adcVal-2000; } 1.总结串口的发送和接收功能使用到的函数 HAL_UART_Transmit_DMA(&huart1,"hello world",strlen("hello world")); HAL_UART_Tr…

Linux:如何删除指定时间之前修改的文件?

1、与文件有关的时间 在说明如何删除符合这种要求的文件之前&#xff0c;先来看看与文件有关的有哪些时间 简名全名中文名含义atimeaccess time访问时间文件中的数据最后被访问的时间mtimemodify time修改时间文件中的数据最后被修改的时间ctime change time变化时间文件的元…

JavaSE高阶篇-IO流

第一部分 file类 1&#xff09;File类 计算机常识: 1.名字为".jpg"的一定是图片吗? 不一定,有可能是文件夹 2.什么叫做文本文档: 用记事本打开,人能看懂的文件 比如:.txt .html .css等 .doc -> 不是 …
最新文章