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

spring jdbc模板调用存储过程

    博客分类:
  • java
 
阅读更多

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);
  }
}
分享到:
评论

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

    11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和...

    Spring攻略(第二版 中文高清版).part1

    11.11 使用自定义布局和模板 472 11.11.1 问题 472 11.11.2 解决方案 472 11.11.3 工作原理 472 11.12 使用GORM查询 475 11.12.1 问题 475 11.12.2 解决方案 475 11.12.3 工作原理 475 11.13 创建...

    Spring攻略(第二版 中文高清版).part2

    11.11 使用自定义布局和模板 472 11.11.1 问题 472 11.11.2 解决方案 472 11.11.3 工作原理 472 11.12 使用GORM查询 475 11.12.1 问题 475 11.12.2 解决方案 475 11.12.3 工作原理 475 11.13 创建...

    Spring in Action(第2版)中文版

    5.3.2使用jdbc模板 5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring...

    Spring in Action(第二版 中文高清版).part2

    5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 ...

    Spring in Action(第二版 中文高清版).part1

    5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 ...

    Spring中文帮助文档

    使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...

    Spring API

    使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...

    Spring3.x企业应用开发实战(完整版) part1

    11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和...

    SpringMybatisRedis整合

    项目说明 : 这是一个spring-...定义 : MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 优点 : MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 Mybatis官方文档 : ...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    Java Web程序设计教程

    13.2spring的jdbc 262 13.2.1为什么需要jdbctemplate 262 13.2.2通过jdbcdaosupport使用jdbctemplate 263 13.2.3jdbctemplate提供的常用数据操作方法 264 13.3spring中的事务处理 265 13.3.1spring事务处理概述...

    火炬博客系统7

    JDBC datasources及其它相关的资源,进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法...

    火炬博客系统6

    JDBC datasources及其它相关的资源,进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法...

    火炬博客系统5

    JDBC datasources及其它相关的资源,进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法...

    低清版 大型门户网站是这样炼成的.pdf

    5.12 hibernate调用存储过程 343 5.13 xml数据持久化 346 5.14 小结 348 第6章 充分利用spring 2.5的ioc利器统管bean世界 349 6.1 java程序员的春天厚礼—spring 2.5 349 6.1.1 爱上spring 2.5的十大理由 350 ...

    java开源包1

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

    java开源包11

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包2

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

Global site tag (gtag.js) - Google Analytics