java调用存储过程类(SQL-Server)

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;    
}    
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值