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条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料