### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细介绍一个用于Java应用程序中调用Oracle存储过程的通用类,帮助开发者更高效地实现相关功能。 #### 核心知识点解析 ##### 1. 类的基本结构 此通用类位于`com.gemship.common.service.impl`包下,名为`HelperServiceImpl`,继承自`BaseServiceImpl`并实现了`HelperService`接口。该类的主要目的是提供一种机制来查询或执行Oracle数据库中的存储过程,并返回相应的结果。 ##### 2. 方法详解 - **queryProcedure**方法:该方法是核心处理方法,用于调用存储过程,并获取结果集。 - 参数列表: - `List list`:包含要传递给存储过程的参数值列表。 - `String strStoredProcedureName`:存储过程的名称。 - `int[] cursorIndexes`:指示哪些参数是游标类型(即输出结果集)。 - `Map<Integer, Integer> cursorTypes`:指定游标类型的Oracle类型(例如:`OracleTypes.CURSOR`)。 - 返回值:`Map`对象,其中包含了存储过程的执行结果以及可能的输出参数。 - **流程分析**: - 初始化存储过程的信息:通过`StoredQueryInfo`对象创建,传入存储过程的名称。 - 定义参数类型、名称、值以及数据提取器数组,用于存储过程调用时的数据处理。 - 使用循环遍历所有参数,设置参数类型、名称和值。对于输出参数(游标),定义其类型为`OracleTypes.CURSOR`,并设置为`null`(因为是输出参数,初始值通常不重要)。 - 创建一个内部匿名类`RowMapper`,用于从结果集中映射数据到Java对象。 - 使用`ProcedureUtil`工具类调用存储过程,并处理结果集。 ##### 3. 其他关键组件 - **`ProcedureUtil`**:这是一个自定义工具类,用于处理存储过程的调用。它提供了与数据库交互的功能,包括设置输入参数、执行存储过程以及处理输出参数等。 - **`StoredQueryInfo`**:该类封装了存储过程的元信息,如名称、参数等,方便在调用过程中使用。 - **`RowMapper`**:这是Apache Commons DBUtils提供的一个接口,用于从数据库结果集中提取数据并映射到Java对象。在这个例子中,通过匿名内部类的方式实现了`RowMapper`接口,用于处理存储过程的输出结果。 #### 示例代码解析 以下是一段简化后的示例代码,展示了如何使用`queryProcedure`方法: ```java // 假设已知存储过程名称为"get_data" String spName = "get_data"; // 参数值列表 List<Object> params = new ArrayList<>(); params.add(1); // 输入参数1 params.add(2); // 输入参数2 // 游标索引 int[] cursorIndices = {2}; // 游标类型 Map<Integer, Integer> cursorTypes = new HashMap<>(); cursorTypes.put(2, OracleTypes.CURSOR); // 调用存储过程 Map result = helperService.queryProcedure(params, spName, cursorIndices, cursorTypes); ``` #### 总结 本文介绍了一个用于Java程序中调用Oracle存储过程的通用类。通过该类,开发者可以轻松地与数据库交互,特别是在需要执行复杂查询或更新操作时非常有用。此外,文章还详细介绍了该类的实现原理和关键组件,有助于理解其内部工作机制。
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import oracle.jdbc.OracleTypes;
import org.apache.commons.beanutils.converters.BooleanConverter;
import org.apache.commons.lang.time.DateUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.jdbc.core.RowMapper;
import com.gemship.common.DateUtil;
import com.gemship.common.service.HelperService;
import com.gemship.commondata.util.ProcedureUtil;
import com.gemship.ecm.entity.RemindDaysSet;
import com.gfa4j.exception.ValidateRuntimeException;
import com.gfa4j.hibernate.BaseObject;
import com.gfa4j.query.StoredQueryInfo;
import com.gfa4j.service.impl.BaseServiceImpl;
import com.gfa4j.util.StringUtils;
public class HelperServiceImpl extends BaseServiceImpl implements HelperService {
private RemindDaysSetService remindDaysSetService;
public Map queryProcedure(List list, String strStoredProcedureName, int[] cursorIndexes,
Map<Integer, Integer> cursorTypes) {
StoredQueryInfo queryInfo = new StoredQueryInfo(strStoredProcedureName);
int size = list.size() + cursorIndexes.length;
int[] paramTypes = new int[size];
String[] paramNames = new String[size];
Object[] paramValues = new Object[size];
RowMapper[] dataExtracters = new RowMapper[size];
for (int i=0,j=0,k=0; i<size; i++) {
if(j < cursorIndexes.length && i == cursorIndexes[j]) {
//该参数为输出
Integer cursorType = cursorTypes.get(list.size()+j);
paramTypes[i] = cursorType == null ? OracleTypes.CURSOR : cursorType;
paramNames[i] = createCursorName(j);
paramValues[i] = null;
dataExtracters[i] = new RowMapper(){
@SuppressWarnings("unchecked")
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Map resultData = new HashMap();
剩余14页未读,继续阅读
- 码农20032020-01-17还可以吧,参考一下还是可以的
- 粉丝: 48
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助