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.DruidDataSourcedruid:driver-class-name: org.apache.iotdb.jdbc.IoTDBDriverurl: jdbc:iotdb://127.0.0.1:6667/username: rootpassword: rootinitial-size: 5max-active: 20min-idle: 1max-wait: 60000remove-abandoned: trueremove-abandoned-timeout: 30time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000test-while-idle: falsetest-on-borrow: falsetest-on-return: falsemybatis-plus:mapper-locations: classpath:/mapper/*.xmlconfiguration: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);}@Overridepublic 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 {@ResourceWeatherService 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 {@ResourceWeatherMapper weatherMapper;@Overridepublic Integer addWeather(WeatherEntity testEntity) {return weatherMapper.addWeather(testEntity);}@Overridepublic 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;}@Overridepublic 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">deletefrom 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.mzph.cn/bicheng/1296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载诊断的基本框架和概念

车载诊断的基本框架和概念 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不…

springboot+java照相馆预约管理系统ssm

框架&#xff1a;ssm/springboot都有 jdk版本&#xff1a;1.8 及以上 ide工具&#xff1a;IDEA 或者eclipse 数据库: mysql 编程语言: java 前端&#xff1a;layuibootstrapjsp 详细技术&#xff1a;HTMLCSSJSjspspringmvcmybatisMYSQLMAVENtomcat 开发工具 IntelliJ IDEA: 一…

es6编程风格

目录 1、变量let和常量const 2、静态字符串与动态字符串 3、解构赋值&#xff08;数组&#xff0c;对象&#xff09; 4、对象 5、数组 6、函数 7、Map结构 8、class类 9、模块 10、ESLint的使用 1、变量let和常量const ES6 提出了两个新的声明变量的命令&#xff1a;…

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测&#xff1b; 2.输入7个特征&#xf…

C语言扫雷游戏完整版、标记、取消标记、自动拓展

文章目录 前言一、扫雷完整代码总结 前言 用C语言实现扫雷游戏&#xff0c;标记功能&#xff0c;取消标记功能&#xff0c;自动拓展功能&#xff0c;标记只是雷&#xff0c;并且数量等于雷的数量&#xff0c;自动获胜。 一、扫雷完整代码 // test.c 源文件 #define _CRT_SECU…

Linux Supervisor进程控制系统完全教程

一、简介 Supervisor是一个进程控制系统&#xff0c;它使用户能够监视和控制类unix操作系统进程。它通过提供基于配置或事件启动、停止和重新启动进程的机制&#xff0c;帮助管理应该在系统中连续运行的进程。对于需要控制和监视Linux或其他类unix操作系统上多个进程的状态的开…

如何设置unbuntu时间及同步时间

文章目录 时区时间同步与服务 时间同步的重要性Ubuntu系统中设置时间和同步时间方法一&#xff1a;通过图形界面设置查看当前时间设置时间和时区设置时区&#xff08;假设设置为UTC&#xff09;&#xff1a;设置本地时间&#xff08;例如&#xff0c;设置时间为2024年4月21日 1…

String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变

文章目录 0、前言一、String、StringBuilder、StringBuffer区别二、String简介2.1 String类特点2.2 创建String对象、String实例化2.2.1 实例化方法2.2.2 String str1"abc"和String str2new String("abc")区别 2.3 String的比较2.4 String类的“加法”2.5 …

idea的maven打包只有几kb

在pom.xml文件中添加以下&#xff1a; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version><configuration><!-- 指定该Main Class…

【youcans电力电子仿真 03】Boost变换电路

【youcans电力电子仿真 03】Boost变换电路 Boost变换电路是Buck变换电路的对偶拓扑&#xff0c;也属于非隔离型直流变换器&#xff0c;其输出电压大于输入电压。Boost变换电路具有效率高、输出稳定、控制简单和成本低的优点&#xff0c;广泛应用于电子设备、光伏发电、无线通信…

了解MySQL InnoDB多版本MVCC(Multi-Version Concurrency Control)

了解MySQL InnoDB多版本MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC&#xff0c;这使得它可以在提供高…

伪分布Hadoop下安装Hive

一、下载并安装Mysql &#xff08;1&#xff09;下载mysql安装包&#xff08;mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar&#xff09; 下载官网&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ &…

Linux-用户管理类命令实训

掌握Linux各类命令的使用方法。熟悉Linux操作环境。掌握常用文件目录类命令掌握常用系统信息类命令了解其他常用命令 一、文件与目录管理 &#xff08;1&#xff09;查看根目录下有哪些内容 &#xff08;2&#xff09;进入/tmp目录&#xff0c;以自己的学号建一个目录&#x…

HTML部分常用标签补充

table&#xff08;布局方面不建议使用&#xff0c;而是使用CSS来完成&#xff09;: 标签解释&#xff1a; ~table标签顾名思义&#xff0c;是表格的意思 ~table其中可以使用boder属性来显示表格的线&#xff0c;最好使用CSS来配合HTML的使用 ~table内的内容可以使用colspan来定…

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 举个例子&#xff1a;组件好比小霸王游戏机&#xff0c;插槽就是游戏机的插口&#xff0c;看用户插什么卡&#xff0c;就…

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

vue中 export default 与 export 写法的区别

文章目录 1、export default 用法1.1、定义函数1.2、使用 2、export 用法2.1、定义函数2.1、使用1&#xff09;使用方法1&#xff1a;一次性导入所有函数2&#xff09;使用方法2&#xff1a;按需导入函数&#xff0c;使用 **大括号** 3、总结 1、export default 用法 1.1、定义…

24五一杯资料汇总!!!!

以下内容为23年五一杯内容&#xff0c;24年也将会按时更新资料&#xff01;&#xff01;&#xff01; 问题1&#xff1a;给定建筑物数据&#xff0c;假设该建筑物内温度需要一直保持在18-26度&#xff0c;在温度不适宜的时候要通过电来调节温度&#xff0c;消耗一度电相当于0.…

gazebo中vins-fusion在仿真小车上的部署

软件要求&#xff1a;Ubuntu 20.04 ros的noetic版本&#xff0c;我是在虚拟机vitrualbox上运行的 这几天在学ROS&#xff0c;跟着赵虚左老师过了一遍之后&#xff0c;感觉还是有很多不懂的地方&#xff0c;xtdrone上仿真跟着文档走了一遍&#xff0c;好像没学到什么东西&#…

java解决常见递归问题

最基本的&#xff0c;斐波那契数列&#xff0c;阶乘&#xff08;0&#xff0c;1的阶乘均为1&#xff09; 返回字母“x”第一次出现的位置 使用递归编写一个函数&#xff0c;读取一个字符串&#xff0c;返回字母“x”第一次出现的位置。例如&#xff0c;字符串 "abcdefgh…