mybaties调用mysql存储过程。存储过程返回多个select结果集。

先看需求,直接上图

从图中看出,需要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);

后台代码到此结束

猜你喜欢

转载自blog.csdn.net/weixin_43513644/article/details/84433392
今日推荐