mybatis 存储过程

BEGIN
CREATE TEMPORARY TABLE tmp_table_business(column_x_y VARCHAR(10));
IF (rUid IS null) and (businessLcuId IS null) THEN
  insert INTO tmp_table_business(
   SELECT
  	a.business_lcu_id AS column_x_y
  FROM
  	business_lcu a
  WHERE
  	a.is_delete = 1
  AND a.project_id = projectId
  );
END IF;
IF ((rUid IS NOT NULL) AND ( businessLcuId is NULL)) THEN 
insert INTO tmp_table_business(
SELECT
	a.business_lcu_id AS column_x_y
FROM
	business_lcu a
WHERE
	a.is_delete = 1
AND a.rtu_id = rUid);
END IF;
IF (businessLcuId IS not NULL) THEN
  insert INTO tmp_table_business( column_x_y) VALUES( businessLcuId);
  END IF; 
 SELECT
        COUNT(a.workorder_id) INTO undisposed
        FROM
        workorder a
        WHERE
        is_deleted = 0 AND a.workorder_device_id IN(SELECT * FROM tmp_table_business) AND
        a.workorder_status_id IN(1,2);
 SELECT
        COUNT(a.workorder_id) INTO disposing
        FROM
        workorder a
        WHERE
        is_deleted = 0 AND a.workorder_device_id IN(SELECT * FROM tmp_table_business) AND
        a.workorder_status_id IN(3,4,5);
SELECT
        COUNT(a.workorder_id) INTO disposed
        FROM
        workorder a
        WHERE
        is_deleted = 0 AND a.workorder_device_id IN(SELECT * FROM tmp_table_business) AND
        a.workorder_status_id =6;
SELECT
        COUNT(a.workorder_id) INTO total
        FROM
        workorder a
        WHERE
        is_deleted = 0 AND a.workorder_device_id IN(SELECT * FROM tmp_table_business);
        //这里建议删除一下:  临时表有两种级别:1、会话级别;2、缓存级别。  其中会话级别的会在回话结束时自行删除(这里用的
        //是会话级别的,安全起见还是进行了删除)。缓存级别的在声明时有一个 TYPE = HEAP 实例:CREATE TEMPORARY TABLE 
        //tmp_table_business(column_x_y VARCHAR(10)) TYPE = HEAP;具体使用方式自行百度
   DROP TEMPORARY TABLE IF EXISTS tmp_table_business;
      //将数据返回给java  没有它是行不通的
SELECT total ,undisposed ,disposing ,disposed ;
END

经过改进的:把IN换成了 EXISTS

BEGIN
CREATE TEMPORARY TABLE tmp_table_business(column_x_y VARCHAR(10));
IF (rUid IS null) and (businessLcuId IS null) THEN
  insert INTO tmp_table_business(
   SELECT
  	a.business_lcu_id AS column_x_y
  FROM
  	business_lcu a
  WHERE
  	a.is_delete = 1
  AND a.project_id = projectId
  );
END IF;
IF ((rUid IS NOT NULL) AND ( businessLcuId is NULL)) THEN 
insert INTO tmp_table_business(
SELECT
	a.business_lcu_id AS column_x_y
FROM
	business_lcu a
WHERE
	a.is_delete = 1
AND a.rtu_id = rUid);
END IF;
IF (businessLcuId IS not NULL) THEN
  insert INTO tmp_table_business( column_x_y) VALUES( businessLcuId);
  END IF; 
 SELECT
        COUNT(a.workorder_id) INTO undisposed
        FROM
        workorder a
        WHERE
        is_deleted = 0  AND
        a.workorder_status_id IN(1,2) AND  EXISTS(SELECT * FROM tmp_table_business WHERE businessLcuId_x_y=a.workorder_device_id) ;
 SELECT
        COUNT(a.workorder_id) INTO disposing
        FROM
        workorder a
        WHERE
        is_deleted = 0  AND
        a.workorder_status_id IN(3,4,5) AND  EXISTS(SELECT * FROM tmp_table_businessWHERE column_x_y =a.workorder_device_id);
