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

首先我们写一个实现类:

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

写一个测试:

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

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

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

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

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

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

http://forum.spring.io/forum/spring-projects/data/13984-multiple-calls-to-storedprocedure-using-same-connection

spring 中StoredProcedure的用法--转载的更多相关文章

  1. spring中context:property-placeholder/元素 转载

    spring中context:property-placeholder/元素  转载 1.有些参数在某些阶段中是常量 比如 :a.在开发阶段我们连接数据库时的连接url,username,passwo ...

  2. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  3. Spring 中JCA CCI分析--转载

    转载地址:http://blog.csdn.net/a154832918/article/details/6790612 J2EE提供JCA(Java Connector Architecture)规 ...

  4. Spring中@Cacheable的用法

    在Spring中通过获取MemCachedClient来实现与memcached服务器进行数据读取的方式.不过,在实际开发中,我们往往是通过Spring的@Cacheable来实现数据的缓存的,所以, ...

  5. spring中log4j的使用---转载

    原文链接:http://www.codeceo.com/article/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供 ...

  6. Spring中HibernateCallback的用法(转)

    Hibernate的复杂用法HibernateCallback HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式.Hiber ...

  7. spring 中StoredProcedure的使用方法

    StoredProcedure是一个抽象类,必须写一个子类来继承它,这个类是用来简化JDBCTemplate运行存储过程操作的. 首先我们写一个实现类: package com.huaye.frame ...

  8. Spring中RedirectAttributes的用法

    RedirectAttributes 是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类.他有两种带参的方式: 第一种: redirectAttribut ...

  9. SQL中CASE 的用法 转载

    sql语言中有没有类似C语言中的switch case的语句?? 没有,用case   when   来代替就行了.              例如,下面的语句显示中文年月 select getdat ...

随机推荐

  1. tbody 滚动条

    ARRIVALS TO BRISTOL - ENGLAND FLIGHT CODE FROM STA ETA Notes T3 4264 ISLE OF MAN 11:40 11:42 LANDED ...

  2. 关于css float 属性以及position:absolute 的区别。

    1.float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动.浮动元素会生成一个块级框,而不论它本身是何种元素.div一个典型的块 ...

  3. uboot总结:uboot配置和启动过程3(config.mk分析)

    说明:文件位置:在uboot的目录下,文件名为:config.mk.是一个makefile文件,以后会被主Makefile调用. 它的主要作用的是: (1)具体的设置交叉编译工具链接(主Makefil ...

  4. /proc/sys/net/ipv4/ip_forward

    ip地址分公有地址和私有地址,public address是由INIC(internet network information center)负责,这些ip地址分配给注册并向INIC提出申请的组织机 ...

  5. 大神眼中的React Native--备用

    当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...

  6. Solr4.6从数据库导数据的步骤

    http://blog.csdn.net/bruce128/article/details/17796705 Solr4.6有从数据库导数据的功能.导入步骤如下: 1.将下载下来的solr4.6的di ...

  7. c#获取带有汉字的字符串长度

    不知道大家注意没,用c#下自带的str.Length方法获得字符串str长度的时候,返回的总是字符的个数,但是如果字符串中包含汉字的话,一个汉字是占两个字符长度的,获取的长度值就有了问题. 解决方案: ...

  8. 2B The least round way

    题目大意: 一个n*n的矩阵,从矩阵的左上角开始,每次移动到下面或者右面,移动到右下角结束. 要求走的路径上的所有数字乘起来,乘积得到的值后面的0最少.   #include <iostream ...

  9. 【转】文件读写NDK(或Linux)

    原文网址:http://www.ithao123.cn/content-10709539.html 使用NDK进行文件读写,有利于保存数据的安全性,项目需要,要文件读写从Java中处理搬到Linux平 ...

  10. kafka中对一个topic增加replicas

    是指手动写扩充replicas的配置文件,然后使用工具进行操作. 参考官网site:http://kafka.apache.org/documentation.html#basic_ops_autom ...