先看需求,直接上图
从图中看出,需要12条普通的SELECT语句,所以就放到存储过程中
存储过程如下:
DROP PROCEDURE IF EXISTS proc_report;
DELIMITER $
CREATE PROCEDURE proc_report(
OUT d_normal INT,
OUT d_warn INT,
OUT d_error INT,
OUT d_fatal INT,
OUT m_normal INT,
OUT m_warn INT,
OUT m_error INT,
OUT m_fatal INT,
OUT w_normal INT,
OUT w_warn INT,
OUT w_error INT,
OUT w_fatal INT
)
BEGIN
-- 过去一天的正常日志数量
SELECT COUNT(1) INTO d_normal FROM device_log a
WHERE a.type = '0'
AND TO_DAYS(NOW()) - TO_DAYS(a.create_time) < 1;
-- 过去一天的警告日志数量
SELECT COUNT(1) INTO d_warn FROM device_log a
WHERE a.type = '1'
AND TO_DAYS(NOW()) - TO_DAYS(a.create_time) < 1;
-- 过去一天的错误日志数量
SELECT COUNT(1) INTO d_error FROM device_log a
WHERE a.type = '2'
AND TO_DAYS(NOW()) - TO_DAYS(a.create_time) < 1;
-- 过去一天的严重错误日志数量
SELECT COUNT(1) INTO d_fatal FROM device_log a
WHERE a.type = '3'
AND TO_DAYS(NOW()) - TO_DAYS(a.create_time) < 1;
-- 过去一个月的正常日志数量
SELECT COUNT(1) INTO m_normal FROM device_log a
WHERE a.type = '0'
AND PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(a.create_time,'%Y%m')) < 1;
-- 过去一个月的警告日志数量
SELECT COUNT(1) INTO m_warn FROM device_log a
WHERE a.type = '1'
AND PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(a.create_time,'%Y%m')) < 1;
-- 过去一个月的错误日志数量
SELECT COUNT(1) INTO m_error FROM device_log a
WHERE a.type = '2'
AND PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(a.create_time,'%Y%m')) < 1;
-- 过去一个月的严重错误日志数量
SELECT COUNT(1) INTO m_fatal FROM device_log a
WHERE a.type = '3'
AND PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(a.create_time,'%Y%m')) < 1;
-- 过去7天的正常日志
SELECT COUNT(1) INTO w_normal FROM device_log a
WHERE a.type = '0'
AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(a.create_time);
-- 过去7天的警告日志
SELECT COUNT(1) INTO w_warn FROM device_log a
WHERE a.type = '1'
AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(a.create_time);
-- 过去7天的错误日志
SELECT COUNT(1) INTO w_error FROM device_log a
WHERE a.type = '2'
AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(a.create_time);
-- 过去7天的严重错误日志
SELECT COUNT(1) INTO w_fatal FROM device_log a
WHERE a.type = '3'
AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(a.create_time);
END $
mysql中的调用先看一下
CALL proc_report(
@d_normal,
@d_warn,
@d_error,
@d_fatal,
@m_normal,
@m_warn,
@m_error,
@m_fatal,
@w_normal,
@w_warn,
@w_error,
@w_fatal
);
SELECT @d_normal AS d_normal,@d_warn AS d_warn,@d_error AS d_error,@d_fatal AS d_fatal,
@m_normal AS m_normal,@m_warn AS m_warn,@m_error AS m_error,@m_fatal AS m_fatal,
@w_normal AS w_normal,@w_warn AS w_warn,@w_error AS w_error,@w_fatal AS w_fatal
查询结果如下图:
mybaties中的调用和在DB中调用不一样,需要注意
mybaties调用代码:
<!-- report -->
<select id="getDeviceLog" statementType="CALLABLE" >
CALL proc_report(
#{d_normal,jdbcType=INTEGER,mode=OUT},
#{d_warn,jdbcType=INTEGER,mode=OUT},
#{d_error,jdbcType=INTEGER,mode=OUT},
#{d_fatal,jdbcType=INTEGER,mode=OUT},
#{m_normal,jdbcType=INTEGER,mode=OUT},
#{m_warn,jdbcType=INTEGER,mode=OUT},
#{m_error,jdbcType=INTEGER,mode=OUT},
#{m_fatal,jdbcType=INTEGER,mode=OUT},
#{w_normal,jdbcType=INTEGER,mode=OUT},
#{w_warn,jdbcType=INTEGER,mode=OUT},
#{w_error,jdbcType=INTEGER,mode=OUT},
#{w_fatal,jdbcType=INTEGER,mode=OUT}
)
</select>
注意:第一点:从select节点参数看得出来,这个查询是没有返回值的。第二点:和在mysql中调用又点区别,不再需要【select @参数名】,我使用了实体类传送和接收参数,查询结果会直接set到实体类的对象中
DAO层代码:
/**
* DAO接口
* @author CYH
* @version 2018-11-23
*/
@MyBatisDao
public interface DeviceLogDao extends CrudDao<DeviceLog> {
public void getDeviceLog(DeviceLog deviceLog);
public List<DeviceLog> getLogList(DeviceLog deviceLog);
}
注意是 void getDeviceLog,如果是带有返回值的,结果集回事null,这里的结果都set到DeviceLog 的对象中了
service层代码:
@Autowired
private DeviceLogDao deviceLogDao;
public void getLog(DeviceLog deviceLog){
deviceLogDao.getDeviceLog(deviceLog);
}
controller层代码:
/**
* 过去一天:d_normal 正常,d_warn警告,d_error错误,d_fatal严重错误;
* 过去一月:m_normal 正常,m_warn警告,m_error错误,m_fatal严重错误;
* 过去一星期:w_normal 正常,w_warn警告,w_error错误,w_fatal严重错误
*/
deviceLogService.getLog(deviceLog);
map.put("d_normal", deviceLog.getD_normal());
map.put("d_warn", deviceLog.getD_warn());
map.put("d_error", deviceLog.getD_error());
map.put("d_fatal", deviceLog.getD_fatal());
map.put("m_normal", deviceLog.getM_normal());
map.put("m_warn", deviceLog.getM_warn());
map.put("m_error", deviceLog.getM_error());
map.put("m_fatal", deviceLog.getM_fatal());
map.put("w_normal", deviceLog.getW_normal());
map.put("w_warn", deviceLog.getW_warn());
map.put("w_error", deviceLog.getW_error());
map.put("w_fatal", deviceLog.getW_fatal());
model.addAttribute("log", map);
后台代码到此结束