由于使用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,' — ',ca.name,' — ',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,' — ',ca.name,' — ',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,' — ',ca.name,' — ',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,' — ',ca.name,' — ',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,' — ',ca.name,' — ',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;
}