`

Spring 调用存储过程返回结果集

 
阅读更多
Spring 的JdbcTemplate 提够了对存储过程调用的支持
但是直接体构一种常用的返回结果集,sqlServer(ResultSet),Oracle(游标)的方式
很多情况下我们需要把这些信息封装成List<Map>,或者List<Bean>的形式返回给应用层。

实现方式:
@Override
public List<Map<String, Object>> callProcedure(String spName,Object[] paramValues) throws SQLException {
		List<Map<String, Object>> rows = null;
		CommonStoredProcedure sp = new CommonStoredProcedure(this.getJdbcTemplate(),spName);
		rows = sp.queryList(Arrays.asList(paramValues));
		return rows==null?new ArrayList(0):rows;
	}

CommonStoredProcedure
继承 StoredProcedure抽象类
public List queryList(List inParams){
		List result = null;
		Map<String,Object> paramMap = 
new HashMap<String,Object>();
		for(int i=0;i<inParams.size();i++){
    		Object paramValue = inParams.get(i);
//按照顺序设置如参数的值    		
String paramName = "In_"+String.valueOf(i);
    		int paramType = getSqlType(paramValue);
    		setParameter(paramName,paramType);   		paramMap.put(paramName, paramValue);
    	}
		setInParam(paramMap);
//设置返回结果级		
declareParameter(new SqlReturnResultSet("Out",rowMapper));
		Map<String,Object> map = execute();
		result = (List)map.get("Out");
    	return result == null?new ArrayList(0):result;
	}



上面的代码对DB2和SQLSERVER都可以使用,但
oracle 比较不一样的
他设定返回的必须用SqlOutParameter,
引用
Oracle的版本是非常相似的,只不过Oracle使用正规的输出参数传回结果集。这个参数必须在Oracle.jdbc.OracleTypes.CURSOR类型之前声明,而且它还必须传入一个RowMapper实现作为第三个参数。因为这是正规的SqlOutParameter输出参数,它应该以相同的次序声明,就好像它是任何其他类型的输出参数一样

declareParameter(new SqlOutParameter("genre", oracle.jdbc.OracleTypes.CURSOR, new MapGenre()));
    





完整代码
public class CommonStoredProcedure extends StoredProcedure {
	
	private Map<String,?> inParam;
	private RowMapper rowMapper = new ColumnMapRowMapper();
	
	public CommonStoredProcedure(DataSource ds, String spName){
		super(ds,spName);
	}
	public CommonStoredProcedure(JdbcTemplate jdbcTemplate, String name) {
		super(jdbcTemplate,name);
	}
	
	public void setMapperBean(Class mappedClass){
		rowMapper = new HeipBeanPropertyRowMapper(mappedClass);
	}
	
	public List queryList(List inParams){
		List result = null;
		Map<String,Object> paramMap = 
new HashMap<String,Object>();
		for(int i=0;i<inParams.size();i++){
    		Object paramValue = inParams.get(i);
    		String paramName = "In_"+String.valueOf(i);
    		int paramType = getSqlType(paramValue);
    		setParameter(paramName,paramType);   		paramMap.put(paramName, paramValue);
    	}
		setInParam(paramMap);
		declareParameter(new SqlReturnResultSet("Out",rowMapper));
		Map<String,Object> map = execute();
		result = (List)map.get("Out");
    	return result == null?new ArrayList(0):result;
	}
	
	
	public Map<String,Object> execute(){
		compile();
		return execute(inParam);
	}
	public void setInParam(Map<String,?> inParam){
		this.inParam = inParam;
	}
	public void setOutParameter(String column,int type,RowMapper rowMapper){
		declareParameter(new SqlOutParameter(column,type,rowMapper));
	}
	public void setParameter(String column,int type){
		declareParameter(new SqlParameter(column,type));
	}
	public void setParameters(String[] columns, int[] types) {
		for (int i = 0; i < columns.length; i++) {
			setParameter(columns[i],types[i]);
		}
	}
	
	private static int getSqlType(Object obj){
		if (obj instanceof String) {
			return Types.VARCHAR;
		}
		if (obj instanceof Long
		    	||obj instanceof BigDecimal
		    	||obj instanceof Double
		    	||obj instanceof Integer) {
			return Types.NUMERIC;
		}
		if (obj instanceof Date) {
			return Types.DATE;
		}
		/*if (obj instanceof Boolean) {
			return Types.NUMERIC;
		}*/
		
		return Types.OTHER;
	 }
}


摘自:
Spring DAO之存储过程的高级用法
http://westzq.blog.hexun.com/6353026_d.html
Spring DAO之存储过程的高级用法
http://blog.163.com/z278440337@126/blog/static/186995032008420102635244/
分享到:
评论

相关推荐

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    `P_EMP_SELECT` 存储过程用于模糊查询员工信息,并返回结果集。该过程接收两个输入参数:`V_ID` 和 `V_NAME`,分别用于过滤员工 ID 和姓名。存储过程使用 `SYS_REFCURSOR` 输出参数将结果集返回给调用方。 `P_EMP_...

    J2EE+Spring+Ibatis2+blazeds存储过程调用返回结果集

    在这个项目中,我们结合了Spring框架、Ibatis持久层框架以及Blazeds技术,来演示如何调用存储过程并处理返回的结果集。下面将详细讲解这些技术的运用。 首先,J2EE是一种广泛用于开发分布式企业应用的平台,它提供...

    spring mybatis 调用oracle存储过程

    本文将深入探讨如何在Spring和MyBatis集成环境中调用Oracle数据库的存储过程,包括无返回值、返回结果集以及返回多个结果的情况。 首先,让我们理解基础概念。Spring是一个全面的后端开发框架,它提供了依赖注入、...

    Springboot调用Oracle存储过程的几种方式.docx

    在转换SSH项目到Spring Boot的过程中,遇到了由于连接池默认配置限制(默认连接数为10)导致的问题,即频繁调用存储过程后,数据库连接无法得到正确释放,从而引发项目崩溃。以下是对这三种调用方式的详细解释: 1....

    spring mvc + mybatis 调用mysql 存储过程

    这里,我们将使用MyBatis的SqlSession对象,通过Mapper接口来调用存储过程。 1. 配置MyBatis: 在Spring MVC项目中,你需要配置MyBatis与Spring的整合,这通常涉及到`mybatis-config.xml`,`sqlSessionFactory`和`...

    MyBatis调用存储过程

    如果存储过程返回结果集,我们需要在映射文件中定义`&lt;resultMap&gt;`,来描述如何将数据库结果映射到Java对象。每个`&lt;result&gt;`标签代表结果集中的一列,包括`column`(数据库列名)和`property`(Java对象属性名)。 `...

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    spring hibernate执行存储过程的例子

    结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...

    Spring+Jdbc scott用户的调用存储过程

    标题中的“Spring+Jdbc scott用户的调用存储过程”涉及到的是在Java开发中使用Spring框架的JDBC模块来调用数据库的存储过程。在Java应用程序中,Spring JDBC提供了一个简单且有效的方式来处理数据库交互,包括执行...

    Spring Data JPA调用存储过程实例代码

    Spring Data JPA 提供了调用存储过程的能力,使得在Java应用中使用存储过程变得方便。 1. **存储过程** 存储过程是数据库中预编译的SQL语句集合,可以接受参数并返回结果。在本例中,我们有 `test_pkg` 包下的两个...

    struts+spring_ibaits+调用Mysql存储过程实现增删改查

    存储过程还可以接受输入参数,返回输出参数,甚至有中间结果集,这使得它们在数据操作上非常灵活。 在本项目中,开发者可能创建了一系列的存储过程,分别对应增删改查操作。例如,有一个`INSERT_PROC`用于插入数据...

    调用存储过程.txt

    3. **使用`jdbcTemplate`调用存储过程**:通过Spring框架提供的`jdbcTemplate`来执行存储过程。`execute()`方法接收两个参数: - `procedure`:存储过程的调用字符串。 - `new CallableStatementCallback()`:这是...

    测试spring的存储过程

    “开发一个基于 JUnit 的存储过程自动化测试的 Eclipse 插件.htm”可能包含了如何使用这个插件的文档,讲解如何在JUnit测试类中调用存储过程,设置参数,执行测试,并获取返回结果。而“SPTestSuite1.0.zip”可能是...

    Spring访问传入数组参数的Oracle存储过程

    存储过程是预编译的SQL语句集合,可以接受输入参数、返回结果以及执行复杂的业务逻辑。在Java中,尤其是使用Spring框架时,我们可以借助JDBC或ORM(对象关系映射)工具如Hibernate来调用这些存储过程。 在Spring中...

    JAVA通过MyBatis调用MySql存储过程和函数doc文档合集整理.zip

    - 调用存储过程和函数可能涉及多条SQL语句,MyBatis的事务管理机制能确保操作的原子性。 - 可以手动控制事务,如在Service层开启和提交,或使用Spring的声明式事务管理。 7. **性能优化** - 合理设计存储过程和...

    SSM+Oracle 存储过程例子

    6. **测试**:最后,我们可以编写JUnit测试用例,验证存储过程是否正确执行并返回预期结果。 通过以上步骤,SSM项目就能成功调用Oracle的存储过程。这种方式不仅方便了代码的组织和维护,还提高了系统的可扩展性和...

    java调用oracle存储过程

    存储过程是预编译在数据库服务器上的SQL和PL/SQL代码集合,可以接收参数,执行特定任务并返回结果。调用存储过程可以提高性能,减少网络流量,并封装业务逻辑。 在Java中,我们主要通过JDBC(Java Database ...

    Mybatis传list参数调用oracle存储过程的解决方法

    最后,我们可以在Server端代码中调用存储过程,传递List类型参数,并获取结果。 实现批量插入数据 通过上述步骤,我们可以使用Mybatis将List类型参数传递给Oracle存储过程,实现批量插入数据。这种方法可以摆脱...

Global site tag (gtag.js) - Google Analytics