SELECT
        COUNT(a.workorder_id) INTO disposed
        FROM
        workorder a
        WHERE
        is_deleted = 0  AND
        a.workorder_status_id =6
       AND  EXISTS(SELECT * FROM tmp_table_business WHERE column_x_y =a.workorder_device_id);
SELECT
        COUNT(a.workorder_id) INTO total
        FROM
        workorder a
        WHERE
        is_deleted = 0 AND  EXISTS(SELECT * FROM tmp_table_business WHERE column_x_y =a.workorder_device_id);
   DROP TEMPORARY TABLE IF EXISTS column_x_y ;
   //将数据返回给java  没有它是行不通的
 SELECT total ,undisposed ,disposing ,disposed ;
END

java调用。这里用的是的mybatis注释方式,在dao接口上

/**
			 * @Author:XiaoXiaoHou
			 * @Date:2018/12/14
			 * @Description: 	调用存储过程获取统计值
			 * @Return :
			 */
	@Options(statementType = StatementType.CALLABLE)
	@Select("call statiscStatusNum(" +
			"#{rUid,mode=IN,jdbcType = CHAR},  " +
			"#{businessLcuId,mode=IN,jdbcType=CHAR}," +
			"#{total ,jdbcType=BIGINT}, " +
			"#{undisposed, jdbcType=BIGINT}," +
			"#{disposing,jdbcType=BIGINT}," +
			"#{disposed, jdbcType=BIGINT},"+
			"#{projectId,mode=IN,jdbcType=BIGINT})")
	Map<String ,Long> callProcedure(Map<String,Object> map);

@Mapper 、@Options、@Select在(import org.apache.ibatis.annotations.*; )里
statementType 在(import org.apache.ibatis.mapping.StatementType;)里

import org.apache.ibatis.annotations.*; 
import org.apache.ibatis.mapping.StatementType;
@Mapper
public interface WorkorderDao {
/**
			 * @Author:XiaoXiaoHou
			 * @Date:2018/12/14
			 * @Description: 	调用存储过程获取统计值
			 * @Return :
			 */
	@Options(statementType = StatementType.CALLABLE)
	@Select("call statiscStatusNum(" +
			"#{rUid,mode=IN,jdbcType = CHAR},  " +
			"#{businessLcuId,mode=IN,jdbcType=CHAR}," +
			"#{total ,jdbcType=BIGINT}, " +
			"#{undisposed, jdbcType=BIGINT}," +
			"#{disposing,jdbcType=BIGINT}," +
			"#{disposed, jdbcType=BIGINT},"+
			"#{projectId,mode=IN,jdbcType=BIGINT})")
	Map<String ,Long> callProcedure(Map<String,Object> map);
	}

servece调用

/**
     * @Author:XiaoXiaoHou
     * @Date:2018/12/12
     * @Description: 统计工单已处理disposed(workroder_status_id = 6)、处理中disposing(workroder_status_id IN (3,4,5))、
     * 未处理undisposed(workroder_status_id IN (1,2))以及工单总数total
     * @Return :
     */
    public ModelAndView statiscStatusNum(Integer projectId, String rUid, String businessLcuId) {
        ModelAndView mav = getFail();
        Map<String, Object> params = new HashMap<>(16);
        //把过程中类型为IN的参数传递进去 类型为OUT的不用传递
        params.put("projectId", projectId);
        params.put("rUid", rUid);
        params.put("businessLcuId", businessLcuId);
        WorkorderStatusPercent wsp;
        Map<String, Long> result;
        try {
        //从result里获取从数据库查询得出的数据
            result = workorderDao.callProcedure(params);
            wsp = getPercent(result);
            mav = getMavWithAttributes(wsp);
        } catch (Exception e) {
            mav = getMavOnException();
            e.printStackTrace();
        }
        return mav;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值