wzh123

博客园 首页 新随笔 联系 订阅 管理

1、接口

Java代码 复制代码 收藏代码
  1.    /**  
  2.  * 调用存储过程  
  3.  *   
  4.  * @param procName 存储过程名. 如:testProcParam、mypack.testProcParam  
  5.  * @param inParams 输入参数映射对象. 格式为:索引号->值  
  6.  * @param outTypes 输出参数类型映射对象. 格式为:索引号->类型  
  7.  * @return Map<Integer, Object> 输出结果映射对象. 格式为:索引号->值  
  8.  */  
  9. public Map<Integer, Object> callProcedure(String procName,    
  10.         Map<Integer, Object> inParams, Map<Integer, Integer> outTypes);  
    /**
	 * 调用存储过程
	 * 
	 * @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、实现方法

Java代码 复制代码 收藏代码
  1. public Map<Integer, Object> callProcedure(final String procName,   
  2.         final Map<Integer, Object> inParams, final Map<Integer, Integer> outTypes) {   
  3.     return (Map<Integer, Object>) getHibernateTemplate().executeWithNativeSession(new HibernateCallback(){   
  4.         public Object doInHibernate(Session session) throws HibernateException, SQLException {   
  5.             // 输出参数结果   
  6.             Map<Integer, Object> resultMap = new HashMap<Integer, Object>();   
  7.                
  8.             // 参数个数   
  9.             int paramCount = 0;   
  10.                
  11.             // 存放问号的字符串. 如?或?,?...   
  12.             String questionMark = "";   
  13.                
  14.             // 计算问号个数   
  15.             if (MapUtils.isNotEmpty(inParams)) {   
  16.                 paramCount += inParams.size();   
  17.             }   
  18.             if (MapUtils.isNotEmpty(outTypes)) {   
  19.                 paramCount += outTypes.size();   
  20.             }   
  21.                
  22.             // 设置问号字符串, 以逗号隔开   
  23.             for (int i = 0; i < paramCount; i++) {   
  24.                 questionMark += "?,";   
  25.             }   
  26.             if (!"".equals(questionMark)) questionMark = questionMark.substring(0, questionMark.length() - 1);   
  27.   
  28.             // 获取数据库连接   
  29.             Connection con = session.connection();   
  30.                
  31.             // 创建调用存储过程的CallableStatement对象   
  32.             String sql = "{call " + procName + "(" + questionMark + ")}";   
  33.             CallableStatement cstmt = con.prepareCall(sql);   
  34.                
  35.             // 设置输入参数   
  36.             if (MapUtils.isNotEmpty(inParams))   
  37.                 for (Map.Entry<Integer, Object> entry : inParams.entrySet()) {   
  38.                     cstmt.setObject(entry.getKey(), entry.getValue());   
  39.                 }   
  40.   
  41.             // 注册输出参数   
  42.             if (MapUtils.isNotEmpty(outTypes))   
  43.                 for (Map.Entry<Integer, Integer> entry : outTypes.entrySet()) {   
  44.                     cstmt.registerOutParameter(entry.getKey(), entry.getValue());   
  45.                 }   
  46.                
  47.             // 执行存储过程   
  48.             cstmt.execute();   
  49.   
  50.             // 获取输出参数结果   
  51.             if (MapUtils.isNotEmpty(outTypes))   
  52.                 for (Map.Entry<Integer, Integer> entry : outTypes.entrySet()) {   
  53.                     resultMap.put(entry.getKey(), cstmt.getObject(entry.getKey()));   
  54.                 }   
  55.                
  56.             return resultMap;   
  57.         }   
  58.     });   
  59. }  
	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、使用

Java代码 复制代码 收藏代码
  1. String procName = "PACK_TASK.PROC_SOFTWORE_UPDATE_ANALYZE"// 存储过程名   
  2. Map<Integer, Object> inParams = new HashMap<Integer, Object>(); // 输入参数. 格式为:索引号->值   
  3. Map<Integer, Integer> outTypes = new HashMap<Integer, Integer>(); // 输出参数类型. 格式为:索引号->类型   
  4.   
  5. // 设置输入参数   
  6. inParams.put(1, taskId);   
  7.   
  8. // 设置输出类型   
  9. outTypes.put(2, Types.INTEGER);   
  10. outTypes.put(3, Types.VARCHAR);   
  11.   
  12. // 调用存储过程   
  13. Map<Integer, Object> resultMap = softwareResultRepository.callProcedure(procName, inParams, outTypes);   
  14.   
  15. // 获取输出参数值   
  16. resultMap.get(2);   
  17. resultMap.get(3);  
posted on 2013-10-28 20:05  wzh123  阅读(295)  评论(0编辑  收藏  举报