IoTDB在springboot2中的(二) 查询

这篇具有很好参考价值的文章主要介绍了IoTDB在springboot2中的(二) 查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一章我们处理的基本的构建接入,以及插入的处理,那么接下来我们进行查询的操作处理。

我们继续在IoTDBSessionConfig工具类中加入查询的方法处理

/**
     * description: 根据SQL查询最新一条数据
     * author:zgy
     * @param sql sql查询语句,count查询语句,一般为count(id) as ct 必须加as
     * @return
     */
    public Map<String,Object> queryMapData(String sql)  {
        Map<String,Object> rtMap = new HashMap<>();
        try {
            SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);
            List<String> columnNames = sessionDataSetWrapper.getColumnNames();
            List<Map<String,Object>> rtList =  packagingData(sessionDataSetWrapper,columnNames);
            if(!rtList.isEmpty()){
                rtMap = rtList.get(0);
            }
        }catch (Exception e) {
            logger.error("查询Map返回数据集数据异常,异常SQL>{};:{}",sql,e.toString());
        }
        return rtMap;
    }

    /**
     * description: 根据SQL查询最新一条数据
     * author:zgy
     * @param sql sql查询语句,查询条件最前面加 last
     * @param clazz 类
     * @return
     */
    public IoTDBRecordable queryLastData(String sql, Class<? extends IoTDBRecordable> clazz)  {
        Map<String,Object> rtMap = new HashMap<>();
        try {
            IoTTableName iotTableName = clazz.getAnnotation(IoTTableName.class);
            String tableName = iotTableName.value();
            SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);
            List<String> columnNames = sessionDataSetWrapper.getColumnNames().subList(1,sessionDataSetWrapper.getColumnNames().size());
            List<Map<String,Object>> rtList =  packagingData(sessionDataSetWrapper,columnNames);
            for(Map<String,Object> map : rtList){
                if(map.get(TIMESERIES)!=null){
                    rtMap.put(map.get(TIMESERIES).toString().replace(tableName+".",""),map.get("Value"));
                }
            }
        }catch (Exception e) {
            logger.error(MSG_SQL,clazz,sql,e.toString());
        }
        return JSON.parseObject(JSON.toJSONString(rtMap),clazz);
    }

    /**
     * description: 根据SQL查询最新一条数据
     * author:zgy
     * @param sql sql查询语句,查询条件最前面加 last
     * @param tableName IoTDB表名
     * @return
     */
    public Map<String,Object> queryLastData(String sql,String tableName)  {
        Map<String,Object> rtMap = new HashMap<>();
        try {
            SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);
            List<String> columnNames = sessionDataSetWrapper.getColumnNames().subList(1,sessionDataSetWrapper.getColumnNames().size());
            List<Map<String,Object>> rtList =  packagingData(sessionDataSetWrapper,columnNames);
            for(Map<String,Object> map : rtList){
                if(map.get(TIMESERIES)!=null){
                    rtMap.put(map.get(TIMESERIES).toString().replace(tableName+".",""),map.get("Value"));
                }
            }
        }catch (Exception e) {
            logger.error(MSG_SQL,tableName,sql,e.toString());
        }
        return rtMap;
    }

    /**
     * description: 根据SQL查询
     * author: zgy
     * @param sql sql查询语句
     * @param clazz 类.
     * @return
     */
    public List<?> queryListData(String sql, Class<? extends IoTDBRecordable> clazz)  {
        List<IoTDBRecordable> rtList = new ArrayList<>();
        try {
            //获取实体类注释表名
            IoTTableName iotTableName = clazz.getAnnotation(IoTTableName.class);
            String tableName = iotTableName.value();
            //获取查询条件是否是*全查
            String selectParam = sql.substring(6, sql.indexOf("from")).trim();
            SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);
            List<String> columnNames = sessionDataSetWrapper.getColumnNames();
            //判断如果第一个列值为Time时间戳去掉
            if(Objects.equals(columnNames.get(0),"Time")){
                columnNames.remove(0);
            }
            List<Map<String,Object>> list =  packagingData(sessionDataSetWrapper,columnNames);
            for(Map<String,Object> map : list){
                //如果是*全查需要进行key值得转换
                if(Objects.equals("*",selectParam)){
                    Map<String,Object> rtMap = new HashMap<>();
                    //循环进行key值得转换
                    for(Map.Entry<String,Object> it : map.entrySet()){
                        rtMap.put(it.getKey().replace(tableName+".",""),it.getValue());
                    }
                    //map转换实体
                    rtList.add(JSON.parseObject(JSON.toJSONString(rtMap),clazz));
                }else{//如果不为*则依照别名来查
                    //map转换实体
                    rtList.add(JSON.parseObject(JSON.toJSONString(map),clazz));
                }
            }
        }catch (Exception e) {
            logger.error("[{}]查询列表数据异常,异常SQL>{};:{}",clazz,sql,e.toString());
        }
        return rtList;
    }

    /**
     * 根据SQL查询 List集合
     * @param sql 查询条件
     * @param tableName 表名
     * @return
     */
    public List<Map<String,Object>> query(String sql,String tableName) {
        List<Map<String,Object>> rtList = new ArrayList<>();
        try {
            SessionDataSet sessionDataSetWrapper = session.executeQueryStatement(sql,timeoutInMs);
            //获取查询条件是否是*全查
            String selectParam = sql.substring(6, sql.indexOf("from")).trim();
            List<String> columnNames = sessionDataSetWrapper.getColumnNames();
            //判断如果第一个列值为Time时间戳去掉
            if(Objects.equals(columnNames.get(0),"Time")){
                columnNames.remove(0);
            }
            List<Map<String,Object>> itsList =  packagingData(sessionDataSetWrapper,columnNames);
            for(Map<String,Object> map : itsList){
                //如果是*全查需要进行key值得转换
                if(Objects.equals("*",selectParam)){
                    Map<String,Object> rtMap = new HashMap<>();
                    //循环进行key值得转换
                    for(Map.Entry<String,Object> it : map.entrySet()){
                        rtMap.put(it.getKey().replace(tableName+".",""),it.getValue());
                    }
                    //map转换实体
                    rtList.add(rtMap);
                }else{//如果不为*则依照别名来查
                    //map转换实体
                    rtList.add(map);
                }
            }
        } catch (Exception e) {
            logger.error(MSG_SQL,tableName,sql,e.toString());
            return rtList;
        }
        return rtList;
    }

    /**
     * 封装处理数据
     * @param sessionDataSet
     * @param titleList
     * @throws StatementExecutionException
     * @throws IoTDBConnectionException
     */
    private List<Map<String,Object>> packagingData(SessionDataSet sessionDataSet, List<String> titleList)
            throws StatementExecutionException, IoTDBConnectionException {
        int fetchSize = sessionDataSet.getFetchSize();
        List<Map<String,Object>> rtList = new ArrayList<>();
        if (fetchSize > 0) {
            while (sessionDataSet.hasNext()) {
                Map<String,Object> rtMap = new HashMap<>();
                RowRecord next = sessionDataSet.next();
                List<Field> fields = next.getFields();
                String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp());
                rtMap.put("time",timeString);
                for (int i = 0; i < fields.size(); i++) {
                    Field field = fields.get(i);
                    // 这里的需要按照类型获取
                    if(field.getDataType()==null||field.getObjectValue(field.getDataType())==null){
                        rtMap.put(titleList.get(i), null);
                    }else{
                        rtMap.put(titleList.get(i), field.getObjectValue(field.getDataType()).toString());
                    }
                }
                rtList.add(rtMap);
            }
        }
        return rtList;
    }

