MyBatis将查询的两个字段分别作为Map的key和value

问题背景

首先查出 危险源id危险源报警的个数 alarm

遍历危险源,将报警数填充进去

所以,我需要根据id得到alarm

最方便的就是Map

经过sql查询

        -- 危险源下的对象的报警个数
        select id, ifnull(alarm_count,0) alarm from spang_monitor_danger_source
        left join(
            -- 危险源被绑定的对象的报警个数
            select hazard_source,count(alarm_count) alarm_count from spang_monitor_target
            left join (
                -- 统计对象绑定的点位报警个数
                select target_num,count(point_num) alarm_count from (
                    -- 被对象关联的报警点位
                    select t.target_num, p.point_num from spang_monitor_target_point t
                    left join (
                        -- 报警点位
                        select point_num from spang_monitor_point where is_deleted = 0 and alarm_status = 1
                    )p on p.point_num=t.point_num
                )t1 GROUP BY target_num
            )t2 on target_number = t2.target_num
            where is_deleted = 0
            GROUP BY hazard_source
        )t3 on t3.hazard_source = id
        where is_deleted = 0

数据库查询出来的数据结果如下:

在这里插入图片描述

解决方案

id作为keyalarm作为value

在这里插入图片描述

1. MapResultHandler

package com.spang.monitor.common.handler;

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;

import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("all")
public class MapResultHandler<K,V> implements ResultHandler<Map<K,V>> {

    private final Map<K,V> mappedResults = new HashMap<>();

    @Override
    public void handleResult(ResultContext context) {
        Map map = (Map) context.getResultObject();
        mappedResults.put((K)map.get("key"), (V)map.get("value"));
    }

    public Map<K,V> getMappedResults() {
        return mappedResults;
    }
}

2. Dao

void selectAlarmCount(MapResultHandler<Long, Double> resultHandler);

3. xml

    <resultMap id="mapResult" type="java.util.HashMap">
        <result property="key" column="id"/>
        <result property="value" column="alarm"/>
    </resultMap>
    <select id="selectAlarmCount" resultMap="mapResult">
        -- 危险源下的对象的报警个数
        select id, ifnull(alarm_count,0) alarm from spang_monitor_danger_source
        left join(
            -- 危险源被绑定的对象的报警个数
            select hazard_source,count(alarm_count) alarm_count from spang_monitor_target
            left join (
                -- 统计对象绑定的点位报警个数
                select target_num,count(point_num) alarm_count from (
                    -- 被对象关联的报警点位
                    select t.target_num, p.point_num from spang_monitor_target_point t
                    left join (
                        -- 报警点位
                        select point_num from spang_monitor_point where is_deleted = 0 and alarm_status = 1
                    )p on p.point_num=t.point_num
                )t1 GROUP BY target_num
            )t2 on target_number = t2.target_num
            where is_deleted = 0
            GROUP BY hazard_source
        )t3 on t3.hazard_source = id
        where is_deleted = 0
    </select>

4. 使用方式

        //危险源对应的对象的报警个数
        MapResultHandler<Long, Double> resultHandler = new MapResultHandler<>();
        dangerSourceMapper.selectAlarmCount(resultHandler);
        Map<Long, Double> alarmCountMap = resultHandler.getMappedResults();

注意:

1、dao中定义的接口返回值类型必须是void,如上面void selectAlarmCount(MapResultHandler<Long, Double> resultHandler);

2、xml中定义的resultMap返回值类型是HashMap,其里面定义的两个result中的key要与MapResultHandler.java中代码mappedResults.put(m.get(“key”), m.get(“value”))保持一致;其value属性必须和Mybatis.xml中sql的返回值名称一致

3、Map resultMap = handler.getMappedResults();中的resultMap就是我们一开始讲到的需要的数据类型

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip 基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值