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

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

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条回答 默认 最新

  • 已采纳

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

    已采纳该答案
    打赏 评论
  • kristenlee1218 2017-03-16 05:48

    两个方法是public static List query(String sql, Class clazz)
    和public static List query(String sql, Class clazz,
    Object[] parameters)

    打赏 评论
  • kristenlee1218 2017-03-16 05:48

    List的前面有个,不知道为什么不显示

    打赏 评论
  • 犊子哥哥 2017-03-16 05:54

    集合里面装的应该就是你反射得到的对象类型的对象吧,可以自己测测嘛!如果不是用object接收再强转也成嘛;

    打赏 评论

相关推荐 更多相似问题