写了史上遇到最复杂的sql 在Mybatis中实现不同条件对应sql的变化

    由于使用mysql进行开发,然后进行分页的时候,可以使用select found_rows();来获取上一条sql执行的查询总数,但是这个需要和SQL_CALC_FOUND_ROWS count( * ) AS howmany,  这个一起使用才可以,并且这两个sql不能在Mybatis中的不同的两个  <select></>标签中配合使用,只能在一个select中,所以,有了下面的 <select id="getResult" resultMap="BaseResultMap1,BaseResultMap2">  </>这种形式。然后在 dao中通过List<List<?>> 来得到值,并且通过 list.get(0)获取对象列表,通过lsit.get(1).get(0) 获取总行数。

 

 

<?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="AlarmsGroupView">

    <resultMap id="BaseResultMap" type="com.qzt.model.entity.AlarmsGroupView">
        <id column="group_id" property="groupId" jdbcType="VARCHAR" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="howmany" property="howMany" jdbcType="INTEGER" />
        <result column="max_risk" property="maxRisk" jdbcType="INTEGER" />
    </resultMap>

    <resultMap id="count" type="java.lang.Integer">
        <id column="count" />
    </resultMap>

    <resultMap id="SensorMap" type="com.qzt.model.entity.Sensor">
        <id column="id" property="id" jdbcType="VARCHAR" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="ip" property="ip" jdbcType="VARCHAR" />
    </resultMap>

    <resultMap id="LableMap" type="com.qzt.model.entity.Lable">
        <id column="id" property="id" jdbcType="VARCHAR" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="type" property="type" jdbcType="VARCHAR" />
        <result column="ctx" property="ctx" jdbcType="VARCHAR" />
    </resultMap>

    <resultMap id="IntentMap" type="com.qzt.model.entity.Intent">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        <if test="alarmsNameDate != null and alarmsNameDate != ''">
            ,date (alarm_event.timestamp ) as day
        </if>
        <if test="alarmsNameSdstDate != null and alarmsNameSdstDate != ''">
            ,inet6_ntoa( alarm_event.src_ip ) AS src_ip
            ,inet6_ntoa( alarm_event.dst_ip ) AS dst_ip
            ,date (alarm_event.timestamp ) as day
        </if>
    </sql>

    <sql id="Base_Column_List_select">
        <if test="alarmsNameDate != null and alarmsNameDate != ''">
            ,convert_tz(a.timestamp,'+00:00','+8:00' ) as timestamp
        </if>
        <if test="alarmsNameSdstDate != null and alarmsNameSdstDate != ''">
        ,a.src_ip
        ,a.dst_ip
        ,convert_tz(a.timestamp,'+00:00','+8:00' ) as timestamp
        </if>
    </sql>

    <sql id="Base_Column_List_table">
        <if test="assetGroup != null and assetGroup != ''">
            left join alarm_hosts ah on  a.backlog_id = ah.id_alarm
        </if>
        <if test="sensor != null and sensor != ''">
            ,event e , backlog_event be
        </if>
        <if test="label != null and label != ''">
            ,component_tags tg
        </if>
        <if test="show1 != null and show1 != ''">
            ,alarm_groups g
        </if>
    </sql>


    <sql id="Base_Column_List_similar_table">
        <if test="assetGroup != null and assetGroup != ''">
            left join alarm_hosts ah on  a.backlog_id = ah.id_alarm
        </if>
        <if test="show1 != null and show1 != ''">
            ,alarm_groups g
        </if>
    </sql>


    <sql id="Base_Column_List_group">
        <if test="alarmsNameGroup != null and alarmsNameGroup != ''">
            name
        </if>
        <if test="alarmsNameDate != null and alarmsNameDate != ''">
            name,day
        </if>
        <if test="alarmsNameSdstDate != null and alarmsNameSdstDate != ''">
            name, src_ip, dst_ip, day
        </if>
    </sql>
    <sql id="Base_Column_List_order">
        <if test="alarmsNameGroup != null and alarmsNameGroup != ''">
            name
        </if>
        <if test="alarmsNameDate != null and alarmsNameDate != ''">
            alarm_event.timestamp
        </if>
        <if test="alarmsNameSdstDate != null and alarmsNameSdstDate != ''">
            alarm_event.timestamp 
        </if>
        <if test="sensor != null and sensor != ''">
            AND e.sensor_id=unhex(#{sensor}) AND be.event_id=e.id AND be.backlog_id=a.backlog_id
        </if>
    </sql>
    <sql id="page_sql">
        <if test="pageSize!=null and offsetNum!=null">
            limit #{pageSize} offset #{offsetNum}
        </if>
    </sql>

    <select id="getAlarmsGrupView" resultMap="BaseResultMap,count" parameterType="java.util.Map">

        
      SELECT SQL_CALC_FOUND_ROWS count( * ) AS howmany,
        sha1( alarm_event.name ) AS group_id,
        alarm_event.name AS name,
        max(alarm_event.risk) as max_risk
        <include refid="Base_Column_List"/>

        FROM (
        (SELECT DISTINCT a.backlog_id, <![CDATA[ IF(a.plugin_id<>1505,IFNULL(p.name, ''),IFNULL(CONCAT(ki.name,' &mdash; ',ca.name,' &mdash; ',ta.subcategory), IFNULL(p.name, ''))) AS name, ]]>  a.risk
        <include refid="Base_Column_List_select"/>
         FROM alarm a
        LEFT JOIN plugin_sid p ON a.plugin_id = p.plugin_id AND a.plugin_sid = p.sid
        LEFT JOIN ( alarm_taxonomy ta LEFT JOIN alarm_kingdoms ki ON ta.kingdom=ki.id LEFT JOIN alarm_categories ca ON ta.category=ca.id ) ON a.plugin_sid=ta.sid AND a.corr_engine_ctx=ta.engine_id
        <include refid="Base_Column_List_table"/>
          ,backlog b
        WHERE 1=1
         AND a.status='open'
         AND a.backlog_id=b.id AND <![CDATA[b.timestamp<>'1970-01-01 00:00:00']]>
         <if test="alarmName != null and alarmName != ''">
             AND (p.name LIKE '%${alarmName}%' or ki.name LIKE '%${alarmName}%' or ca.name LIKE '%${alarmName}%' or ta.subcategory LIKE '%${alarmName}%')
         </if>

        <if test="sourceIpaddr != null and sourceIpaddr != ''">
           and  inet6_aton(#{sourceIpaddr}) = a.src_ip
        </if>
        <if test="destIPaddr != null and destIPaddr != ''">
            and  inet6_aton(#{destIPaddr}) = a.dst_ip
        </if>
        <if test="assetGroup != null and assetGroup != ''">

            AND ah.id_host in (SELECT host_id FROM host_group_reference WHERE host_group_id=UNHEX(#{assetGroup}))
        </if>
        <if test="startTime != null and startTime != ''">
            AND convert_tz(a.timestamp,'+00:00','+8:00') <![CDATA[ >= ]]> #{startTime}
        </if>
        <if test="endTime != null and endTime != ''">
            AND convert_tz(a.timestamp,'+00:00','+8:00') <![CDATA[ <= ]]> #{endTime}
        </if>
        <if test="sensor != null and sensor != ''">
            AND e.sensor_id=unhex(#{sensor}) AND be.event_id=e.id AND be.backlog_id=a.backlog_id
        </if>
        <if test="intent != null and intent  != ''">
            and ta.kingdom = ${intent}
        </if>
        <if test="directiveId != null and directiveId != ''">
            and b.directive_id = ${directiveId}
        </if>
        <if test="greaterThanEqual != null and greaterThanEqual != ''">
            AND a.backlog_id in (select backlog_id from (SELECT count(*) as total_events,backlog_event.backlog_id FROM backlog_event, event
            WHERE event.id = backlog_event.event_id AND event.plugin_id  <![CDATA[ <>  ]]>  1505 GROUP BY backlog_id having total_events  <![CDATA[ >= ]]> ${eventNum}) as bk)
        </if>
        <if test="lessThanEqual != null and lessThanEqual != ''">
            AND a.backlog_id in (select backlog_id from (SELECT count(*) as total_events,backlog_event.backlog_id FROM backlog_event, event
            WHERE event.id = backlog_event.event_id AND event.plugin_id  <![CDATA[ <>  ]]>    1505 GROUP BY backlog_id having total_events  <![CDATA[ <= ]]> ${eventNum}) as bk)
        </if>
        <if test="label != null and label != ''">
            AND a.backlog_id=tg.id_component AND tg.id_tag=UNHEX(#{label})
        </if>
        <if test="show1 != null and show1 != ''">
            <![CDATA[
            AND CONCAT( sha1( IFNULL(CONCAT(ki.name,' &mdash; ',ca.name,' &mdash; ',ta.subcategory), IFNULL(p.name, '')) ),
            CONCAT( 'S', hex(a.src_ip), 'D', hex( a.dst_ip), DATE( convert_tz(a.timestamp,'+00:00','+8:00') ) ) )=g.group_id AND g.owner='admin'
        ]]>
        </if>
        <if test="show2 != null and show2 != ''">

            <![CDATA[
            AND CONCAT( sha1( IFNULL(CONCAT(ki.name,' &mdash; ',ca.name,' &mdash; ',ta.subcategory), IFNULL(p.name, '')) ),
            CONCAT( 'S', hex(a.src_ip), 'D', hex( a.dst_ip), DATE( convert_tz(a.timestamp,'+00:00','+8:00') ) ) )
            NOT IN(Select group_id FROM alarm_groups WHERE owner IS NOT NULL AND owner<>'')
            ]]>
        </if>
        <if test="show3 != null and show3 != ''">
        <![CDATA[
            AND CONCAT( sha1( IFNULL(CONCAT(ki.name,' &mdash; ',ca.name,' &mdash; ',ta.subcategory), IFNULL(p.name, '')) ),
            CONCAT( 'S', hex(a.src_ip), 'D', hex( a.dst_ip), DATE( convert_tz(a.timestamp,'+00:00','+8:00') ) ) )
            NOT IN(Select group_id FROM alarm_groups WHERE owner<>'admin' AND owner IS NOT NULL AND owner<>'')

            ]]>
        </if>
        )
        ) as alarm_event
        GROUP BY <include refid="Base_Column_List_group"/>
        <if test="riskLevel != nulll and riskLevel != ''">
            having max_risk <![CDATA[ >= ]]> ${riskLevel}
        </if>
        ORDER BY <include refid="Base_Column_List_order"/> DESC
         
        <include refid="page_sql"/>;
        select found_rows() as count ;

    </select>

    <select id="getAlarmsGrupViewBySimilar" resultMap="BaseResultMap,count" parameterType="java.util.Map">

        SELECT SQL_CALC_FOUND_ROWS distinct a.similar AS group_id, <![CDATA[ IF(a.plugin_id<>1505,p.name,IFNULL(CONCAT(ki.name,' &mdash; ',ca.name,' &mdash; ',ta.subcategory), p.name)) AS name, ]]>
        max(a.risk) as max_risk,
         count(distinct a.similar) as howmany
        FROM alarm a
        LEFT JOIN plugin_sid p ON a.plugin_id = p.plugin_id AND a.plugin_sid = p.sid
        LEFT JOIN ( alarm_taxonomy ta LEFT JOIN alarm_kingdoms ki ON ta.kingdom=ki.id LEFT JOIN alarm_categories ca ON ta.category=ca.id ) ON a.plugin_sid=ta.sid
        AND a.corr_engine_ctx=ta.engine_id
        <include refid="Base_Column_List_similar_table"/>
        ,backlog b
        WHERE 1=1
        AND a.status='open'
        AND a.backlog_id=b.id AND  <![CDATA[  b.timestamp<>'1970-01-01 00:00:00' ]]>

        <if test="assetGroup != null and assetGroup != ''">

            AND ah.id_host in (SELECT host_id FROM host_group_reference WHERE host_group_id=UNHEX(#{assetGroup}))
        </if>
        <if test="sensor != null and sensor != ''">
            AND e.sensor_id=unhex(#{sensor}) AND be.event_id=e.id AND be.backlog_id=a.backlog_id
        </if>
        <if test="intent != null and intent  != ''">
            and ta.kingdom = ${intent}
        </if>
        <if test="directiveId != null and directiveId != ''">
            and b.directive_id = ${directiveId}
        </if>
        <if test="show1 != null and show1 != ''">
            <![CDATA[
           AND a.similar=g.group_id AND g.owner='admin'
        ]]>
        </if>
        <if test="show2 != null and show2 != ''">

            <![CDATA[
           AND a.similar NOT IN(Select group_id FROM alarm_groups WHERE owner IS NOT NULL AND owner<>'')
            ]]>
        </if>
        <if test="show3 != null and show3 != ''">
            <![CDATA[
           AND a.similar NOT IN(Select group_id FROM alarm_groups WHERE owner<>'admin' AND owner IS NOT NULL AND owner<>'')

            ]]>
        </if>
        GROUP BY a.similar
        ORDER BY a.timestamp DESC

        <include refid="page_sql"/>;
        select found_rows() as count ;

    </select>

    <select id="getSensor" parameterType="java.util.Map" resultMap="SensorMap">
            SELECT sensor.name, HEX(sensor.id) AS s_id, INET6_NTOA(sensor.ip) AS sensor_ipd, sensor_properties.*
            FROM sensor, sensor_properties
            WHERE sensor.id = sensor_properties.sensor_id
            <if test="sensorName != null and sensorName != ''">
                and sensor.name= #{sensorName} and inet6_aton(#{sensorIp}) = sensor.ip
            </if>
            AND sensor.name != '(null)'  ORDER BY name
    </select>

    <select id="getLabel" parameterType="java.util.Map" resultMap="LableMap">
        SELECT DISTINCT  name,HEX(id) AS id, HEX(ctx) AS ctx FROM tag  WHERE 1 = 1 AND type = 'alarm'
        <if test="label != null and label != ''">
            and name=#{label}
        </if>
    </select>

    <select id="getIntent" resultMap="IntentMap">
        select * from alarm_kingdoms
    </select>

</mapper>

下面是dao中的代码: 

    public List<List<?>> getAlarmsGrupView(Map params){
        List<List<?>> list = new ArrayList<>();

        try {
            list = sqlSessionTemplate2.selectList("AlarmsGroupView.getAlarmsGrupView", params);
        } catch (Exception e) {
            log.error("error",e);
        }

        return list;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值