`
panxy1213
  • 浏览: 791 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于spring存储过程小工具类

阅读更多
对一个一个存储过程来说
  • 传入参数
  • 过程本身
  • 执行结果:结果包含所有结果集(ResultSet)和传出参数(Out)。返回值可以认为是一个特殊的传出参数(Out)

适用数据库sybase 以及类似行为的数据库存储过程。

工具代码,T为结果对象的泛型,P为传入参数泛型
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.support.JdbcUtils;

public abstract class SpCallableStatementCallback<T> implements CallableStatementCallback<T> {

	@Override
	public final T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
		cs.execute();
		T t= this.creatResultObject();
		int resultSetNum = 0;
		while (cs.getMoreResults()) {
			handleResultSet(resultSetNum++, cs, t);
		}
		this.handleOutParameter(cs, t);
		return t;
	}
	
	private void handleResultSet(int resultSetNum, CallableStatement cs, T t) throws SQLException {
		ResultSet rs = cs.getResultSet();
		int rowNum = 0;
		while(rs.next()){
			this.handleResultSetMapping(resultSetNum, rs, rowNum++, t);
		}
		JdbcUtils.closeResultSet(rs);
	}
	
	protected abstract T creatResultObject();
	
	// int resultSetNum,一个存储过程返回多个结果集的时候,这个Num来区分结果集的index。
	protected abstract void handleResultSetMapping(int resultSetNum, ResultSet rs, int rowNum, T t) throws SQLException;
	
	protected abstract void handleOutParameter(CallableStatement cs, T t) throws SQLException;
}




import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;

public abstract class StoreProcedureCallWithParamThreadSafe<P, T> extends SpCallableStatementCallback<T> {
	
	private JdbcTemplate jdbcTemplate;
	
	public StoreProcedureCallWithParamThreadSafe() {
	}
	
	public StoreProcedureCallWithParamThreadSafe(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	protected abstract CallableStatement createCallableStatement(Connection con, P inParamObj) throws SQLException ;

	protected CallableStatementCreator createCallableStatement(final P inParamObj) {
		return new CallableStatementCreator() {
			@Override
			public CallableStatement createCallableStatement(Connection con) throws SQLException {
				return StoreProcedureCallWithParamThreadSafe.this.createCallableStatement(con, inParamObj);
			}
		};
	}
	
	public T call(P inputParameterObject){
		return jdbcTemplate.execute(this.createCallableStatement(inputParameterObject), this);
	}
	
}



使用Sample
数据库创建存储过程,该过程有两个传入参数,一个传出参数,3个结果集(每个只有1行结果),和一个返回值99.
CREATE PROCEDURE dbo.mathtutor2 
@mult1 int, @mult2 int, @result int output 
as 
select @result = @mult1 * @mult2
select 10
select 20
select 30
return 99


传入参数对象
public class TempSpInParam {
	private int a;
	private int b;

	public TempSpInParam(int a, int b) {
		super();
		this.a = a;
		this.b = b;
	}

	@Override
	public String toString() {
		return "TempSpIn [a=" + a + ", b=" + b + "]";
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

}


执行结果对象
public class TempSpResult {
	private int returnVal;
	private int outVal;
	private List<Integer> list = new ArrayList<>();

	@Override
	public String toString() {
		return "SpObj [returnVal=" + returnVal + ", outVal=" + outVal
				+ ", list=" + list + "]";
	}

	public int getReturnVal() {
		return returnVal;
	}

	public void setReturnVal(int returnVal) {
		this.returnVal = returnVal;
	}

	public int getOutVal() {
		return outVal;
	}

	public void setOutVal(int outVal) {
		this.outVal = outVal;
	}

	public List<Integer> getList() {
		return list;
	}

	public void setList(List<Integer> list) {
		this.list = list;
	}

}


过程本身对象
public class TempSp extends StoreProcedureCallWithParamThreadSafe<TempSpInParam, TempSpResult>{
	// 
	private String spSql = "{? = call tempdb..mathtutor2 (?,?,?)}";
	
	@Override
	protected CallableStatement createCallableStatement(Connection con, TempSpInParam inParamObj) throws SQLException {
		CallableStatement cs = con.prepareCall(spSql);
		cs.registerOutParameter(1, java.sql.Types.INTEGER);
		cs.setInt(2, inParamObj.getA());
		cs.setInt(3, inParamObj.getB());
		cs.registerOutParameter(4, java.sql.Types.INTEGER);
		return cs;
	}
	
	@Override
	protected TempSpResult creatResultObject() {
		return new TempSpResult();
	}
	
	// 把所有结果集都放入t list中。这里没有加以区分,实际代码通常应该对resultSetNum 进行case switch,对不同的结果集分别处理。
	@Override
	protected void handleResultSetMapping(int resultSetNum, ResultSet rs, int rowNum, TempSpResult t) throws SQLException {
		System.out.println(String.format("resultSetNum=%s",  resultSetNum));
		t.getList().add(rs.getInt(1));
	}

	@Override
	protected void handleOutParameter(CallableStatement cs, TempSpResult t) throws SQLException {
		t.setReturnVal(cs.getInt(1));
		t.setOutVal(cs.getInt(4));
	}
	
}


Test类
@RunWith(SpringJUnit4ClassRunner.class)
public class TestSample extends GenericTestCase {

	@Autowired
	protected JdbcTemplate jdbcTemplate;

	@Test
	public void test1() {
		TempSp tempSp = new TempSp();
		tempSp.setJdbcTemplate(jdbcTemplate);
		System.out.println(tempSp.call(new TempSpInParam(2, 3)));
	}
	
}


执行结果
resultSetNum=0
resultSetNum=1
resultSetNum=2
SpObj [returnVal=99, outVal=6, list=[10, 20, 30]]
分享到:
评论

相关推荐

    Spring获取ApplicationContext对象工具类的实现方法

    如果是在基于注解的Spring配置中,工具类的实现可能会有所不同,但原理是相似的。 值得注意的是,在Web应用中,通常推荐使用ServletContextListener来初始化ApplicationContext,并将其存储在ServletContext中供...

    java分页工具类,以及基于Struts,Spring,mybatis,jsp中分页的调用及实现

    ### Java分页工具类及其在Struts、Spring、MyBatis和JSP中的应用 #### 一、Java分页概述 在开发Web应用程序时,为了提高用户体验并减轻服务器压力,通常会采用分页技术来展示大量的数据记录。本文将详细介绍一个...

    基于Spring框架的在线商城系统开发

    《基于Spring框架的在线商城系统开发详解》 在信息技术飞速发展的今天,电子商务已经成为现代商业不可或缺的一部分。基于Spring框架的在线商城系统开发是一项常见的实践项目,尤其对于计算机科学和技术的学生而言,...

    测试spring的存储过程

    在测试存储过程中,我们可能需要使用如Eclipse这样的集成开发环境,特别是当文件列表中出现“开发一个基于 JUnit 的存储过程自动化测试的 Eclipse 插件.htm”和“SPTestSuite1.0.zip”时,这可能是一个Eclipse插件,...

    基于spring框架搭建的酒店管理系统.zip

    《构建基于Spring框架的酒店管理系统详解》 在现代信息技术的支持下,酒店管理系统的开发已经成为提升服务质量、优化运营效率的重要手段。本系统以Spring框架为基础,结合Eclipse开发环境和SQL Server数据库,实现...

    基于Spring-boot和bootstrap搭建的商城系统.zip

    《构建基于Spring-boot和Bootstrap的在线商城系统》 在当今数字化时代,电商平台已经成为商业运营的重要组成部分。本项目“基于Spring-boot和bootstrap搭建的商城系统”旨在利用先进的技术栈,为商家提供一个高效、...

    Spring开发工具包

    Spring开发工具包是Java开发人员在构建基于Spring框架的应用程序时不可或缺的一部分。Spring是一个开源的Java平台,它为创建企业级应用提供了全面的框架支持,包括依赖注入、面向切面编程(AOP)、数据访问、Web开发...

    基于spring mvc+hibernate的小型学生管理的maven向明月

    《基于Spring MVC+Hibernate的小型学生管理系统详解》 在IT领域,开发一款高效且功能完备的管理系统是常见的任务。本文将深入探讨一个基于Spring MVC、Spring和Hibernate框架的Maven项目,该系统专注于学生管理,...

    基于Spring Cloud Alibaba的农产品销售管理系统设计与实现.docx

    - **Spring Cloud Alibaba**:提供了一套基于Spring Cloud的分布式服务开发工具包,包括服务发现、配置管理、限流降级等功能。 - **Nacos**:作为服务注册与发现组件,实现服务治理。 - **Sentinel**:流量控制...

    基于Spring Boot,MySQL和vue.js的天气网站

    Spring Boot是Spring框架的一个模块,旨在简化Spring应用的初始搭建以及开发过程。它通过自动配置和starter pom文件,使得开发者无需过多关注基础设置,而是更专注于业务逻辑。Spring Boot的核心特性包括内置的HTTP...

    基于Spring Boot的Nutrition Prediction Expert项目.zip

    # 基于Spring Boot的Nutrition Prediction Expert项目 ## 项目概述 Nutrition Prediction Expert是一个基于Spring Boot的微服务架构项目,专注于...- **common**: 公共模块,包含各种配置类和工具类。 - **gateway**:

    基于Spring MVC+Spring+Mybatis+Mysql 客户关系管理系统 SSM毕业设计

    - Maven是Java项目的构建工具,通过pom.xml文件管理项目依赖,自动化构建过程,包括编译、测试、打包、部署等。 - 本项目的文件结构遵循Maven的约定,如src/main/java存放源代码,src/main/resources存放资源配置...

    基于Spring的Web缓存

    本文将深入探讨如何在基于Spring的Web应用中实现缓存功能,以提升系统的性能和响应速度。 首先,让我们了解什么是缓存。缓存是一种存储技术,用于临时保存常用数据,以便快速访问。在Web应用中,缓存可以减少数据库...

    基于Spring的web框架使用说明

    ### 基于Spring的Web框架使用说明 #### 框架概述 本文档旨在介绍一个基于Spring技术栈构建的Web应用框架的核心组件及其使用方式。该框架采用经典的MVC架构设计模式,通过分层的方式来组织代码,提高系统的可维护性...

    基于Spring Boot的Link Admin管理系统.zip

    基于Spring Boot的Link Admin管理系统 Link Admin 是一套企业级后端系统框架,基于该系统可以快速实现企业级二次开发,提供登录认证,权限验证,访问次数限制等安全措施。以及用户管理、角色管理、权限管理、部门...

    redis操作工具类

    Spring Boot是基于Spring框架的轻量级开发工具,它简化了配置并提供了快速构建应用程序的能力。Spring Boot与Redis结合使用,通过`spring-boot-starter-data-redis`模块,可以轻松地在Spring Boot应用中集成Redis,...

    C#代码生成器源码-基于Spring.NET架构

    【C#代码生成器源码-基于Spring.NET架构】是一个专为C#开发设计的工具,它利用SQLServer数据库作为数据源,并构建于Spring.NET框架之上。Spring.NET是.NET平台上的一种轻量级应用程序框架,它引入了依赖注入...

    Spring的小项目

    最后,Spring Cloud是构建分布式系统的一系列工具集合,包括服务发现、配置管理、断路器模式、智能路由等,它使得基于Spring构建微服务架构变得更加容易。 总的来说,Spring框架通过其丰富的功能和强大的生态系统,...

    java web spring-framework-2.5.6.jar.zip

    7. **Spring Boot**:虽然不是 2.5.6 版本的一部分,但值得一提的是,Spring Boot 是后来推出的一个项目,它简化了基于 Spring 的应用的初始化和配置过程,是现代 Spring 应用的首选启动方式。 8. **Spring ...

    基于Spring,MyBatis 的图书管理系统

    Spring框架的核心包括容器、数据访问/集成、Web、AOP、工具类和测试模块。在本图书管理系统中,Spring作为核心框架,负责管理组件之间的依赖关系,提供事务管理、安全管理等服务。 MyBatis是一个优秀的持久层框架,...

Global site tag (gtag.js) - Google Analytics