spring 中StoredProcedure的使用方法

StoredProcedure是一个抽象类,必须写一个子类来继承它,这个类是用来简化JDBCTemplate运行存储过程操作的。

首先我们写一个实现类:

package com.huaye.framework.dao;

import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlReturnResultSet;
import org.springframework.jdbc.object.StoredProcedure;

/**
 * Name:StoredProcedureTemplate User: HP Date: 2007-7-21 Time: 7:40:01
 * Description:
 */
public class StoredProcedureTemplate extends StoredProcedure {

	private HashMap<String, Object> map = new HashMap<String, Object>();

	public StoredProcedureTemplate() {
		super();

	}

	public HashMap getMap()
	{
		return this.map;
	}

	public void setValue(String key, Object obj) {
		map.put(key, obj);
	}

	public Map execute() {
		if (this.getSql() == null || this.getSql().equals(""))
			return null;
		this.compile();
		return execute(map);
	}

	public void setVarcharParam(String param) {
		this.declareParameter(new SqlParameter(param, Types.VARCHAR));
	}

	public void setDoubleParam(String param) {
		this.declareParameter(new SqlParameter(param, Types.DOUBLE));
	}

	public void setIntegerParam(String param) {
		this.declareParameter(new SqlParameter(param, Types.INTEGER));
	}

	public void setVarcharOutParam(String param) {
		this.declareParameter(new SqlOutParameter(param, Types.VARCHAR));
	}

	public void setDoubleOutParam(String param) {
		this.declareParameter(new SqlOutParameter(param, Types.DOUBLE));
	}

	public void setIntegerOutParam(String param) {
		this.declareParameter(new SqlOutParameter(param, Types.INTEGER));
	}

	public void setInParam(String param,int valueType)
	{
		this.declareParameter(new SqlParameter(param, valueType));

	}

	public void setOutParam(String param,int valueType)
	{
		this.declareParameter(new SqlOutParameter(param, valueType));

	}

	public void setReturnParam(String param, RowMapper rowMapper) {
		this.declareParameter(new SqlReturnResultSet(param,rowMapper));
	}

}

写一个測试:

public void test2() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"classpath:spring/applicationContext-base.xml");
		JdbcTemplate jdbc = (JdbcTemplate) context.getBean("jdbcTemplate");

		StoredProcedureTemplate template = new StoredProcedureTemplate();

		template.setJdbcTemplate(jdbc);
		template.setSql("testproc");
		//注意有返回结果集的时候,第一个參数必须设置为返回结果集參数,不然会报错。
		template.setReturnParam("rows", new FirstReportRowMapper());

		template.setIntegerParam("@parama");

		template.setValue("@parama", 9);

		Map map = template.execute();
		Object o = map.get("rows");
		List<FirstReportVO> list = (List<FirstReportVO>)o;
		for (FirstReportVO vo : list) {
			System.out.println(vo.getSortID()+","+vo.getSortName());
		}
	}

唯一要注意的地方就是測试里备注的地方,我測试了好久才发现,郁闷的一塌糊涂,老是莫名其妙的错,原来将參数互换一下位置就OK了,比方你把

template.setIntegerParam("@parama");写在前面然后再写template.setReturnParam("rows", new FirstReportRowMapper());的话,就会报空指针错误。

这个“rows”能够随便取名字,只是以下map.get("rows")要和你取的名字一致,由于StoredProcedureTemplate会将结果集以这个名字保存在map中返回。

还有要注意的就是设置sqlparamter的顺序要和存储过程中參数的顺序要一致,不然也会报错.

时间: 2024-10-08 10:49:42

spring 中StoredProcedure的使用方法的相关文章

Spring中配置log4j的方法

Spring中使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径.3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path. web.xml中的设定 在web.xml中的详细设定如下: <context-param> <param-name>

Spring中RestTemplate的使用方法

一.REST在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增.删.改.查名词,就是网络中的各种资源传统的非REST风格的请求方式是把动词和名词全都放在url中.例如,对设备的操作可能是这样的:添加设备:http://test/device/add删除设备:http://test/device/delete修改设备:http://test/device/modify查找设备:http://test/device/find这样就存在一个规范的问

spring 中StoredProcedure的用法--转载

StoredProcedure是一个抽象类,必须写一个子类来继承它,这个类是用来简化JDBCTemplate执行存储过程操作的. 首先我们写一个实现类: package com.huaye.framework.dao; import java.sql.Types; import java.util.HashMap; import java.util.Map; import org.springframework.jdbc.core.RowMapper; import org.springfram

Spring中@Async注解实现“方法”的异步调用

简单介绍: Spring为任务调度与异步方法执行提供了注解支持.通过在方法上设置@Async注解,可使得方法被异步调用.也就是说调用者会在调用时立即返回,而被调用方法的实际执行是交给Spring的TaskExecutor来完成. 开启@Async注解: <task:annotation-driven executor="annotationExecutor" /> <!-- 支持 @Async 注解 --> <task:executor id="

SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名称匹配方法切入点顾问

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- advice 是通知advisor 是顾问 顾问(Advisor) 通知Advice是Spring提供的一种切面(Aspect).但其功能过于简单,只能将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中. 顾问Advisor是Spring提供的另一种切面.其可以完成更为复杂的切面织入功能,能选择性的将增强切面中的部分方法. PointcutAdvisor是顾问的一种,可以指定具体的切入点

Spring 中使用redis缓存方法记录

背景 在平时项目中,可能会有某个条件的查询,会多次进到db里面去查,这样就会重复的查询相同的数据,但是我们的数据又不是需要更改及显示的,这时候就可以用到 方法的缓存了.例如在我们调用微信小程序时,需要获取access_token,并且其有效时间为7200秒,过期后再次获取,我们就可以把获取access_token的方法作为 缓存.以下为我实现的过程记录. 1.重写 RedisSerializer 中的 serialize 和 deserialize 1 public class GenericF

Spring中获取Session的方法汇总

Spring: web.xml <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> 在普通bean中使用: @Autowired private HttpSession session; @Autowired private HttpServletRequest reques

在&quot;Spring&quot;中配编码格式的方法.

在Web.xml中加入如下的代码即可. <filter>          <filter-name>encoding</filter-name>          <filter-class>              org.springframework.web.filter.CharacterEncodingFilter          </filter-class>          <init-param>       

【Spring】详解Spring中Bean的加载

之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,该文之前在小编原文中有发表过,要看原文的可以直接点击原文查看,从之前的例子开始,Spring中加载一个bean的方式: TestBean bean = factory.getBean("testBean"); 来看看getBean(String name)方法源码, @Override public Object getBean(String name) throws BeansException { re