由于项目中想调用存储过程,写了一个调用存储过程公共类;
注意一下:过程名要加数据库访问用户(有权限的用户)
格式为:
(1)dbuser + procedure
(2)dbuser + package + function
基类:
XbaseJdbcDaoImpl.java 的源程序如下:
/**
* 执行存储过程
* @param sql
* @param declaredParameters
* @param inPara
* @return map
*/
public Map executeCall(String sql, List declaredParameters, Map inPara) {
return this.executeCall(sql,declaredParameters,inPara,false);
}
/**
*
* @param sql
* @param declaredParameters
* @param inPara
* @param function true 是调用函数 false 调用过程
* @return map
*/
public Map executeCall(String sql, List declaredParameters, Map inPara,boolean function) {
XbaseStoreProcedure xsp = new XbaseStoreProcedure(this.getJdbcTemplate(),sql,declaredParameters);
xsp.setFunction(function);
return xsp.execute(inPara);
}
/**
* 返回结果集
* @param sql
* @param declaredParameters
* @param inPara
* @return map
*/
public List<HashMap> executeCallResultList(String sql, List declaredParameters, Map inPara){
XbaseStoreProcedure xsp = new XbaseStoreProcedure(this.getJdbcTemplate(),sql);
for(int i=0;i<declaredParameters.size();i++){
SqlParameter parameter = (SqlParameter)declaredParameters.get(i);
if(parameter instanceof SqlOutParameter){
xsp.setOutParameter(parameter.getName(),parameter.getSqlType());
}else xsp.setParameter(parameter.getName(),parameter.getSqlType());
}
xsp.SetInParam(inPara);
xsp.execute();
return xsp.set;
}
XbaseStoreProcedure.java 的源程序
package com.xjj.app.jdbc.xbase;
import org.springframework.jdbc.object.StoredProcedure;
import org.springframework.jdbc.core.*;
import javax.sql.DataSource;
import java.util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created by IntelliJ IDEA.
* User: Administrator_xusg
* Date: 2008-2-21
* Time: 11:34:01
* DESP:
* To change this template use File | Settings | File Templates.
*/
public class XbaseStoreProcedure extends StoredProcedure {
private Map initParameterData = new Hashtable(); //数据传入
private boolean callFunction = false; //是过程还是函数
public ArrayList<HashMap> set = new ArrayList<HashMap>(); //声明一个用于接收结果集的数据结构,其中的元素为row,用map存放
private Map inParam; //输入参数
private RowMapper rm = new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum) throws SQLException {
return null;//不用从存储过程本身获取结果
}
};
//回调方法
private RowMapperResultSetExtractor callback = new RowMapperResultSetExtractor (rm){
public Object extractData(ResultSet rs) throws SQLException{//回调处理
int count = rs.getMetaData().getColumnCount();
String[] header = new String[count];
for(int i=0;i<count;i++)
header[i] = rs.getMetaData().getColumnName(i+1);
while(rs.next()){
HashMap<String,String> row = new HashMap(count+7);
for(int i=0;i<count;i++){
row.put(header[i],rs.getString(i+1));
}
set.add(row);
}
return null;
}
};
//设置输出集的分类(游标)
public void setOutParameter(String column,int type){
declareParameter(new SqlOutParameter(column, type,callback));//利用回调句柄注册输出参数
}
//设置输入值的数据类型
public void setParameter(String column,int type){
declareParameter(new SqlParameter(column, type));
}
public void SetInParam(Map inParam){
this.inParam = inParam;
}
public Map execute() {
compile();
return execute(this.inParam);
}
/**
* 构造存储过程的参数
* @param dataSource
* @param sql
*/
public XbaseStoreProcedure(DataSource dataSource,String sql){
super(dataSource,sql);
this.compile();
}
protected XbaseStoreProcedure(JdbcTemplate jdbcTemplate, String sql) {
setJdbcTemplate(jdbcTemplate);
setSql(sql);
}
/**
*
* @param jdbcTemplate
* @param sql
* @param declareParameterList 输入值及输出值
*/
protected XbaseStoreProcedure(JdbcTemplate jdbcTemplate, String sql,List declareParameterList) {
setJdbcTemplate(jdbcTemplate);
setSql(sql);
for(int i=0;i<declareParameterList.size();i++){
SqlParameter parameter = (SqlParameter)declareParameterList.get(i);
this.declareParameter(parameter);
}
this.compile();
}
public Map getInitParameterData() {
return initParameterData;
}
public void setInitParameterData(Map initParameterData) {
this.initParameterData = initParameterData;
}
public void setCallFunction(boolean callFunction) {
this.callFunction = callFunction;
this.setFunction(callFunction);
}
}
使用实例如下:
package com.xjj.app.jdbc.test;
import com.xjj.app.jdbc.xbase.XbaseJdbcDaoImpl;
import com.xjj.app.jdbc.xbase.DbConfig;
import java.util.*;
import java.sql.Types;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlOutParameter;
import oracle.jdbc.OracleTypes;
/**
* Created by IntelliJ IDEA.
* User: Administrator_xusg
* Date: 2008-2-21
* Time: 14:16:38
* DESP:
* To change this template use File | Settings | File Templates.
*/
public class TestClassDao extends XbaseJdbcDaoImpl {
/**
* create or replace procedure insertValue(vid in varchar,vname in varchar,vemail in varchar) as
begin
insert into callableTest(id,name,email) values(vid,vname,vemail);
end;
*/
public void insert(){
String sql = DbConfig.DBUSRE+".insertValue";
List list = new ArrayList();
list.add(new SqlParameter("id",Types.VARCHAR));
list.add(new SqlParameter("name",Types.VARCHAR));
list.add(new SqlParameter("email", Types.VARCHAR));
Map map = new HashMap();
map.put("id","12121210121212100000");
map.put("name","nameSpring");
map.put("email","emailSpring");
this.executeCall(sql,list,map);
}
/**
* create or replace procedure findvalueById(vid in varchar2,vname out varchar2,vemail out varchar2) as
begin
select t.name,t.email into vname,vemail from callableTest t where t.id= vid;
end;
*/
public void findValueById(){
String sql = DbConfig.DBUSRE+".findvalueById";
List list = new ArrayList();
list.add(new SqlParameter("id",Types.VARCHAR));
list.add(new SqlOutParameter("name",Types.VARCHAR));
list.add(new SqlOutParameter("email",Types.VARCHAR));
Map map = new HashMap();
map.put("id","12121210121212100000");
Map a = this.executeCall(sql,list,map);
System.out.println(""+a.get("name"));
System.out.println(""+a.get("email"));
}
//返回游标
public void findlist(){
String sql = DbConfig.DBUSRE+".text_a2";
List list = new ArrayList();
list.add(new SqlOutParameter("cur_result_out", OracleTypes.CURSOR));
List listresult = this.executeCallResultList(sql,list,new HashMap());
for(int i=0;i<listresult.size();i++){
Map m = (HashMap)listresult.get(i);
Iterator iterator = m.keySet().iterator();
while(iterator.hasNext()){
System.out.println(""+m.get(iterator.next()));
}
}
}
}
分享到:
相关推荐
对于 `P_EMP_SELECT` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程,并将结果集处理到 `List` 集合中。 对于 `P_EMP_ADD` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程...
能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来...只根据输入不同的存储过程名称、参数内容,自动调用不同的存储过程。 已经使用在多个项目中 全开源项目 请放心下载
使用Spring的JdbcTemplate调用Oracle的存储过程
这里,我们将使用MyBatis的SqlSession对象,通过Mapper接口来调用存储过程。 1. 配置MyBatis: 在Spring MVC项目中,你需要配置MyBatis与Spring的整合,这通常涉及到`mybatis-config.xml`,`sqlSessionFactory`和`...
在转换SSH项目到Spring Boot的过程中,遇到了由于连接池默认配置限制(默认连接数为10)导致的问题,即频繁调用存储过程后,数据库连接无法得到正确释放,从而引发项目崩溃。以下是对这三种调用方式的详细解释: 1....
在Spring和MyBatis的集成中,通过MyBatis的SqlSession对象可以调用存储过程。Oracle存储过程是一组预编译的SQL语句,可以在数据库服务器端执行,提供更好的性能和安全性。 1. **无返回值的存储过程**: 当存储过程...
本文将详细介绍如何使用iBATIS调用存储过程,并提供一个简单的示例来说明其过程。 首先,我们需要在数据库中创建一个存储过程。以下是一个Oracle数据库中的存储过程示例: ```sql CREATE OR REPLACE PROCEDURE pp ...
MyBatis作为一款流行的Java持久层框架,提供了调用存储过程的功能。下面将详细介绍如何在MyBatis中配置和使用存储过程。 ### 1. 配置MyBatis XML映射文件 在MyBatis的映射文件(mapper.xml)中,我们需要为存储...
在开发Web应用时,我们经常...以上就是基于"Maven+SpringMVC+Spring+Mybatis"的图片上传、本地存储、显示及调用存储过程的相关知识点,这些内容构成了一个完整的Web应用功能模块,对于开发者来说是非常实用的技术实践。
本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...
java中的springMVC模式调用过程,该图片显示了如果在java中使用springMVC的模式调用数据库过程。
结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...
Spring Data JPA 提供了调用存储过程的能力,使得在Java应用中使用存储过程变得方便。 1. **存储过程** 存储过程是数据库中预编译的SQL语句集合,可以接受参数并返回结果。在本例中,我们有 `test_pkg` 包下的两个...
标题中的“Spring+Jdbc scott用户的调用存储过程”涉及到的是在Java开发中使用Spring框架的JDBC模块来调用数据库的存储过程。在Java应用程序中,Spring JDBC提供了一个简单且有效的方式来处理数据库交互,包括执行...
我们可以通过手动关闭 Session 来释放连接,或者使用第一种方式来调用存储过程,避免手动关闭 Session。 通过本文,我们可以了解到 Spring Boot 调用 Oracle 存储过程的两种方式,并了解到解决问题的过程中遇到的...
在测试方法中,使用Spring提供的JdbcTemplate或NamedParameterJdbcTemplate调用存储过程,然后使用断言(如assertEquals)来验证预期的结果。 总结来说,测试Spring中的存储过程涉及使用Spring的数据访问抽象,如...
3. **使用`jdbcTemplate`调用存储过程**:通过Spring框架提供的`jdbcTemplate`来执行存储过程。`execute()`方法接收两个参数: - `procedure`:存储过程的调用字符串。 - `new CallableStatementCallback()`:这是...
在处理复杂的业务逻辑或需要多次交互的场景下,调用存储过程通常比单独执行多个SQL语句更高效。存储过程还可以接受输入参数,返回输出参数,甚至有中间结果集,这使得它们在数据操作上非常灵活。 在本项目中,...