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存储过程返回List集合
使用J2EE+Spring+Ibatis+JDBC 调用存储过程,并返回结果集的配置详细。 供学习参考。
在已有的spring+mybatis 基本操作oracle数据库的基础上,增加了3个调用存储过程的例子:无返回值、返回结果集、返回多个结果,希望对大家能有所帮助
SSH项目改为Spingboot项目,将项目中部分需要调用存储过程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项目访问数据库超过十次就会挂掉,原因是Springboot...
execute 调用返回结果集存储过程 call 方法调用存储过程 前 言 1、关于 JdbcTemplate 的介绍、pom 依赖、DI 注入可以参考《Spring JdbcTemplate 模板剖析 之 常用 增删改查》,本文继续介绍 JdbcTemplate 调用...
如何用Java SpringBoot实现调用OpenAI ChatGPT的相关接口
springboot继承mybatis后,通过mybatis调用oracle数据库中创建的存储过程,并获取通过游标返回的数据。
Spring Batch流程介绍: ... 外部控制器调用JobLauncher启动一个Job,Job调用自己的Step去实现对数据的操作,Step处理完成后,再将处理结果一步步返回给上一层,这就是Batch处理实现的一个简单流程。
经过多方研究,总结出的简单明了的接口,通过调用接口获取天气预报,然后存入mysql数据库。研究有遗漏之后可以提出来,相互学习。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm...
Spring Cloud简介 Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud ...
使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...
使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...
11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和...
11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和...
用来表示该方法返回结果存放在缓存中,当在使用相同参数调用该方法的时候,会优先在缓存中查找,不会立即执行下面的方法! 重点来了哦!这里面说的“相同参数”一定要正确理解,也就是说同一个方法使用了@Cacheable...
因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。 清单...
Spring Boot Micro Service最佳实践和集成表中的内容介绍该项目旨在在单个存储库中提供可用于基于Spring Boot的微服务的最佳实践和集成。 通过按需添加或删除依赖关系,开发人员可以将该存储库用作模板来构建自己的...
这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...
如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法 并缓存结果后返回给用户。下 次调用直接从缓存中获取。 • 使用Spring缓存抽象时我们需要关注以下两点; 1、确定方法需要被缓存 以及他们的缓存策略 ...