首页 > 学院 > 开发设计 > 正文

使用反射写一个简单的JDBC工具类

2019-11-08 00:51:34
字体:
来源:转载
供稿:网友
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:暂时不支持此数据类型,请使用其他类型代替此类型!");        }    }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表