`
jinyanhui2008
  • 浏览: 319375 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

java 调用通用存储过程(Sqlserver) oracle以后补上

    博客分类:
  • Java
阅读更多

我这个是将调用存储过程的方式进行统一封装,将调用存储过程的方法统一起来调用。

package com.wfy.system.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;

import com.wfy.util.JDOM;

/**
* 
* 存储过程通过此类调用
* 
* @author 金鑫
* 
*/
public class DynamicDataProcedureExecuteDAO {
private Map getSqlServerData(JdbcTemplate jdbcTemplate, final List<?> procedureList){
   Map returnMap = (Map) jdbcTemplate.execute(new ConnectionCallback(){
    public Map doInConnection(Connection conn) throws SQLException,
      DataAccessException {
     /**
     * 由于sqlserver跟oracle 的调用方式有所不同,所以需要分开调用,但是我对oracle存储过程不熟悉,所以没有写,以后会补上的。
     * 我的通用方式是将传入数据进行封装,再将传出数据封装为map返回给用户
     * 
     * List.get(0) 中存放的是 存储过程的名称
     * 
     * 从list.get(1)开始存放的是相应参数,参数以map类型存放
     * 
     * map.put("name","")//传入传出的参数名字
     * map.put("value","")//传入的参数值,传出为null
     * map.put("type","input/output/outtable");//传入 传出 输出的结果集
     * map.put("dataType",type);//传入传出的数据类型。
     * 
     * 返回的时候将type类型为output的封装为map返回前台。
     * 
     * */
    
     //生成存储过程调用字符串
     String callStr = "{call ";
     callStr += procedureList.get(0).toString()+"(";
     for (int i = 1; i < procedureList.size(); i++) {
      if(!((Map)procedureList.get(i)).get("type").toString().equals("outtable"))
      callStr += "?,";
     }
     if(procedureList.size()>1){
      callStr = callStr.substring(0,callStr.length()-1);
     }
     callStr += ")}";
    
     System.out.println("callStr:"+callStr);
    
     CallableStatement cstmt = conn.prepareCall(callStr);
    
     for (int j = 1; j < procedureList.size(); j++) {
      Map<String, String> map = (Map<String, String>)procedureList.get(j);
      if(map.get("type").equals("input")){
       //说明此函数是传入函数
       if(map.get("dataType").toUpperCase().equals("STRING")){
        cstmt.setString(j, map.get("value"));
       }else if(map.get("dataType").toUpperCase().equals("INT")){
        try {
         cstmt.setInt(j, Integer.parseInt(map.get("value").toString())); 
        } catch (Exception e) {
         throw new SQLException(map.get("value") + " INT 数据类型转换错误");
        }
       }else if(map.get("dataType").toUpperCase().equals("DECIMAL")){
        try {
         cstmt.setDouble(j, Double.parseDouble(map.get("value").toString()));
        } catch (Exception e) {
         throw new SQLException(map.get("value") + " DECIMAL 数据类型转换错误");
        }
       }else if(map.get("dataType").toUpperCase().equals("DATE")){
        try{
         DateFormat formatter1= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         cstmt.setDate(j, new java.sql.Date(formatter1.parse(map.get("value").toString()).getTime()));
        }catch(Exception e1){
         try{
          DateFormat formatter2= new SimpleDateFormat("yyyy-MM-dd");
          cstmt.setDate(j, new java.sql.Date(formatter2.parse(map.get("value").toString()).getTime()));
         }catch(Exception e2){
          throw new SQLException(map.get("value") + " DATE 数据类型转换错误");
         }
        }
       }
      }else if(map.get("type").equals("output")){
       //说明此函数是返回函数
       if(map.get("dataType").toUpperCase().equals("STRING")){
        cstmt.registerOutParameter(j, Types.CHAR);
       }else if(map.get("dataType").toUpperCase().equals("INT")){
        cstmt.registerOutParameter(j, Types.INTEGER);
       }else if(map.get("dataType").toUpperCase().equals("DECIMAL")){
        cstmt.registerOutParameter(j, Types.DECIMAL);
       }else if(map.get("dataType").toUpperCase().equals("DATE")){
        cstmt.registerOutParameter(j, Types.DATE);
       }
      }
     }
     //返回的map
     Map<String, Object> returnMap = new HashMap<String, Object>();
     cstmt.execute();
    
     int k = 1;
     while(cstmt.getMoreResults()){
      ResultSet rs = cstmt.getResultSet();
      List ls = new ArrayList();
      while(rs.next()){
       Map vc = new HashMap();
       for(int i=1;i<rs.getMetaData().getColumnCount()+1;i++){
        vc.put(rs.getMetaData().getColumnName(i), rs.getObject(i));
       }
       ls.add(vc);
      }
      for (; k < procedureList.size(); k++) {
       Map mp = (Map)procedureList.get(k);
       if(mp.get("type").equals("outtable")){
        returnMap.put(mp.get("name").toString(), ls);
        k++;
        break;
       }
      }
     }
    
     for (int j = 1; j < procedureList.size(); j++) {
      Map<String, String> map = (Map<String, String>)procedureList.get(j);
      if(map.get("type").equals("output")){
       //说明此函数是返回函数
       if(map.get("dataType").toUpperCase().equals("STRING")){
        returnMap.put(map.get("name").toString(), cstmt.getString(j));
       }else if(map.get("dataType").toUpperCase().equals("INT")){
        returnMap.put(map.get("name").toString(), cstmt.getInt(j));
       }else if(map.get("dataType").toUpperCase().equals("DECIMAL")){
        returnMap.put(map.get("name").toString(), cstmt.getDouble(j));
       }else if(map.get("dataType").toUpperCase().equals("DATE")){
        returnMap.put(map.get("name").toString(), cstmt.getDate(j));
       }
      }
     }
    
     cstmt.close();
    
     return returnMap;
    }
   });
   return returnMap;
}
}

 

分享到:
评论

相关推荐

    java调用oracle sqlserver存储过程共用方法

    ### Java调用Oracle与SQL Server存储过程的通用方法 #### 1. **建立数据库连接** 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。根据`dbType`参数动态选择正确的数据源,即Oracle或SQL Server的...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动...只写一个通用方法,就可以调用所有的存储过程。只根据输入不同的存储过程名称、参数内容,自动调用不同的存储过程。 已经使用在多个项目中 全开源项目 请放心下载

    Oracle & SQLServer 脚本批量执行方法

    在IT行业中,数据库管理是至关重要的任务,尤其是在大型企业中,数据存储和处理通常涉及到Oracle和SQL Server这样的大型关系型数据库管理系统。本文将详细介绍如何在Oracle与SQL Server中批量执行SQL脚本,以提高...

    jdbc连接数据库(oracle、sqlserver)代码

    在IT行业中,数据库是数据存储和管理的核心,而Java Database Connectivity (JDBC) 是Java编程语言与各种数据库交互的一种标准接口。本知识点主要讲解如何使用JDBC连接Oracle和SQL Server这两种常见的关系型数据库。...

    使用JDBC连接Oracle,MySql,SQLServer数据库

    本话题将深入讲解如何使用Java JDBC(Java Database Connectivity)API来连接Oracle、MySQL和SQL Server这三种常见关系型数据库。JDBC提供了一种标准的接口,使得Java开发者可以方便地与各种数据库系统进行通信。 ...

    oracle存储过程集锦

    `调用存储过程(1).doc`和`调用存储过程.doc`可能侧重于如何在应用程序中调用存储过程,这可能包括了在SQL命令行、PL/SQL块中或者使用其他编程语言(如Java、C#)的数据库连接API来执行存储过程的方法。这些文档对于...

    Oracle 10G Java Programming

    Oracle 10G允许Java代码与PL/SQL过程相互调用,实现了数据库内核级别的Java支持。通过存储过程、函数和触发器,Java类可以被编译并存储在数据库中,可以直接从SQL语句中调用。这种集成提供了更好的性能,因为数据...

    JDBC连接数据库BaseDao通用类(可以调用存储过程)

    从给定的文件信息来看,我们正在探讨一个Java程序中用于连接数据库并调用存储过程的通用类——`BaseDaoOutput`。这个类是IT领域中处理数据库操作时经常使用的一种设计模式,它通过封装数据库连接、执行SQL语句、处理...

    JAVA 开发通用的在线考试系统(jsp+struts+hibernate+oracle).zip

    标题中的“JAVA 开发通用的在线考试系统(jsp+struts+hibernate+oracle)”表明这是一个基于Java技术栈开发的、适用于各种考试场景的Web应用程序。它利用了四个核心的技术:JSP(JavaServer Pages)、Struts、...

    JAVA 开发通用的在线考试系统(jsp+struts+hibernate+oracle)130220.zip

    《JAVA 开发通用的在线考试系统:jsp+struts+hibernate+oracle技术解析》 在信息技术高速发展的今天,教育领域也开始广泛应用在线考试系统,以提高教学效率和评测的公正性。本项目“JAVA 开发通用的在线考试系统...

    Learning Oracle PLSQL

    - **存储过程**:用于封装一组SQL语句或PL/SQL代码块,可以在数据库中保存并多次调用。 - **函数**:类似于存储过程,但主要目的是返回一个值。 - **包**:包含多个相关的存储过程和函数,以及变量、常量和其他类型...

    抽象工厂 SQL 和Access 利用泛型读取表中数据 WCF发布出去

    4. 在`GenericTableReader&lt;T&gt;`中,利用抽象工厂创建的数据库连接执行SQL查询或存储过程,获取数据并转换为`T`类型的集合。 5. 将`GenericTableReader&lt;T&gt;`服务化,使用WCF将其配置为一个服务接口,例如`IDataService`...

    基于Java设计的通用的在线考试系统(jsp+struts+hibernate+oracle)源码+数据库.zip

    这是一个基于Java技术栈开发的通用在线考试系统的源代码,它采用了经典的MVC设计模式,具体技术框架包括jsp、struts、hibernate以及数据库管理工具Oracle。以下将详细阐述这个系统的设计理念、主要组成部分以及各个...

    Oracle Database 11g 第 2 版 (11.2.0.4) JDBC 驱动程序— 包含 JDBC 示例程序。

    2. `classes12.jar`:包含Oracle的非JDBC特定的数据库访问类,如LOB处理、存储过程调用等。 3. `oci.jar`(如果包含):Oracle的本地库,用于JDBC OCI驱动。 示例程序通常包括演示如何初始化数据库连接、执行SQL...

    通用的在线考试系统(jsp+struts+hibernate+oracle).zip

    【标题】"通用的在线考试系统"是一款基于Java技术栈,使用jsp、struts、hibernate框架以及Oracle数据库构建的在线考试平台。这个系统旨在为教育和培训领域提供一个功能全面、易于使用的考试管理系统。 【描述】指出...

    通用的在线考试系统(jsp+struts+hibernate+oracle)-project

    本项目“通用的在线考试系统(jsp+struts+hibernate+oracle)_project”采用的是Java Web技术栈,具体包括JSP、Struts、Hibernate和Oracle数据库,这些技术的结合为系统的稳定性和扩展性提供了坚实基础。 首先,JSP...

    java从入门到精通全过程笔记

    PL/SQL是Oracle数据库的编程语言,用于编写存储过程和触发器。了解这些技术对于开发基于Java的数据驱动应用至关重要。 【Web开发】 Web开发中,JSP(JavaServer Pages)用于创建动态网页,Struts是MVC(Model-View-...

    通用的在线考试系统(jsp+struts+hibernate+oracle)130220.rar

    本系统采用经典的Java Web开发框架,即JSP(JavaServer Pages)、Struts、Hibernate以及Oracle数据库,构建了一个功能完善的通用在线考试平台。下面我们将详细探讨这些技术在系统中的应用及其重要性。 1. JSP(Java...

Global site tag (gtag.js) - Google Analytics