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


    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);  
  • 相关阅读:
    react native错误排查-TypeError: window.deltaUrlToBlobUrl is not a function
    react native报错处理com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process
    react native中一次错误排查 Error:Error: Duplicate resources
    umijs开发实践-不同页面交叉使用dva中的modal文件导致的错误
    每天五分钟-javascript数据类型
    react native中使用echarts
    微信小程序中通过腾讯地图进行逆地址解析报错message: "请求来源未被授权, 此次请求来源域名:servicewechat.com"
    在react中实现打印功能
    mac git从代码仓库克隆代码,修改并上传
    基于jwt的用户登录认证
  • 原文地址:https://www.cnblogs.com/wzh123/p/3393014.html
Copyright © 2020-2023  润新知