对一个一个存储过程来说
- 传入参数
- 过程本身
- 执行结果:结果包含所有结果集(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配置中,工具类的实现可能会有所不同,但原理是相似的。 值得注意的是,在Web应用中,通常推荐使用ServletContextListener来初始化ApplicationContext,并将其存储在ServletContext中供...
### Java分页工具类及其在Struts、Spring、MyBatis和JSP中的应用 #### 一、Java分页概述 在开发Web应用程序时,为了提高用户体验并减轻服务器压力,通常会采用分页技术来展示大量的数据记录。本文将详细介绍一个...
《基于Spring框架的在线商城系统开发详解》 在信息技术飞速发展的今天,电子商务已经成为现代商业不可或缺的一部分。基于Spring框架的在线商城系统开发是一项常见的实践项目,尤其对于计算机科学和技术的学生而言,...
在测试存储过程中,我们可能需要使用如Eclipse这样的集成开发环境,特别是当文件列表中出现“开发一个基于 JUnit 的存储过程自动化测试的 Eclipse 插件.htm”和“SPTestSuite1.0.zip”时,这可能是一个Eclipse插件,...
《构建基于Spring框架的酒店管理系统详解》 在现代信息技术的支持下,酒店管理系统的开发已经成为提升服务质量、优化运营效率的重要手段。本系统以Spring框架为基础,结合Eclipse开发环境和SQL Server数据库,实现...
《构建基于Spring-boot和Bootstrap的在线商城系统》 在当今数字化时代,电商平台已经成为商业运营的重要组成部分。本项目“基于Spring-boot和bootstrap搭建的商城系统”旨在利用先进的技术栈,为商家提供一个高效、...
Spring开发工具包是Java开发人员在构建基于Spring框架的应用程序时不可或缺的一部分。Spring是一个开源的Java平台,它为创建企业级应用提供了全面的框架支持,包括依赖注入、面向切面编程(AOP)、数据访问、Web开发...
《基于Spring MVC+Hibernate的小型学生管理系统详解》 在IT领域,开发一款高效且功能完备的管理系统是常见的任务。本文将深入探讨一个基于Spring MVC、Spring和Hibernate框架的Maven项目,该系统专注于学生管理,...
- **Spring Cloud Alibaba**:提供了一套基于Spring Cloud的分布式服务开发工具包,包括服务发现、配置管理、限流降级等功能。 - **Nacos**:作为服务注册与发现组件,实现服务治理。 - **Sentinel**:流量控制...
Spring Boot是Spring框架的一个模块,旨在简化Spring应用的初始搭建以及开发过程。它通过自动配置和starter pom文件,使得开发者无需过多关注基础设置,而是更专注于业务逻辑。Spring Boot的核心特性包括内置的HTTP...
# 基于Spring Boot的Nutrition Prediction Expert项目 ## 项目概述 Nutrition Prediction Expert是一个基于Spring Boot的微服务架构项目,专注于...- **common**: 公共模块,包含各种配置类和工具类。 - **gateway**:
- Maven是Java项目的构建工具,通过pom.xml文件管理项目依赖,自动化构建过程,包括编译、测试、打包、部署等。 - 本项目的文件结构遵循Maven的约定,如src/main/java存放源代码,src/main/resources存放资源配置...
本文将深入探讨如何在基于Spring的Web应用中实现缓存功能,以提升系统的性能和响应速度。 首先,让我们了解什么是缓存。缓存是一种存储技术,用于临时保存常用数据,以便快速访问。在Web应用中,缓存可以减少数据库...
### 基于Spring的Web框架使用说明 #### 框架概述 本文档旨在介绍一个基于Spring技术栈构建的Web应用框架的核心组件及其使用方式。该框架采用经典的MVC架构设计模式,通过分层的方式来组织代码,提高系统的可维护性...
基于Spring Boot的Link Admin管理系统 Link Admin 是一套企业级后端系统框架,基于该系统可以快速实现企业级二次开发,提供登录认证,权限验证,访问次数限制等安全措施。以及用户管理、角色管理、权限管理、部门...
Spring Boot是基于Spring框架的轻量级开发工具,它简化了配置并提供了快速构建应用程序的能力。Spring Boot与Redis结合使用,通过`spring-boot-starter-data-redis`模块,可以轻松地在Spring Boot应用中集成Redis,...
【C#代码生成器源码-基于Spring.NET架构】是一个专为C#开发设计的工具,它利用SQLServer数据库作为数据源,并构建于Spring.NET框架之上。Spring.NET是.NET平台上的一种轻量级应用程序框架,它引入了依赖注入...
最后,Spring Cloud是构建分布式系统的一系列工具集合,包括服务发现、配置管理、断路器模式、智能路由等,它使得基于Spring构建微服务架构变得更加容易。 总的来说,Spring框架通过其丰富的功能和强大的生态系统,...
7. **Spring Boot**:虽然不是 2.5.6 版本的一部分,但值得一提的是,Spring Boot 是后来推出的一个项目,它简化了基于 Spring 的应用的初始化和配置过程,是现代 Spring 应用的首选启动方式。 8. **Spring ...
Spring框架的核心包括容器、数据访问/集成、Web、AOP、工具类和测试模块。在本图书管理系统中,Spring作为核心框架,负责管理组件之间的依赖关系,提供事务管理、安全管理等服务。 MyBatis是一个优秀的持久层框架,...