http://blog.csdn.net/xiao_jun_0820/article/details/7268219

StoredProcedure是一个抽象类,必须写一个子类来继承它,这个类是用来简化JDBCTemplate执行存储过程操作的。

首先我们写一个实现类:

[java] view plaincopyprint?
  1. package com.huaye.framework.dao;
  2. import java.sql.Types;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import org.springframework.jdbc.core.RowMapper;
  6. import org.springframework.jdbc.core.SqlOutParameter;
  7. import org.springframework.jdbc.core.SqlParameter;
  8. import org.springframework.jdbc.core.SqlReturnResultSet;
  9. import org.springframework.jdbc.object.StoredProcedure;
  10. /**
  11. * Name:StoredProcedureTemplate User: HP Date: 2007-7-21 Time: 7:40:01
  12. * Description:
  13. */
  14. public class StoredProcedureTemplate extends StoredProcedure {
  15. private HashMap<String, Object> map = new HashMap<String, Object>();
  16. public StoredProcedureTemplate() {
  17. super();
  18. }
  19. public HashMap getMap()
  20. {
  21. return this.map;
  22. }
  23. public void setValue(String key, Object obj) {
  24. map.put(key, obj);
  25. }
  26. public Map execute() {
  27. if (this.getSql() == null || this.getSql().equals(""))
  28. return null;
  29. this.compile();
  30. return execute(map);
  31. }
  32. public void setVarcharParam(String param) {
  33. this.declareParameter(new SqlParameter(param, Types.VARCHAR));
  34. }
  35. public void setDoubleParam(String param) {
  36. this.declareParameter(new SqlParameter(param, Types.DOUBLE));
  37. }
  38. public void setIntegerParam(String param) {
  39. this.declareParameter(new SqlParameter(param, Types.INTEGER));
  40. }
  41. public void setVarcharOutParam(String param) {
  42. this.declareParameter(new SqlOutParameter(param, Types.VARCHAR));
  43. }
  44. public void setDoubleOutParam(String param) {
  45. this.declareParameter(new SqlOutParameter(param, Types.DOUBLE));
  46. }
  47. public void setIntegerOutParam(String param) {
  48. this.declareParameter(new SqlOutParameter(param, Types.INTEGER));
  49. }
  50. public void setInParam(String param,int valueType)
  51. {
  52. this.declareParameter(new SqlParameter(param, valueType));
  53. }
  54. public void setOutParam(String param,int valueType)
  55. {
  56. this.declareParameter(new SqlOutParameter(param, valueType));
  57. }
  58. public void setReturnParam(String param, RowMapper rowMapper) {
  59. this.declareParameter(new SqlReturnResultSet(param,rowMapper));
  60. }
  61. }

package com.huaye.framework.dao; import java.sql.Types; import java.util.HashMap; import java.util.Map; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SqlOutParameter; import org.springframework.jdbc.core.SqlParameter; import org.springframework.jdbc.core.SqlReturnResultSet; import org.springframework.jdbc.object.StoredProcedure; /** * Name:StoredProcedureTemplate User: HP Date: 2007-7-21 Time: 7:40:01 * Description: */ public class StoredProcedureTemplate extends StoredProcedure { private HashMap<String, Object> map = new HashMap<String, Object>(); public StoredProcedureTemplate() { super(); } public HashMap getMap() { return this.map; } public void setValue(String key, Object obj) { map.put(key, obj); } public Map execute() { if (this.getSql() == null || this.getSql().equals("")) return null; this.compile(); return execute(map); } public void setVarcharParam(String param) { this.declareParameter(new SqlParameter(param, Types.VARCHAR)); } public void setDoubleParam(String param) { this.declareParameter(new SqlParameter(param, Types.DOUBLE)); } public void setIntegerParam(String param) { this.declareParameter(new SqlParameter(param, Types.INTEGER)); } public void setVarcharOutParam(String param) { this.declareParameter(new SqlOutParameter(param, Types.VARCHAR)); } public void setDoubleOutParam(String param) { this.declareParameter(new SqlOutParameter(param, Types.DOUBLE)); } public void setIntegerOutParam(String param) { this.declareParameter(new SqlOutParameter(param, Types.INTEGER)); } public void setInParam(String param,int valueType) { this.declareParameter(new SqlParameter(param, valueType)); } public void setOutParam(String param,int valueType) { this.declareParameter(new SqlOutParameter(param, valueType)); } public void setReturnParam(String param, RowMapper rowMapper) { this.declareParameter(new SqlReturnResultSet(param,rowMapper)); } }

写一个测试:

