`
zzc1684
  • 浏览: 1228371 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

使用Spring JdbcTemplate调用存储过程

    博客分类:
  • Jdbc
阅读更多

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

  

Java代码  收藏代码
  1. 1: CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,PARAM2 IN VARCHAR2) AS   
  2.    2: BEGIN  
  3.    3:      INSERT INTO TESTTABLE (ID,NAME) VALUES (PARAM1, PARAM2);  
  4.    4: END TESTPRO;  
  5. Java代码:     
  6.   
  7.    1package com.dragon.test;   
  8.    2import org.springframework.jdbc.core.JdbcTemplate;   
  9.    3public class JdbcTemplateTest {   
  10.    4:   private JdbcTemplate jdbcTemplate;   
  11.    5:   public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {   
  12.    6:   this.jdbcTemplate = jdbcTemplate;   
  13.    7:   }   
  14.    8:   public void test(){   
  15.    9:      this.jdbcTemplate.execute("call testpro('p1','p2')");   
  16.   10:   }   
  17.   11: }   


注:存储过程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代码:

Java代码  收藏代码
  1. public void test() {   
  2.   String param2Value = (String) jdbcTemplate.execute(   
  3.      new CallableStatementCreator() {   
  4.         public CallableStatement createCallableStatement(Connection con) throws SQLException {   
  5.            String storedProc = "{call testpro(?,?)}";// 调用的sql   
  6.            CallableStatement cs = con.prepareCall(storedProc);   
  7.            cs.setString(1"p1");// 设置输入参数的值   
  8.            cs.registerOutParameter(2, OracleTypes.VARCHAR);// 注册输出参数的类型   
  9.            return cs;   
  10.         }   
  11.      }, new CallableStatementCallback() {   
  12.          public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {   
  13.            cs.execute();   
  14.            return cs.getString(2);// 获取输出参数的值   
  15.      }   
  16.   });   
  17. }   


注: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.建立存储过程,如下:

Sql代码  收藏代码
  1. CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,test_cursor out TESTPACKAGE.TEST_CURSOR) IS   
  2. BEGIN   
  3.      OPEN test_cursor FOR SELECT * FROM TESTTABLE;   
  4. END TESTPRO;   


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

Java代码  收藏代码
  1. public void test() {   
  2.   List resultList = (List) jdbcTemplate.execute(   
  3.      new CallableStatementCreator() {   
  4.         public CallableStatement createCallableStatement(Connection con) throws SQLException {   
  5.            String storedProc = "{call testpro(?,?)}";// 调用的sql   
  6.            CallableStatement cs = con.prepareCall(storedProc);   
  7.            cs.setString(1"p1");// 设置输入参数的值   
  8.            cs.registerOutParameter(2, OracleTypes.CURSOR);// 注册输出参数的类型   
  9.            return cs;   
  10.         }   
  11.      }, new CallableStatementCallback() {   
  12.         public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {   
  13.            List resultsMap = new ArrayList();   
  14.            cs.execute();   
  15.            ResultSet rs = (ResultSet) cs.getObject(2);// 获取游标一行的值   
  16.            while (rs.next()) {// 转换每行的返回值到Map中   
  17.               Map rowMap = new HashMap();   
  18.               rowMap.put("id", rs.getString("id"));   
  19.               rowMap.put("name", rs.getString("name"));   
  20.               resultsMap.add(rowMap);   
  21.            }   
  22.            rs.close();   
  23.            return resultsMap;   
  24.         }   
  25.   });   
  26.   for (int i = 0; i < resultList.size(); i++) {   
  27.      Map rowMap = (Map) resultList.get(i);   
  28.      String id = rowMap.get("id").toString();   
  29.      String name = rowMap.get("name").toString();   
  30.      System.out.println("id=" + id + ";name=" + name);   
  31.   }   
  32. }   
分享到:
评论

相关推荐

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

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

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

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

    基于注解的Spring JdbcTemplate

    Spring JdbcTemplate提供了一个面向对象的接口,用于执行SQL查询、更新和存储过程,避免了直接与JDBC API打交道的繁琐工作。它通过异常处理、事务管理以及结果集的自动处理,简化了数据库访问。基于注解的Spring ...

    SpringJdbcTemplate封装工具类

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

    Spring JdbcTemplate 常用方法整理

    本文将深入探讨Spring JdbcTemplate的常用方法,并结合提供的`JsonBean.java`和`JdbcUtils.java`文件,来理解其在实际应用中的使用。 首先,JdbcTemplate的核心功能在于它提供了一系列的方法来执行SQL语句,包括...

    spring jdbcTemplate 注入到servlet

    `JdbcTemplate`的核心功能包括:执行SQL查询、更新、调用存储过程等,同时提供了一套统一的异常处理机制。它通过模板方法模式设计,允许我们在不丢失灵活性的情况下,保持代码的整洁和可读性。 在Spring应用中,`...

    spring jdbctemplate实例

    此外,JdbcTemplate还提供了其他高级功能,如批量操作、分页查询、存储过程调用等。同时,它也支持PreparedStatement,可以防止SQL注入攻击。对于性能要求较高的互联网应用,JdbcTemplate的这些特性使其成为理想的...

    jdbcTemplate分页彻底解决,使用游标滚动

    3. **调用`JdbcTemplate`**:使用`JdbcTemplate`的`callProcedure()`或`execute()`方法执行存储过程,传入`SplitPageResultSetExtractor`实例作为参数。 4. **处理结果**:`ResultSetExtractor`会在内部维护当前页...

    Spring-JdbcTemplate

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

    spring jdbcTemplet demo

    博客中的讲解可能还包括了更多关于JDBCTemplate的高级用法,如批处理、存储过程调用、复杂查询等。在实际项目中,通过结合Spring JDBCTemplate,开发者可以编写出更加优雅、可维护的数据库访问代码,同时充分利用...

    spring hibernate执行存储过程的例子

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

    spring-springMvc-jdbctemplate.rar

    在本项目中,"spring-springMvc-jdbctemplate.rar" 是一个包含了使用Spring框架、Spring MVC和JdbcTemplate实现的Web应用示例。这个压缩包可能包含了一系列的配置文件、源代码和数据库脚本,旨在展示如何整合这些...

    spring自带的jdbcTemplate查询、插入预编译使用

    无论是查询、插入还是调用存储过程,`jdbcTemplate`都能提供简洁且安全的API,使得数据库操作变得更加便捷。在实际开发中,结合自定义的映射器和回调处理器,我们可以构建出高效且灵活的数据库访问层。

    Spring4--3.jdbcTemplate事务

    JdbcTemplate是一个模板类,它封装了常见的JDBC操作,如执行SQL查询、更新和存储过程,避免了手动管理连接、预编译语句和结果集解析等繁琐工作。这大大简化了数据库操作,并减少了代码中的错误。 在Spring4中,事务...

    springmvc JdbcTemplate demo

    SpringMVC是一个强大的Java web应用程序开发框架,它简化了在基于Spring的应用程序中构建MVC(Model-View-Controller)架构的过程。JdbcTemplate是Spring框架的一部分,专门用于简化数据库操作,提供了一种模板方法...

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

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

Global site tag (gtag.js) - Google Analytics