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/
分享到:
相关推荐
`P_EMP_SELECT` 存储过程用于模糊查询员工信息,并返回结果集。该过程接收两个输入参数:`V_ID` 和 `V_NAME`,分别用于过滤员工 ID 和姓名。存储过程使用 `SYS_REFCURSOR` 输出参数将结果集返回给调用方。 `P_EMP_...
在这个项目中,我们结合了Spring框架、Ibatis持久层框架以及Blazeds技术,来演示如何调用存储过程并处理返回的结果集。下面将详细讲解这些技术的运用。 首先,J2EE是一种广泛用于开发分布式企业应用的平台,它提供...
本文将深入探讨如何在Spring和MyBatis集成环境中调用Oracle数据库的存储过程,包括无返回值、返回结果集以及返回多个结果的情况。 首先,让我们理解基础概念。Spring是一个全面的后端开发框架,它提供了依赖注入、...
在转换SSH项目到Spring Boot的过程中,遇到了由于连接池默认配置限制(默认连接数为10)导致的问题,即频繁调用存储过程后,数据库连接无法得到正确释放,从而引发项目崩溃。以下是对这三种调用方式的详细解释: 1....
这里,我们将使用MyBatis的SqlSession对象,通过Mapper接口来调用存储过程。 1. 配置MyBatis: 在Spring MVC项目中,你需要配置MyBatis与Spring的整合,这通常涉及到`mybatis-config.xml`,`sqlSessionFactory`和`...
如果存储过程返回结果集,我们需要在映射文件中定义`<resultMap>`,来描述如何将数据库结果映射到Java对象。每个`<result>`标签代表结果集中的一列,包括`column`(数据库列名)和`property`(Java对象属性名)。 `...
本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...
结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...
标题中的“Spring+Jdbc scott用户的调用存储过程”涉及到的是在Java开发中使用Spring框架的JDBC模块来调用数据库的存储过程。在Java应用程序中,Spring JDBC提供了一个简单且有效的方式来处理数据库交互,包括执行...
Spring Data JPA 提供了调用存储过程的能力,使得在Java应用中使用存储过程变得方便。 1. **存储过程** 存储过程是数据库中预编译的SQL语句集合,可以接受参数并返回结果。在本例中,我们有 `test_pkg` 包下的两个...
存储过程还可以接受输入参数,返回输出参数,甚至有中间结果集,这使得它们在数据操作上非常灵活。 在本项目中,开发者可能创建了一系列的存储过程,分别对应增删改查操作。例如,有一个`INSERT_PROC`用于插入数据...
3. **使用`jdbcTemplate`调用存储过程**:通过Spring框架提供的`jdbcTemplate`来执行存储过程。`execute()`方法接收两个参数: - `procedure`:存储过程的调用字符串。 - `new CallableStatementCallback()`:这是...
“开发一个基于 JUnit 的存储过程自动化测试的 Eclipse 插件.htm”可能包含了如何使用这个插件的文档,讲解如何在JUnit测试类中调用存储过程,设置参数,执行测试,并获取返回结果。而“SPTestSuite1.0.zip”可能是...
存储过程是预编译的SQL语句集合,可以接受输入参数、返回结果以及执行复杂的业务逻辑。在Java中,尤其是使用Spring框架时,我们可以借助JDBC或ORM(对象关系映射)工具如Hibernate来调用这些存储过程。 在Spring中...
- 调用存储过程和函数可能涉及多条SQL语句,MyBatis的事务管理机制能确保操作的原子性。 - 可以手动控制事务,如在Service层开启和提交,或使用Spring的声明式事务管理。 7. **性能优化** - 合理设计存储过程和...
6. **测试**:最后,我们可以编写JUnit测试用例,验证存储过程是否正确执行并返回预期结果。 通过以上步骤,SSM项目就能成功调用Oracle的存储过程。这种方式不仅方便了代码的组织和维护,还提高了系统的可扩展性和...
存储过程是预编译在数据库服务器上的SQL和PL/SQL代码集合,可以接收参数,执行特定任务并返回结果。调用存储过程可以提高性能,减少网络流量,并封装业务逻辑。 在Java中,我们主要通过JDBC(Java Database ...
最后,我们可以在Server端代码中调用存储过程,传递List类型参数,并获取结果。 实现批量插入数据 通过上述步骤,我们可以使用Mybatis将List类型参数传递给Oracle存储过程,实现批量插入数据。这种方法可以摆脱...