`
100Air
  • 浏览: 118627 次
  • 性别: Icon_minigender_1
  • 来自: 海南
社区版块
存档分类
最新评论

spring 调用存储过程

阅读更多
由于项目中想调用存储过程,写了一个调用存储过程公共类;

注意一下:过程名要加数据库访问用户(有权限的用户)
格式为:
(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()));
            }
        }
    }


}

分享到:
评论
3 楼 100Air 2009-08-20  
DbConfig.DBUSRE.findvalueById
其中:
DbConfig.DBUSRE 是数据库用户名(为了方便修改,才这样写),而findvalueById 是存储过程名称
2 楼 100Air 2009-08-20  
DbConfig.DBUSRE.findvalueById
其中:
DbConfig.DBUSRE 是数据用户名(为了方便修改,才这样写),而findvalueById 是存储过程名称
1 楼 itlieying 2009-08-17  
Air,你好,能提供下com.xjj.app.jdbc.xbase.DbConfig吗?
最近我也在研究java调用oracle存储过程,能再提供一些实例吗?

相关推荐

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    对于 `P_EMP_SELECT` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程,并将结果集处理到 `List` 集合中。 对于 `P_EMP_ADD` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来...只根据输入不同的存储过程名称、参数内容,自动调用不同的存储过程。 已经使用在多个项目中 全开源项目 请放心下载

    spring mvc + mybatis 调用mysql 存储过程

    这里,我们将使用MyBatis的SqlSession对象,通过Mapper接口来调用存储过程。 1. 配置MyBatis: 在Spring MVC项目中,你需要配置MyBatis与Spring的整合,这通常涉及到`mybatis-config.xml`,`sqlSessionFactory`和`...

    使用Spring的JdbcTemplate调用Oracle的存储过程

    使用Spring的JdbcTemplate调用Oracle的存储过程

    spring mybatis 调用oracle存储过程

    在Spring和MyBatis的集成中,通过MyBatis的SqlSession对象可以调用存储过程。Oracle存储过程是一组预编译的SQL语句,可以在数据库服务器端执行,提供更好的性能和安全性。 1. **无返回值的存储过程**: 当存储过程...

    Springboot调用Oracle存储过程的几种方式.docx

    在转换SSH项目到Spring Boot的过程中,遇到了由于连接池默认配置限制(默认连接数为10)导致的问题,即频繁调用存储过程后,数据库连接无法得到正确释放,从而引发项目崩溃。以下是对这三种调用方式的详细解释: 1....

    ibatis调用存储过程介绍

    本文将详细介绍如何使用iBATIS调用存储过程,并提供一个简单的示例来说明其过程。 首先,我们需要在数据库中创建一个存储过程。以下是一个Oracle数据库中的存储过程示例: ```sql CREATE OR REPLACE PROCEDURE pp ...

    MyBatis调用存储过程

    MyBatis作为一款流行的Java持久层框架,提供了调用存储过程的功能。下面将详细介绍如何在MyBatis中配置和使用存储过程。 ### 1. 配置MyBatis XML映射文件 在MyBatis的映射文件(mapper.xml)中,我们需要为存储...

    maven+SpringMVC+Spring+Mybatis图片上传本地以及显示+调用存储过程

    在开发Web应用时,我们经常...以上就是基于"Maven+SpringMVC+Spring+Mybatis"的图片上传、本地存储、显示及调用存储过程的相关知识点,这些内容构成了一个完整的Web应用功能模块,对于开发者来说是非常实用的技术实践。

    java中的springMVC模式调用过程

    java中的springMVC模式调用过程,该图片显示了如果在java中使用springMVC的模式调用数据库过程。

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    spring hibernate执行存储过程的例子

    结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...

    Spring Data JPA调用存储过程实例代码

    Spring Data JPA 提供了调用存储过程的能力,使得在Java应用中使用存储过程变得方便。 1. **存储过程** 存储过程是数据库中预编译的SQL语句集合,可以接受参数并返回结果。在本例中,我们有 `test_pkg` 包下的两个...

    Spring+Jdbc scott用户的调用存储过程

    标题中的“Spring+Jdbc scott用户的调用存储过程”涉及到的是在Java开发中使用Spring框架的JDBC模块来调用数据库的存储过程。在Java应用程序中,Spring JDBC提供了一个简单且有效的方式来处理数据库交互,包括执行...

    Spring boot调用Oracle存储过程的两种方式及完整代码

    我们可以通过手动关闭 Session 来释放连接,或者使用第一种方式来调用存储过程,避免手动关闭 Session。 通过本文,我们可以了解到 Spring Boot 调用 Oracle 存储过程的两种方式,并了解到解决问题的过程中遇到的...

    测试spring的存储过程

    在测试方法中,使用Spring提供的JdbcTemplate或NamedParameterJdbcTemplate调用存储过程,然后使用断言(如assertEquals)来验证预期的结果。 总结来说,测试Spring中的存储过程涉及使用Spring的数据访问抽象,如...

    调用存储过程.txt

    3. **使用`jdbcTemplate`调用存储过程**:通过Spring框架提供的`jdbcTemplate`来执行存储过程。`execute()`方法接收两个参数: - `procedure`:存储过程的调用字符串。 - `new CallableStatementCallback()`:这是...

    struts+spring_ibaits+调用Mysql存储过程实现增删改查

    在处理复杂的业务逻辑或需要多次交互的场景下,调用存储过程通常比单独执行多个SQL语句更高效。存储过程还可以接受输入参数,返回输出参数,甚至有中间结果集,这使得它们在数据操作上非常灵活。 在本项目中,...

Global site tag (gtag.js) - Google Analytics