import java.lang.reflect.Field;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.PReparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Time;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * * @author * */public class ProUtil { /** * 给定存储过程(必须有一个或以上输入参数 最后一个为输出动态游标)名称、 参数 输出结果 * @param conn 连接 * @param proceducesName 存储过程名称 * @param params 存储过程传入参数 * @return */ public static List<List<String>> getProList(Connection conn, String proceducesName, String... params) { List<List<String>> result = null; if (params == null || params.length == 0) return result; String call = getCallName(proceducesName, params); CallableStatement cstmt = null; ResultSet rs = null; try { cstmt = conn.prepareCall(call); String str = ""; for (int i = 0; i < params.length; i++) { str = StringUtil.isNull(params[i]) ? "" : params[i]; cstmt.setString(i + 1, str); } cstmt.registerOutParameter(params.length + 1, Oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(params.length + 1); result = parseResult(rs); } catch (Exception e) { e.printStackTrace(); System.err.println("出现错误:" + e.getMessage()); } finally { closeResource(rs, cstmt, conn); } return result; } /** * 根据存储过程(必须有一个或以上输入参数 最后一个为输出动态游标)名称返回结果集 包含结果集列名 * @param conn * @param proceducesName * @param params * @return */ public static List<List<String>> getProListLm(Connection conn, String proceducesName, String... params) { List<List<String>> result = null; if (params == null || params.length == 0) return result; String call = getCallName(proceducesName, params); CallableStatement cstmt = null; ResultSet rs = null; try { cstmt = conn.prepareCall(call); String str = ""; for (int i = 0; i < params.length; i++) { str = StringUtil.isNull(params[i]) ? "" : params[i]; cstmt.setString(i + 1, str); } cstmt.registerOutParameter(params.length + 1, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(params.length + 1); result = parseResults(rs); } catch (Exception e) { e.printStackTrace(); System.err.println("出现错误:" + e.getMessage()); } finally { closeResource(rs, cstmt, conn); } return result; } /** * 给定存储过程(必须有一个或以上输入参数 最后一个为输出动态游标)名称,对象 返回结果 * @param conn * @param cl * @param proceducesName 存储过程名称 * @param params 存储过程传入参数 * @return List * */ public static <T> List<T> getProList(Connection conn, Class<T> cl, String proceducesName, String... params) { List<T> result = null; if (params == null || params.length == 0) return result; String call = getCallName(proceducesName, params); CallableStatement cstmt = null; ResultSet rs = null; try { cstmt = conn.prepareCall(call); String str = ""; for (int i = 0; i < params.length; i++) { str = StringUtil.isNull(params[i]) ? "" : params[i]; cstmt.setString(i + 1, str); } cstmt.registerOutParameter(params.length + 1, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(params.length + 1); result = parseResult(rs, cl); } catch (Exception e) { System.err.println("出现错误:" + e.getMessage()); e.printStackTrace(); } finally { closeResource(rs, cstmt, conn); } return result; } /** * 给定存储过程(必须有一个或以上输入参数 最后一个为输出动态游标)名称 类对象组 返回结果 * @param conn * @param cl * @param proceducesName 存储过程名称 * @param params 存储过程传入参数 * @return List * */ public static <T> List<List<T>> getProLists(Connection conn, Class<T>[] cls, String proceducesName, String... params) { List<List<T>> result = null; if (params == null || params.length == 0) return result; String call = getCallName(proceducesName, params); CallableStatement cstmt = null; ResultSet rs = null; try { cstmt = conn.prepareCall(call); String str = ""; for (int i = 0; i < params.length; i++) { str = StringUtil.isNull(params[i]) ? "" : params[i]; cstmt.setString(i + 1, str); } cstmt.registerOutParameter(params.length + 1, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(params.length + 1); result= parseResults(rs, cls); } catch (Exception e) { System.err.println("出现错误:" + e.getMessage()); e.printStackTrace(); } finally { closeResource(rs, cstmt, conn); } return result; } /** * 根据sql 与对象 返回对象结果集 * @param conn * @param cl * @param sql * @param params * @return */ public static <T> List<T> SelectList(Connection conn, Class<T> cl, String sql, String... params){ List<T> result = null; PreparedStatement cstmt = null; ResultSet rs = null; try { cstmt = conn.prepareStatement(sql); if(params!=null){ for(int i=0;i<params.length;i++){ cstmt.setString(i+1, params[i]); }} rs=cstmt.executeQuery(); result = parseResult(rs, cl); } catch (Exception e) { System.err.println("出现错误:" + sql); e.printStackTrace(); } return result; } /** * 结果集取出转换 * @param rs 结果集 * @param cl * @return * @throws SecurityException * @throws IllegalArgumentException * @throws SQLException * @throws InstantiationException * @throws IllegalaccessException * @throws Exception */ private static <T> List<T> parseResult(ResultSet rs, Class<T> cl) throws SecurityException, IllegalArgumentException, SQLException, InstantiationException, IllegalAccessException, Exception { ResultSetMetaData metaData = rs.getMetaData(); int colSize = metaData.getColumnCount(); List<T> result = new ArrayList<T>(); while (rs.next()) { T clt = cl.newInstance(); Field[] fls = clt.getClass().getDeclaredFields(); c:for(Field fl:fls){ for(int i = 0; i < colSize; i++){ if(metaData.getColumnName( i + 1 ).equals(fl.getName().toUpperCase())){ String va=rs.getString(fl.getName()); fl.setAccessible(true); setValue(clt, fl, va); continue c; } } } result.add(clt); } return result; } private static <T> List<List<T>> parseResults(ResultSet rs, Class<T>[] cls) throws SecurityException, IllegalArgumentException, SQLException, InstantiationException, IllegalAccessException, Exception { ResultSetMetaData metaData = rs.getMetaData(); int colSize = metaData.getColumnCount(); List<List<T>> result = new ArrayList<List<T>>(); for(int i=0;i<cls.length;i++){ result.add(new ArrayList<T>()); } while (rs.next()) { for(int j=0;j<cls.length;j++){ T clt = cls[j].newInstance(); Field[] fls = clt.getClass().getDeclaredFields(); c:for(Field fl:fls){ for(int i = 0; i < colSize; i++){ if(metaData.getColumnName( i + 1 ).equals(fl.getName().toUpperCase())){ String va=rs.getString(fl.getName()); fl.setAccessible(true); setValue(clt, fl, va); continue c; } } } result.get(j).add(clt); } } return result; } /** * 结果集取出 不包含列名称 * @param rs * @return * @throws Exception */ private static List<List<String>> parseResult(ResultSet rs) throws Exception { List<List<String>> result = new ArrayList<List<String>>(); ResultSetMetaData metaData = rs.getMetaData(); int size = metaData.getColumnCount(); while (rs.next()) { List<String> t = new ArrayList<String>(); for (int i = 1; i <= size; i++) { String str = rs.getString(i); str = StringUtils.removeSpecilChar(str); t.add(str); } result.add(t); } return result; } /** * 结果集取出 包含列名称 * @param rs * @return * @throws Exception */ private static List<List<String>> parseResults(ResultSet rs) throws Exception { List<List<String>> result = new ArrayList<List<String>>(); ResultSetMetaData metaData = rs.getMetaData(); int size = metaData.getColumnCount(); List<String> ts = new ArrayList<String>(); result.add(ts); for(int i = 1; i <= size; i++){ ts.add(metaData.getColumnLabel(i)); } while (rs.next()) { List<String> t = new ArrayList<String>(); for (int i = 1; i <= size; i++) { String str = rs.getString(i); str = StringUtils.removeSpecilChar(str); t.add(str); } result.add(t); } return result; } /** * 拼接调用存储过程字符串 * @param proceducesName * @param params * @return */ private static String getCallName(String proceducesName, String[] params) { String call = "{call " + proceducesName + "(?"; for (int i = 0; i < params.length; i++) { call += ",?"; } call += ")}"; return call; } /** * 关闭连接等 * @param rs * @param cstmt * @param conn */ private static void closeResource(ResultSet rs, CallableStatement cstmt, Connection conn) { try { if (null != rs) rs.close(); if (null != cstmt) cstmt.close(); if (null != conn) conn.close(); } catch (Exception e) { e.printStackTrace(); } } private static <T> void setValue(T t, Field f, Object value) throws IllegalAccessException { // TODO 以数据库类型为准绳,还是以java数据类型为准绳?还是混合两种方式? if (null == value) return; String v = value.toString(); String n = f.getType().getName(); if ("java.lang.Byte".equals(n) || "byte".equals(n)) { f.set(t, Byte.parseByte(v)); } else if ("java.lang.Short".equals(n) || "short".equals(n)) { f.set(t, Short.parseShort(v)); } else if ("java.lang.Integer".equals(n) || "int".equals(n)) { f.set(t, Integer.parseInt(v)); } else if ("java.lang.Long".equals(n) || "long".equals(n)) { f.set(t, Long.parseLong(v)); } else if ("java.lang.Float".equals(n) || "float".equals(n)) { f.set(t, Float.parseFloat(v)); } else if ("java.lang.Double".equals(n) || "double".equals(n)) { f.set(t, Double.parseDouble(v)); } else if ("java.lang.String".equals(n)) { f.set(t, value.toString()); } else if ("java.lang.Character".equals(n) || "char".equals(n)) { f.set(t, (Character) value); } else if ("java.lang.Date".equals(n)) { f.set(t, new Date(((java.sql.Date) value).getTime())); } else if ("java.lang.Timer".equals(n)) { f.set(t, new Time(((java.sql.Time) value).getTime())); } else if ("java.sql.Timestamp".equals(n)) { f.set(t, (java.sql.Timestamp) value); } else { System.out.println("SqlError:暂时不支持此数据类型,请使用其他类型代替此类型!"); } }}
新闻热点
疑难解答