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 {
}
}
存儲過程封裝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.