[java] view plaincopyprint?
  1. public void test2() {
  2. ApplicationContext context = new ClassPathXmlApplicationContext(
  3. "classpath:spring/applicationContext-base.xml");
  4. JdbcTemplate jdbc = (JdbcTemplate) context.getBean("jdbcTemplate");
  5. StoredProcedureTemplate template = new StoredProcedureTemplate();
  6. template.setJdbcTemplate(jdbc);
  7. template.setSql("testproc");
  8. //注意有返回结果集的时候,第一个参数必须设置为返回结果集参数,不然会报错。
  9. template.setReturnParam("rows", new FirstReportRowMapper());
  10. template.setIntegerParam("@parama");
  11. template.setValue("@parama", 9);
  12. Map map = template.execute();
  13. Object o = map.get("rows");
  14. List<FirstReportVO> list = (List<FirstReportVO>)o;
  15. for (FirstReportVO vo : list) {
  16. System.out.println(vo.getSortID()+","+vo.getSortName());
  17. }
  18. }

public void test2() { ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:spring/applicationContext-base.xml"); JdbcTemplate jdbc = (JdbcTemplate) context.getBean("jdbcTemplate"); StoredProcedureTemplate template = new StoredProcedureTemplate(); template.setJdbcTemplate(jdbc); template.setSql("testproc"); //注意有返回结果集的时候,第一个参数必须设置为返回结果集参数,不然会报错。 template.setReturnParam("rows", new FirstReportRowMapper()); template.setIntegerParam("@parama"); template.setValue("@parama", 9); Map map = template.execute(); Object o = map.get("rows"); List<FirstReportVO> list = (List<FirstReportVO>)o; for (FirstReportVO vo : list) { System.out.println(vo.getSortID()+","+vo.getSortName()); } }

唯一要注意的地方就是测试里备注的地方,我测试了好久才发现,郁闷的一塌糊涂,老是莫名其妙的错,原来将参数互换一下位置就OK了,比如你把

template.setIntegerParam("@parama");写在前面然后再写template.setReturnParam("rows", new FirstReportRowMapper());的话,就会报空指针错误。

这个“rows”可以随便取名字,不过下面map.get("rows")要和你取的名字一致,因为StoredProcedureTemplate会将结果集以这个名字保存在map中返回。

还有要注意的就是设置sqlparamter的顺序要和存储过程中参数的顺序要一致,不然也会报错.

=======

http://www.w3china.org/blog/more.asp?name=hongrui&id=5156

[java语言]spring对oracle的clob和StoredProcedure 的处理
原创空间

邢红瑞 发表于 2005-4-21 9:16:20

使用spring后发现和oracle的驱动有了不解之缘,最初是spring的jdbc存取oracle的clob字段,出现

org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Io 异常: Software caused connection abort: socket write error

问了Juergen Hoeller几次,也没有知道原因所在。只有加入了hibernate解决此问题,hibernate如何解决oracle的clob字段,看我以前的帖子(http://blogger.org.cn/blog/more.asp?name=hongrui&id=1171)。

后来看到agilejava也遇到这类问题,原来是ojdbc14.jar驱动的问题,改为9.2.0.5.0,一切OK了。相关blog(http://agilejava.blogbus.com/logs/2005/02/1031034.html)

因为现在大量用到存储过程,打算使用spring的StoredProcedure 进行操作,发现运行到SQLErrorCodes loaded: [DB2, HSQL, MS-SQL, MySQL, Oracle, Informix, PostgreSQL, Sybase] 就停了,没有办法,问了Thomas Risberg,他说程序没有错误,我当时就晕了,后来听说虎子做过类似的工作,代码给虎子看,也说没错,而且在它那里运行正常,我生气了。听从他的建议,加入spring源码调试,也不知道问题所在。认为是数据库的问题,换了台数据库还是不行。最后把防火墙撤掉,让虎子直接访问数据库,他那里一切正常。问题明朗了,数据库一样的,代码一样的,唯一不同的是jdk和oracle驱动,他的jdk1.425,我得1.421,差别不大,那就是驱动的问题,我换了以前用的ojdbc14.jar,现在用的版本10.1.0.2.0,换到9.0.2.0.0,一切OK,此时,我已经出离愤怒了,建议oracle驱动最好是自己命名,把文件名加上版本信息,要不会死人的。

下面是我作测试的PLSQL代码

CREATE OR REPLACE package chapter_13 as
 TYPE rs IS REF CURSOR ;
procedure founder(oFields out rs);

end;
/CREATE OR REPLACE package body chapter_13 as

PROCEDURE founder(oFields out rs) IS
BEGIN
  open oFields for
   select * from dept;
END founder;
end;
java代码

package springtest;

import java.sql.*;
import java.util.*;

import javax.sql.*;
import oracle.jdbc.driver.OracleTypes;
import org.springframework.jdbc.core.*;
import org.springframework.jdbc.datasource.*;
import org.springframework.jdbc.object.*;

public class TestDao {
    public static void main(String[] args) throws Exception {
        new TestDao().execute();
    }

public void execute() throws Exception {
        DataSource ds = new DriverManagerDataSource(
                "oracle.jdbc.driver.OracleDriver",
                "jdbc:oracle:thin:@localhost:1521:mydb",
                "scott", "tiger");

DemoStoredProcedure proc = new DemoStoredProcedure(ds);
        Map params = new HashMap();

proc.execute(params);

}

private class DemoStoredProcedure extends StoredProcedure {
        public static final String SQL = "chapter_13.founder";

public DemoStoredProcedure(DataSource ds) {
            setDataSource(ds);
            setSql(SQL);
            setFunction(false);

declareParameter(
                    new SqlOutParameter(
                            "obrief", OracleTypes.CURSOR, new RowMapper() {
                public Object mapRow(ResultSet rs, int rowNum) throws
                        SQLException {
                    System.out.println(rs.getString(1));

return rs.getString(1);
                }
            }
            ));

compile();
        }
    }

}

spring storedProcedure 使用相关推荐

  1. spring访问oracle函数,spring调用带参数的oracle函数应注意的问题

    spring可以方便的访问oracle的存储过程.函数. spring文档举了一个访问sysdate的例子,它不需要输入参数,使用如下: public class TestStoredProcedur ...

  2. Spring高级程序设计(Spring框架创始人倾情推荐的权威开发指南)

    Spring高级程序设计(Spring框架创始人倾情推荐的权威开发指南) 市场价 :¥99.00 会员价 : ¥74.25(75折) 样章免费试读:http://www.china-pub.com/1 ...

  3. spring源码分析之spring-jdbc模块详解

    0 概述 Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作.下表描述了哪些是spring帮助我们做好的,哪些是我们要做的. Action  Spring  You ...

  4. Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问

    第 10 章 使用JDBC进行数据访问 10.1. 简介 Spring提供的JDBC抽象框架由core, datasource,object和support四个不同的包组成. 就和它名字的暗示一样,o ...

  5. 使用Spring JDBC进行数据访问 (JdbcTemplate/NamedParameterJdbcTemplate/SimpleJdbcTemplate/SimpleJdbcCall/Stor)

    http://www.cnblogs.com/webcc/archive/2012/04/11/2442680.html 使用Spring JDBC进行数据访问 11.1. 简介 Spring JDB ...

  6. Spring 4 官方文档学习(十)数据访问之JDBC

    说明:未修订版,阅读起来极度困难 1.Spring框架JDBC的介绍 Spring JDBC - who does what? 动作 Spring 你 定义连接参数   是 打开连接 是   指定SQ ...

  7. Spring.NET 中的 ADO.NET 数据访问的示例

    Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...

  8. Spring 事务传播原理及数据库事务操作原理

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 先看看 Spring 事务的基础配置 <beans xmlns="http://www.springframework.org/ ...

  9. Spring源代码解析

    我们看看Spring中的事务处理的代码,使用Spring管理事务有声明式和编程式两种方式,声明式事务处理通过AOP的实现把事物管理代码作为方面封装来横向插入到业务代码中,使得事务管理 代码和业务代码解 ...

最新文章

  1. PostgreSQL SystemTap on Linux 转
  2. ThreadLocal怎么实现线程隔离的?可见性问题?为什么要重新定义一个threadLocalHashCode?为什么有内存泄露?弱引用又是什么?
  3. mysql的一些初步使用!mysqlcheck mysqladmin 建立删除修改表,库,等
  4. 推荐阅读《赢在下班后》
  5. for ie无效 in js_关于js中for in的缺陷浅析
  6. 浅析 Sunday 算法
  7. 大厂必备!不断提升自己创造溢价的能力
  8. DCL 管理权限 mysql
  9. OO模式-Composite
  10. 精锐教育创始人张熙辞任CEO 李晓明接任
  11. 程序解析excel中的图片_Excel表格中链接图片操作方法,以后查看图片点点鼠标就可以了...
  12. ASP.NET中Http请求处理流程
  13. torch中permute()函数用法
  14. 64位操作系统安装PLSQL Developer
  15. 中国 vs 卡塔尔 一场幸运的比赛
  16. 苦口婆心一考拉|向沉迷游戏的中(大)学生讲解内存和磁盘
  17. 坪效是传统超市的5倍以上!京东首家线下生鲜超市7FRESH开业
  18. [Vmware]VCSA部署及遇到的问题
  19. 免费领取百度云盘2048G永久空间,永久离线下载特权
  20. javascript 代码获取 QQ 群成员

热门文章

  1. 2014/Province_Java_B/2/调和级数
  2. 手误【删库】 == 跑路,不存在的 ——删瓦辛格
  3. 《数据库原理与应用》(第三版) 第7章 索引和视图 基础 习题参考答案
  4. 排序算法 —— 选择排序
  5. 【机器视觉】 dev_set_paint算子
  6. 【Qt】MainWindow窗口状态栏
  7. 【物联网】 ESP8266 Ubuntu开发环境的搭建
  8. 锦州中学高考2021成绩查询,锦州高中成绩排名2021,锦州中考分数线排行榜
  9. 最小覆盖字串—leetcode76
  10. /MD, /MDD, /ML, /MT,/MTD(使用运行时库)