1、queryMapData 方法的话就是查询结果为Map集合的处理,比如聚合函数的查询等等。

2、queryLastData 方法为根据SQL查询表中最新的一条记录数,返回实体类。

3、queryLastData 方法为根据sql和表名查询一个Map集合

4、queryListData 根据sql查询一个list实体集合

5、query 根据sql查询一个List<Map>集合

下面为测试代码

System.out.println("1、queryMapData查询......");
        Map<String,Object> mapOne=  iotDBSessionConfig.queryMapData("select count(id) as ct from root.syslog");
        System.out.println("结果:"+ArrayUtils.toString(mapOne));
        System.out.println("2、queryLastData 根据sql和实体类查询......");
        IoTDBSysLog ioTDBSysLog = (IoTDBSysLog) iotDBSessionConfig.queryLastData("select last * from root.syslog",IoTDBSysLog.class);
        System.out.println("结果:"+ioTDBSysLog.getLogIp()+"-->"+ioTDBSysLog.getCreateTime());
        System.out.println("3、queryLastData 根据sql和表名查询......");
        Map<String,Object> mapThree =  iotDBSessionConfig.queryLastData("select last * from root.syslog", IoTDBTableParam.SYSLOG_IOT_TABLE);
        System.out.println("结果:"+ArrayUtils.toString(mapThree));
        System.out.println("4、queryListData 根据sql查询一个list实体集合......");
        List<IoTDBSysLog> list = (List<IoTDBSysLog>) iotDBSessionConfig.queryListData("select  * from root.syslog",IoTDBSysLog.class);
        System.out.println("结果条数:"+list.size());
        for (IoTDBSysLog sysLog : list){
            System.out.println(sysLog.getLogIp()+"-->"+sysLog.getCreateTime());
        }
        System.out.println("5、query 根据sql查询一个List<Map>集合......");
        List<Map<String,Object>> listTwo = iotDBSessionConfig.query("select  * from root.syslog", IoTDBTableParam.SYSLOG_IOT_TABLE);
        System.out.println("结果条数:"+list.size());
        for (Map<String,Object> map : listTwo){
            System.out.println(map.get("logIp")+"-->"+map.get("createTime"));
        }

