spring storedProcedure 使用

spring storedProcedure 使用http://blog.csdn.net/xiao_jun_0820/article/details/7268219 StoredProcedure是一个抽象类,必须写一个子类来继承它,这个类是用来简化JDBCTemplate执行存储过程操作的。首先我们写一个实现类:[java]viewplaincopyprint?package com.huaye.f

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

 

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.       
  27.     public HashMap getMap()  
  28.     {  
  29.         return this.map;  
  30.     }  
  31.       
  32.     public void setValue(String key, Object obj) {  
  33.         map.put(key, obj);  
  34.     }  
  35.   
  36.     public Map execute() {  
  37.         if (this.getSql() == null || this.getSql().equals(“”))  
  38.             return null;  
  39.         this.compile();  
  40.         return execute(map);  
  41.     }  
  42.   
  43.     public void setVarcharParam(String param) {  
  44.         this.declareParameter(new SqlParameter(param, Types.VARCHAR));  
  45.     }  
  46.   
  47.     public void setDoubleParam(String param) {  
  48.         this.declareParameter(new SqlParameter(param, Types.DOUBLE));  
  49.     }  
  50.   
  51.     public void setIntegerParam(String param) {  
  52.         this.declareParameter(new SqlParameter(param, Types.INTEGER));  
  53.     }  
  54.   
  55.     public void setVarcharOutParam(String param) {  
  56.         this.declareParameter(new SqlOutParameter(param, Types.VARCHAR));  
  57.     }  
  58.   
  59.     public void setDoubleOutParam(String param) {  
  60.         this.declareParameter(new SqlOutParameter(param, Types.DOUBLE));  
  61.     }  
  62.   
  63.     public void setIntegerOutParam(String param) {  
  64.         this.declareParameter(new SqlOutParameter(param, Types.INTEGER));  
  65.     }  
  66.   
  67.   
  68.     public void setInParam(String param,int valueType)  
  69.     {  
  70.         this.declareParameter(new SqlParameter(param, valueType));  
  71.           
  72.     }  
  73.       
  74.     public void setOutParam(String param,int valueType)  
  75.     {  
  76.         this.declareParameter(new SqlOutParameter(param, valueType));  
  77.           
  78.     }  
  79.       
  80.     public void setReturnParam(String param, RowMapper rowMapper) {  
  81.         this.declareParameter(new SqlReturnResultSet(param,rowMapper));  
  82.     }  
  83.   
  84. }  

写一个测试:

  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://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();
        }
    }

}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164512.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Ubuntu18.04下安装Pytorch-GPU(超详细自己安装全过程)「建议收藏」

    Ubuntu18.04下安装Pytorch-GPU(超详细自己安装全过程)「建议收藏」硬件环境:自己的笔记本电脑CPU:i5-4210MGPU:NVIDIAgeforce920M1Anaconda3的安装与配置1.1下载可以到Anaconda官网下载历史版本:https://repo.anaconda.com/archive/国内的下载速度可能比较慢,选择到清华大学开源软件镜像站下载。我使用的python3.6.9,下载对于的Anaconda版本是5.1…

  • 常见漏洞扫描工具_web漏洞扫描工具有哪些

    常见漏洞扫描工具_web漏洞扫描工具有哪些漏洞扫描漏洞扫描是指基于漏洞数据库,通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用漏洞的一种安全检测(渗透攻击)行为。漏洞扫描器包括网络漏扫、主机漏扫、数据库漏扫等不同种类。常用漏洞扫描工具:一、Nessus百度百科:Nessus是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus作为扫描该机构电脑系统的软件。提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。不同于传统的漏洞扫描软件,Nessus可同时在本机或

  • matlab手写数字识别实验报告_如何用matlab将图像转为矩阵

    matlab手写数字识别实验报告_如何用matlab将图像转为矩阵本文主要是根据《matlab手写神经网络实现识别手写数字》博客中的代码进行试验。由于没有数据集,所以采用了MNIST数据集进行代码的运行。数据集不同所以需要对代码进行微小改动。简介数据处理:4000张作为训练样本,1000张作为测试样本;图像大小:图片的灰度值矩阵(28,28);图像名称:由标签和顺序号组成。标签_顺序号.bmp训练样本:每个数字的图像名称的顺序号是从0-399,各400…

  • 是否可以将频谱分析仪当做网络分析仪使用?[通俗易懂]

    是否可以将频谱分析仪当做网络分析仪使用?[通俗易懂]PSD测量值通常以Vrms2/Hz或Vrms/rtHz为单位(这里的rtHz指的是平方根赫兹)。或者,PSD也可以采用dBm/Hz为单位。PSA、ESA、856XE/EC或859XE等频谱分析仪均可通过噪声标记对功率谱密度进行测量。矢量信号分析仪比如89600S或89400,直接就有PSD测量数据类型。 在频谱分析仪上最简便的测量方法(测量结果以Vrms/rtHz为单位)就是: 在振幅菜单中选择以伏特为单位的振幅(AMPLITUDE[硬键]>More>YAxis

  • 模型调参:分步骤的提升模型的精度

    模型调参:分步骤的提升模型的精度

    2021年11月21日
  • css鼠标点击的五种状态

    css鼠标点击的五种状态1、a:link{color:#fff}未访问时的状态(鼠标点击前显示的状态)2、a:hover{color:#fff}鼠标悬停时的状态3、a:visited{color:#fff}已访问过的状态(鼠标点击后的状态)4、a:active{color:#fff}鼠标点击时的状态5、a:focus{color:#fff}点击后鼠标移开保持鼠标点击时的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号