今天写了一个调用存储过程的方法

1、接口

    /**
	 * 调用存储过程
	 * 
	 * @param procName 存储过程名. 如:testProcParam、mypack.testProcParam
	 * @param inParams 输入参数映射对象. 格式为:索引号->值
	 * @param outTypes 输出参数类型映射对象. 格式为:索引号->类型
	 * @return Map<Integer, Object> 输出结果映射对象. 格式为:索引号->值
	 */
	public Map<Integer, Object> callProcedure(String procName, 
			Map<Integer, Object> inParams, Map<Integer, Integer> outTypes);
 

 

2、实现方法

	public Map<Integer, Object> callProcedure(final String procName,
			final Map<Integer, Object> inParams, final Map<Integer, Integer> outTypes) {
		return (Map<Integer, Object>) getHibernateTemplate().executeWithNativeSession(new HibernateCallback(){
			public Object doInHibernate(Session session) throws HibernateException, SQLException {
				// 输出参数结果
				Map<Integer, Object> resultMap = new HashMap<Integer, Object>();
				
				// 参数个数
				int paramCount = 0;
				
				// 存放问号的字符串. 如?或?,?...
				String questionMark = "";
				
				// 计算问号个数
				if (MapUtils.isNotEmpty(inParams)) {
					paramCount += inParams.size();
				}
				if (MapUtils.isNotEmpty(outTypes)) {
					paramCount += outTypes.size();
				}
				
				// 设置问号字符串, 以逗号隔开
				for (int i = 0; i < paramCount; i++) {
					questionMark += "?,";
				}
				if (!"".equals(questionMark)) questionMark = questionMark.substring(0, questionMark.length() - 1);

				// 获取数据库连接
				Connection con = session.connection();
				
				// 创建调用存储过程的CallableStatement对象
				String sql = "{call " + procName + "(" + questionMark + ")}";
				CallableStatement cstmt = con.prepareCall(sql);
				
				// 设置输入参数
				if (MapUtils.isNotEmpty(inParams))
					for (Map.Entry<Integer, Object> entry : inParams.entrySet()) {
						cstmt.setObject(entry.getKey(), entry.getValue());
					}

				// 注册输出参数
				if (MapUtils.isNotEmpty(outTypes))
					for (Map.Entry<Integer, Integer> entry : outTypes.entrySet()) {
						cstmt.registerOutParameter(entry.getKey(), entry.getValue());
					}
				
				// 执行存储过程
				cstmt.execute();

				// 获取输出参数结果
				if (MapUtils.isNotEmpty(outTypes))
					for (Map.Entry<Integer, Integer> entry : outTypes.entrySet()) {
						resultMap.put(entry.getKey(), cstmt.getObject(entry.getKey()));
					}
				
				return resultMap;
			}
		});
	}
 

 

3、使用

		String procName = "PACK_TASK.PROC_SOFTWORE_UPDATE_ANALYZE"; // 存储过程名
		Map<Integer, Object> inParams = new HashMap<Integer, Object>(); // 输入参数. 格式为:索引号->值
		Map<Integer, Integer> outTypes = new HashMap<Integer, Integer>(); // 输出参数类型. 格式为:索引号->类型
		
		// 设置输入参数
		inParams.put(1, taskId);
		
		// 设置输出类型
		outTypes.put(2, Types.INTEGER);
		outTypes.put(3, Types.VARCHAR);
		
		// 调用存储过程
		Map<Integer, Object> resultMap = softwareResultRepository.callProcedure(procName, inParams, outTypes);
		
		// 获取输出参数值
		resultMap.get(2);
		resultMap.get(3);
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值