kristenlee1218 2017-03-16 05:47 采纳率: 61.3%
浏览 2373
已采纳

泛型集合的遍历,返回什么类型

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sun.org.apache.commons.beanutils.BeanUtils;

public class DBOperateTUtilts {

方法1
public static List query(String sql, Class clazz) {

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Object tempStr = null;
    List<T> list = new ArrayList<T>();
    try {
        conn = DBConnectUtils.getConnection();
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery();
        while (rs.next()) {
            // newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。
            // 我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。
            // newInstance: 弱类型。低效率。只能调用无参构造。
            // new: 强类型。相对高效。能调用任何public构造。
            E obj = clazz.newInstance();
            if (obj instanceof String) {
                // ResultSet的下标从1开始
                obj = (E) rs.getString(1);
            } else {
                // Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限
                // getDeclaredFields()返回Class中所有的字段,包括私有字段
                // getFields 只返回公共字段,即有public修饰的字段
                // field,域是一种属性,可以是一个类变量,一个对象变量,一个对象方法变量或者是一个函数的参数。
                Field[] fields = obj.getClass().getDeclaredFields();
                // 遍历域
                for (Field field : fields) {
                    try {
                        // 反射获取对象成员的字段值
                        tempStr = rs.getObject(field.getName());
                    } catch (SQLException e) {
                        tempStr = "";
                    }
                    // 置是否允许访问,而不是修改原来的访问权限修饰词
                    field.setAccessible(true);
                    // 把对象的属性数据封装到对象中
                    BeanUtils.setProperty(obj, field.getName(), tempStr);
                }
            }
            list.add(obj);
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    } finally {
        DBCloseUtils.closeCSR(conn, pstmt, rs);
    }
    return list;
}

方法2
public static List query(String sql, Class clazz,
Object[] parameters) {

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    ResultSetMetaData metaData = null;
    List<T> list = new ArrayList<T>();
    int index = 1;
    try {
        pstmt = conn.prepareStatement(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    if (parameters != null && parameters.length != 0) {
        for (int i = 0; i < parameters.length; i++) {
            try {
                // pstmt.setObject(第几个参数, 替换成什么);
                pstmt.setObject(index, parameters[i]);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    try {
        rs = pstmt.executeQuery(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    // 封装resultset
    try {
        metaData = rs.getMetaData();
    } catch (SQLException e) {
        e.printStackTrace();
    }// 取出列的信息
    int columnLength = 0;
    try {
        columnLength = metaData.getColumnCount();
    } catch (SQLException e) {
        e.printStackTrace();
    }// 获取列数
    try {
        while (rs.next()) {
            // 通过反射机制创建一个对象
            T result = clazz.newInstance();
            for (int i = 0; i < columnLength; i++) {
                String metaDataKey = metaData.getColumnName(i + 1);
                Object resultsetValue = rs.getObject(metaDataKey);
                if (resultsetValue == null) {
                    resultsetValue = "";
                }
                Field field = clazz.getDeclaredField(metaDataKey);
                field.setAccessible(true);
                field.set(result, resultsetValue);
            }
            list.add(result);
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
    return list;
}

}

  • 写回答

4条回答 默认 最新

  • 关注

    你想要得到的结果是什么类型就返回什么类型

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?