`
kanpiaoxue
  • 浏览: 1777764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,但可惜只能用于jdk1.5的环境,无法再jdk1.4环境下使用,而JdbcTemplate则完全适用于jdk1.4下的环境,下面列出使用JdbcTemplate调用Oracle存储过程的一些方法:

一) 无返回值的存储过程调用

存储过程:  

CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,PARAM2 IN VARCHAR2) AS

BEGIN

    INSERT INTO TESTTABLE (ID,NAME) VALUES (PARAM1, PARAM2);

END TESTPRO;

 

Java代码:   

package com.dragon.test;

import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTemplateTest {

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

        this.jdbcTemplate = jdbcTemplate;

    }

    public void test(){

        this.jdbcTemplate.execute("call testpro('p1','p2')");

    }

}

注:存储过程TESTPRO中用到了表TESTTABLE(ID, NAME),需事先建好.

 

二)有返回值的存储过程(非结果集)   

存储过程:   

CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,PARAM2 OUT VARCHAR2) AS   

BEGIN    

    SELECT INTO PARAM2 FROM TESTTABLE WHERE ID= PARAM1;    

END TESTPRO;

 

Java代码:

public void test() {

    String param2Value = (String) jdbcTemplate.execute(

        new CallableStatementCreator() {

            public CallableStatement createCallableStatement(Connection con) throws SQLException {

                String storedProc = "{call testpro(?,?)}";// 调用的sql

                CallableStatement cs = con.prepareCall(storedProc);

                cs.setString(1, "p1");// 设置输入参数的值

                cs.registerOutParameter(2, OracleTypes.VARCHAR);// 注册输出参数的类型

                return cs;

            }

        }, new CallableStatementCallback() {

            public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {

                cs.execute();

                return cs.getString(2);// 获取输出参数的值

        }

    });

}

注:cs.getString(2)中的数值2是存储过程中的out列对应的索引值(第一个参数索引为1,如此类推) 

 

三)有返回值的存储过程(结果集)     

因oracle存储过程所有返回值都是通过out参数返回的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage,分两部分:   

1.建一个程序包,如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE AS

    TYPE TEST_CURSOR IS REF CURSOR;

END TESTPACKAGE;

2.建立存储过程,如下:

CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,test_cursor out TESTPACKAGE.TEST_CURSOR) IS

BEGIN

     OPEN test_cursor FOR SELECT * FROM TESTTABLE;

END TESTPRO;

可以看到,列表是通过把游标作为一个out参数来返回的。   

 

Java代码:

public void test() {

    List resultList = (List) jdbcTemplate.execute(

        new CallableStatementCreator() {

            public CallableStatement createCallableStatement(Connection con) throws SQLException {

                String storedProc = "{call testpro(?,?)}";// 调用的sql

                CallableStatement cs = con.prepareCall(storedProc);

                cs.setString(1, "p1");// 设置输入参数的值

                cs.registerOutParameter(2, OracleTypes.CURSOR);// 注册输出参数的类型

                return cs;

            }

        }, new CallableStatementCallback() {

            public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {

                List resultsMap = new ArrayList();

                cs.execute();

                ResultSet rs = (ResultSet) cs.getObject(2);// 获取游标一行的值

                while (rs.next()) {// 转换每行的返回值到Map中

                    Map rowMap = new HashMap();

                    rowMap.put("id", rs.getString("id"));

                    rowMap.put("name", rs.getString("name"));

                    resultsMap.add(rowMap);

                }

                rs.close();

                return resultsMap;

            }

    });

    for (int i = 0; i < resultList.size(); i++) {

        Map rowMap = (Map) resultList.get(i);

        String id = rowMap.get("id").toString();

        String name = rowMap.get("name").toString();

        System.out.println("id=" + id + ";name=" + name);

    }

}

 

//-----------  备注:引用自: http://rongjih.blog.163.com/blog/static/335744612010313019317/

-- http://hi.baidu.com/air6355/blog/item/6874fe1c408f886ef624e4ae.html

 

分享到:
评论

相关推荐

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

    使用 Spring JdbcTemplate 调用 Oracle 存储过程实现 CRUD 在本文中,我们将讨论如何使用 Spring JdbcTemplate 调用 Oracle 存储过程来实现 CRUD(Create、Read、Update、Delete)操作。我们将首先编写 Oracle 存储...

    SpringJdbcTemplate封装工具类

    SpringJdbcTemplate是一个模板类,它提供了大量的方法来执行SQL查询、更新、存储过程等操作。这些方法会自动处理JDBC相关的资源关闭、异常转换等细节,使得代码更加整洁和健壮。 2. **数据库自适应** Spring...

    Spring JdbcTemplate

    这样,整个应用就可以通过Spring的依赖注入机制来获取并使用JdbcTemplate实例。 例如,一个简单的`applicationContext.xml`配置片段可能如下: ```xml &lt;bean id="dataSource" class="org.springframework.jdbc....

    Spring访问传入数组参数的Oracle存储过程

    总的来说,理解如何在Spring中正确地调用Oracle存储过程并传递数组参数是提高应用程序效率和数据库操作灵活性的重要技能。这涉及到了数据库设计、Java编程、Spring框架的使用以及对Oracle特定特性的掌握。通过上述...

    Spring-JdbcTemplate

    - `call`:用于执行存储过程调用。 通过这些方法,开发者可以轻松地进行数据库操作,无需关注底层的资源管理和异常处理,从而提高了开发效率和代码质量。 总之,Spring-JdbcTemplate通过其简洁的API和强大的功能,...

    Oracle + jdbcTemplate + Spring + Java + Flex 实现分页

    在Java端,可以利用Spring框架整合jdbcTemplate来调用Oracle存储过程。这里主要涉及以下步骤: 1. **配置数据源**:在Spring的配置文件中定义数据源。 2. **定义DAO层**:在DAO层定义方法,用于调用存储过程。 3. *...

    Oracle + jdbcTemplate + Spring + Java + Flex 实现分页.docx

    2. 使用Spring的jdbcTemplate调用存储过程,处理输入输出参数。 3. 将存储过程返回的数据在Java后端进行处理,封装成适合前端的数据结构。 4. Flex前端通过HTTP服务或AMF获取数据,展示在DataGrid中,并实现分页导航...

    spring-springMvc-jdbctemplate.rar

    总的来说,这个项目展示了如何使用Spring、Spring MVC和JdbcTemplate搭建一个基于Java的Web应用,同时利用Oracle作为后端数据库和Redis作为缓存系统。通过学习这个示例,开发者可以了解到如何整合这些技术来构建高效...

    oracle_spring

    除此之外,文件可能还会涵盖Oracle的高级特性,如存储过程、触发器、游标、PL/SQL块的使用,以及如何在Spring框架中调用这些特性。 将Spring与Oracle结合使用时,开发者通常会利用Spring的JdbcTemplate或...

    springboot双数据源(oracle,mysql).rar

    本项目“springboot双数据源(oracle,mysql).rar”显然是一个使用SpringBoot实现多数据源的例子,允许应用程序同时连接并操作Oracle和MySQL两个数据库。以下将详细介绍实现这一功能的关键知识点。 1. **SpringBoot...

    SpringBoot操作多数据源(JPA+JdbcTemplate)

    本篇文章将探讨如何在Spring Boot中利用JPA(Java Persistence API)和JdbcTemplate来实现多数据源的管理,同时使用HikariCP作为高效的数据源连接池。 首先,让我们理解一下关键概念: 1. **Spring Boot**: 它是...

    springboot集成oracle

    最后,对于复杂的SQL查询,可以使用`@Query`注解配合JPA Repository,或者通过`@Procedure`调用存储过程。 总之,Spring Boot集成Oracle数据库涉及多个步骤,包括引入依赖、配置数据库连接、编写DAO层代码、事务...

    sql存储过程

    `oracle_存储过程实例.doc`和`oracle存储过程学习经典[语法+实例+调用].doc`可能是关于如何在Oracle中创建、修改和执行存储过程的文档,包括定义输入输出参数、使用游标、异常处理等内容。`oracle存储过程超详细使用...

    SpringJDBC工程对应Jar包

    `JdbcTemplate`通过封装常见的JDBC操作,如执行SQL查询、更新、调用存储过程等,避免了手动管理连接、结果集解析等繁琐工作,提高了代码的可读性和可维护性。开发者只需提供SQL语句和参数,`JdbcTemplate`会自动处理...

    jdbcTemplate需要用到的jar包.zip

    4. **调用JdbcTemplate方法**:使用`JdbcTemplate`提供的方法执行SQL,例如`query()`执行查询,`update()`执行插入、更新或删除。 5. **处理结果**:对于查询操作,`JdbcTemplate`会返回一个结果集,你可以通过`...

    JdbcTemplate操作总结

    接口定义了业务操作,实现类则通过JdbcTemplate调用对应的方法。例如: ```java public interface UserRepository { User findById(int id); List&lt;User&gt; findAll(); void save(User user); } public class ...

    idea配置maven+Springboot+mybatis+oracle

    以上就是Idea配置Maven、Spring Boot、MyBatis和Oracle的完整过程。通过这些步骤,你可以构建一个功能完善的Java Web项目,实现对Oracle数据库的操作。在实际开发中,还需要注意异常处理、日志记录、安全性配置等多...

Global site tag (gtag.js) - Google Analytics