结果如下

IoTDB在springboot2中的(二) 查询,IoTDB,springboot,iotdb

 其中3,5两个方法是因为项目中需要进行添加的,是根据动态传递的参数来识别对应的表名,简单进行了包装处理,如果搭建有更好的方法可以留言交流。文章来源地址https://www.toymoban.com/news/detail-645894.html

到了这里,关于IoTDB在springboot2中的(二) 查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iotdb集群模式部署

    重要声明:部署的版本要和脚本对应上,这里可以点击 查看最新部署脚本:https://iotdb.apache.org/zh/UserGuide/latest/Deployment-and-Maintenance/Docker-Install.html 来获取最新的脚本; 我使用的是1.3.0版本的iotdb 下面是我基于三个节点的部署步骤: 假如有三台物理机,里面安装了centos系统,它

    2024年03月28日
    浏览(31)
  • IoTDB 集群环境搭建

    什么是IoTDB IoTDB(Internet of Things Database)是一个专门设计用于存储和管理大规模物联网(IoT)数据的开源时序数据库系统。它专注于高效地存储、查询和分析时间序列数据,特别适用于物联网应用中的大量实时数据。 IoTDB的主要特点包括: 时序数据存储 : IoTDB专为存储时间序

    2024年02月11日
    浏览(32)
  • IoTDB 小白“踩坑”心得:入门安装部署篇

    小伙伴介绍! 大家好,我是 zai,一个基本功不那么扎实、没有太多经验的大学生。我刚刚加入社区,接触 IoTDB,目前仍处于学习阶段,所以我会跟大家分享我学习过程中踩过的一些雷,以及对应的解决办法,希望大家多多指教! 作为 IoTDB 小白,认识软件的第一步必然是跑一

    2024年02月13日
    浏览(35)
  • 三种常用时序数据库对比调研-InfluxDB、Prometheus、IotDB

    时序数据治理是数据治理领域核心、打通IT与OT域数据链路,是工业物联网基石、大数据价值创造的关键、企业管理提升的发动机、是数字化转型的重要支撑。 工业企业在生产经营过程中,会运用物联网技术,采集大量的数据并进行实时处理,这些数据都是时序的,而且具有

    2024年02月22日
    浏览(43)
  • 从一到无穷大 #10 讨论 Apache IoTDB 大综述中看到的优劣势

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 在时序数据库这样一个小众的圈子里面每年有意思的东西并不多,每一篇顶会paper都值得细细品读。其次靠自己想很

    2024年02月13日
    浏览(58)
  • Apache IoTDB v1.3.0 发布|增加客户端服务器 SSL 通讯加密、写入负数时间戳等功能...

    Release Announcement   Version 1.3.0   Apache IoTDB v1.3.0 已经发布,主要新增 SSL 通讯加密、数据同步监控项统计等新特性,优化了原有权限模块的语法和逻辑、metrics 算法库性能、Python 客户端写入性能以及在部分查询场景下的查询效率,修复部分产品 bug 和性能问题。 欢迎在我们的网

    2024年01月17日
    浏览(58)
  • Don’t Hold My Data Hostage – A Case For Client Protocol Redesign 论文阅读 & Apache IoTDB TsBlock 对比

    Don’t Hold My Data Hostage – A Case For Client Protocol Redesign 是 VLDB 2017 的一篇论文,主要着眼于数据库客户端协议的设计。本文主要是个人对论文的一些理解,以及结合自己较熟悉的开源时序数据库 Apache IoTDB 进行了一些对比分析。如果有谬误之处,欢迎留言指正~ 将大量级数据从

    2024年02月12日
    浏览(51)
  • 【SpringBoot2】SpringBoot开发实用篇

    ​ 什么是热部署?简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署。 ​ 热部署的功能是如何实现的呢?这就要分两种情况来说了,非springboot工程和springboot工程的热部署实现方式完全

    2023年04月25日
    浏览(40)
  • 1、Springboot2简介

    在学习 SpringBoot 之前,建议先具备 SpringMVC(控制层)、Spring(业务层)和 Mybatis(持久层)的相关知识 Spring 框架虽然很出色,但是有一个明显的缺点:配置文件过于繁琐和复杂; 在单体项目中,因为配置文件只需要编写一遍即可,所以该缺点只是一个小问题; 在微服务项目

    2024年02月05日
    浏览(36)
  • SpringBoot2-核心技术(一)

    1. properties 同以前的用法 2. yaml YAML : “YAML Ain‘t Markup Language ”(yaml 不是一种递归标记语言) 的递归缩写, 在开发这种语言时,YAML 的意思是:Yet Another Markup Language (仍是一种标记语言) 非常适合用来做以数据为中心的配置文件 1. 基本语法 key: value ; value与: 之间存在空格

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包