由于项目中想调用存储过程,写了一个调用存储过程公共类;
注意一下:过程名要加数据库访问用户(有权限的用户)
格式为:
(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()));
}
}
}
}
分享到:
相关推荐
Spring JdbcTemplate调用Oracle存储过程输出游标结果集实现增删改查
能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来...只根据输入不同的存储过程名称、参数内容,自动调用不同的存储过程。 已经使用在多个项目中 全开源项目 请放心下载
使用Spring的JdbcTemplate调用Oracle的存储过程
spring mvc + mybatis 调用mysql 存储过程
SSH项目改为Spingboot项目,将项目中部分需要调用存储过程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项目访问数据库超过十次就会挂掉,原因是Springboot...
在已有的spring+mybatis 基本操作oracle数据库的基础上,增加了3个调用存储过程的例子:无返回值、返回结果集、返回多个结果,希望对大家能有所帮助
java中的springMVC模式调用过程,该图片显示了如果在java中使用springMVC的模式调用数据库过程。
怎么使用MyBatis调用存储过程,步骤详细清楚,一看就会配置
用ibatis调用存储过程的介绍,使用java语言进行开发
maven+SpringMVC+Spring+Mybatis图片上传本地以及显示+调用存储过程
本篇文章主要介绍了Spring Data JPA调用存储过程实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
Spring jdbcTemplate调用Oracle存储过程返回List集合
主要给大家介绍了关于Spring boot调用Oracle存储过程的两种方式及完整代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
前几天一直在搞spring+hibernate执行存储过程的技术,在网上查了很多资料没有一个是完全的能执行的,代码简单但,几天时间比较辛苦,所以要分多了点。由于包都太大,所以删掉啦!
使用Java struts+spring_ibaits+调用Mysql存储过程 实现增删改查
call 方法调用存储过程 前 言 1、关于 JdbcTemplate 的介绍、pom 依赖、DI 注入可以参考《Spring JdbcTemplate 模板剖析 之 常用 增删改查》,本文继续介绍 JdbcTemplate 调用数据库的存储过程,虽然 Mysql 也有...
主要介绍了SpringMVC与Mybatis集合实现调用存储过程、事务控制实例,有需要的可以了解一下。
使用J2EE+Spring+Ibatis+JDBC 调用存储过程,并返回结果集的配置详细。 供学习参考。
怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据?接下来通过本文给大家介绍Mybatis传list参数调用oracle存储过程,需要的朋友可以参考下
NULL 博文链接:https://chaoyi.iteye.com/blog/2172553