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

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:暂时不支持此数据类型,请使用其他类型代替此类型!");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值