存儲過程封裝

package com.im.procedure.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.apache.log4j.Logger;

import com.im.jdbc.JdbcMgr;

/**
 * 
 * @author 007
 * @date Mar 26, 2015 3:57:59 PM
 * @version V1.0
 * @Description: TODO(sqlserver存儲過程封裝)
 * 
 */
public class ProceDureDao {
	public static Logger _log = Logger.getLogger(ProceDureDao.class);
	private final int sleepTimeMs = 400;

	public Map doInConnection(final List<?> procedureList) {
		long start = System.currentTimeMillis();
		Connection conn = JdbcMgr.getInstance().getConnectionFromJNDI();
		if (conn == null) {
			_log.info("get conntection from pool is null return null!!!! ");
			return null;
		}

		//生成存儲過程調用字符串  
		String callStr = "{call ";
		callStr += procedureList.get(0).toString() + "(";
		int paramSize = 0;
		for (int i = 1; i < procedureList.size(); i++) {
			if (!((Map) procedureList.get(i)).get("type").toString().equals("outtable")) {
				callStr += "?,";
				paramSize++;
			}
		}
		if (paramSize > 0) {
			callStr = callStr.substring(0, callStr.length() - 1);
		}
		callStr += ")}";
		_log.debug("callStr:" + callStr);
		System.out.println("callStr:" + callStr);
		//返回的map  
		Map<String, Object> returnMap = new HashMap<String, Object>();
		CallableStatement cstmt;
		try {
			cstmt = conn.prepareCall(callStr);

			for (int j = 1; j < procedureList.size(); j++) {
				Map<String, String> map = (Map<String, String>) procedureList.get(j);
				System.out.println(map);
				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 {
							cstmt.setDate(j, new java.sql.Date(Long.parseLong(map.get("value").toString())));
						} catch (Exception e) {
							throw new SQLException(map.get("value") + " DATE 數據類型轉換錯誤");
						}

					} else if (map.get("dataType").toUpperCase().equals("DATESTR")) {
						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") + " DATESTR 數據類型轉換錯誤");
							}
						}
					}

					else if (map.get("dataType").toUpperCase().equals("BIGINT")) {
						try {
							cstmt.setLong(j, Long.parseLong(map.get("value").toString()));
						} catch (Exception e) {
							throw new SQLException(map.get("value") + " DATE 數據類型轉換錯誤");
						}

					} else if (map.get("dataType").toUpperCase().equals("DOUBLE")) {
						try {
							cstmt.setDouble(j, Double.parseDouble(map.get("value").toString()));
						} catch (Exception e) {
							throw new SQLException(map.get("value") + " DATE 數據類型轉換錯誤");
						}

					} else if (map.get("dataType").toUpperCase().equals("FLOAT")) {
						try {
							cstmt.setFloat(j, Float.parseFloat(map.get("value").toString()));
						} catch (Exception e) {
							throw new SQLException(map.get("value") + " DATE 數據類型轉換錯誤");
						}

					} else if (map.get("dataType").toUpperCase().equals("TINYINT")) {
						try {
							cstmt.setShort(j, Short.parseShort(map.get("value").toString()));
						} catch (Exception e) {
							throw new SQLException(map.get("value") + " DATE 數據類型轉換錯誤");
						}
					} else if (map.get("dataType").toUpperCase().equals("TIMESTAMP")) {
						try {
							cstmt.setDate(j, new java.sql.Date(Long.parseLong(map.get("value").toString())));
						} catch (Exception e) {
							throw new SQLException(map.get("value") + " DATE 數據類型轉換錯誤");
						}
					} else if (map.get("dataType").toUpperCase().equals("TIME")) {
						try {
							cstmt.setDate(j, new java.sql.Date(Long.parseLong(map.get("value").toString())));
						} catch (Exception e) {
							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);

					} else if (map.get("dataType").toUpperCase().equals("BIGINT")) {
						cstmt.registerOutParameter(j, Types.BIGINT);
					} else if (map.get("dataType").toUpperCase().equals("DOUBLE")) {
						cstmt.registerOutParameter(j, Types.DOUBLE);
					} else if (map.get("dataType").toUpperCase().equals("FLOAT")) {
						cstmt.registerOutParameter(j, Types.FLOAT);
					} else if (map.get("dataType").toUpperCase().equals("TINYINT")) {
						cstmt.registerOutParameter(j, Types.TINYINT);
					} else if (map.get("dataType").toUpperCase().equals("TIMESTAMP")) {
						cstmt.registerOutParameter(j, Types.TIMESTAMP);
					} else if (map.get("dataType").toUpperCase().equals("TIME")) {
						cstmt.registerOutParameter(j, Types.TIME);
					}
				}
			}

			//System.out.println(cstmt.toString());
			cstmt.execute();
			int k = 1;
			ResultSet rs0 = cstmt.getResultSet();
			List ls0 = new ArrayList();
			while (rs0 != null && rs0.next()) {
				Map vc = new HashMap();
				for (int i = 1; i < rs0.getMetaData().getColumnCount() + 1; i++) {
					vc.put(rs0.getMetaData().getColumnName(i), rs0.getObject(i));
				}
				ls0.add(vc);
			}
			if (ls0.size() > 0) {
				for (; k < procedureList.size(); k++) {
					Map mp = (Map) procedureList.get(k);
					if (mp.get("type").equals("outtable")) {
						returnMap.put(mp.get("name").toString(), ls0);
						k++;
						break;
					}
				}
			}
			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);
				}
				if (ls.size() > 0) {
					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));

					} else if (map.get("dataType").toUpperCase().equals("BIGINT")) {
						returnMap.put(map.get("name").toString(), cstmt.getLong(j));
					} else if (map.get("dataType").toUpperCase().equals("DOUBLE")) {
						returnMap.put(map.get("name").toString(), cstmt.getDouble(j));
					} else if (map.get("dataType").toUpperCase().equals("FLOAT")) {
						returnMap.put(map.get("name").toString(), cstmt.getFloat(j));
					} else if (map.get("dataType").toUpperCase().equals("TINYINT")) {
						returnMap.put(map.get("name").toString(), cstmt.getShort(j));
					} else if (map.get("dataType").toUpperCase().equals("TIMESTAMP")) {
						returnMap.put(map.get("name").toString(), cstmt.getTimestamp(j));
					} else if (map.get("dataType").toUpperCase().equals("TIME")) {
						returnMap.put(map.get("name").toString(), cstmt.getTime(j));
					}
				}
			}
			cstmt.close();

		} catch (SQLException e3) {
			_log.error("", e3);
		}
		JdbcMgr.getInstance().closeConnection(conn);
		//DBConnectionManager.getInstance().freeConnection(ConfigUtility.getInstance("jdbc").getValue("jdbc.name"), conn);
		_log.debug("dao use time:" + (System.currentTimeMillis() - start));
		return returnMap;
	}

	public static void main(String[] args) throws SQLException {
		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章