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"));
        }

结果如下

 其中3,5两个方法是因为项目中需要进行添加的,是根据动态传递的参数来识别对应的表名,简单进行了包装处理,如果搭建有更好的方法可以留言交流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IoTDB 是一个轻量级、高效的开源物联网数据存储系统,它专门用于物联网设备产生的海量时序数据的存储和管理。而 Spring Boot 是一个基于 Java 的开源框架,用于简化新兴的微服务架构的应用程序开发。通过结合 IoTDB 和 Spring Boot,可以实现物联网设备数据的实时存储和快速访问。 首先,结合 IoTDB 和 Spring Boot 可以创建一个高效的数据存储和管理系统,可以支持大规模的物联网设备数据接入和存储。通过使用 Spring Boot 提供的快速开发功能,可以更快速地搭建出一个完整的物联网数据处理系统,并且可以通过 Spring Boot 提供的各种配置和扩展功能来满足不同场景下的需求。 其次,IoTDB 和 Spring Boot 的结合还可以实现物联网设备数据的实时查询和分析功能。IoTDB 提供了高效的数据存储和查询能力,而 Spring Boot 可以通过集成各种数据分析和可视化组件,实现对物联网数据的实时监控和分析。 最后,IoTDB 和 Spring Boot 的结合也可以实现数据安全和权限管理功能。通过 Spring Boot 的安全框架,可以实现对物联网设备数据的访问权限控制和数据加密,以保障数据安全。 综上所述,IoTDB 和 Spring Boot 的结合可以实现物联网设备数据的高效存储、实时查询和分析、数据安全和权限管理等功能,为物联网数据处理系统的开发和应用提供了强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值