反射封装工具类---ResultSet转List

V_1.0 resultSet 转换为 list的开发方式弊端:

      1)这个流程,实际就是一个取值赋值的过程,是没有任何技术含量

            stu.setId(rs.getInt("sid"));

      2)如果【临时表】包含的字段个数过多 ,导致开发人员工作量过大

      

V_2.0  public static List convert(ResultSet rs,String [实体类映射文件地址])

                作用: 将当前临时表中每一个行数,封装到一个对应的实体类对象,

                           然后将这些实体类对象保存到统一的List集合中,并返回。

                           

                           

V_3.0 ResultSet 表示一张临时表。如何能够了解一个陌生的临时表中结构信息

         1.  public void  findInfo(ResultSet rs){}

         2.  JDBC中提供了一个接口  ResultSetMetaData。这个接口用来

             描述当前临时表的表结构

工具类实现:
public class ReflectUtil {
    /**
     * 功能: 将ResultSet 转成list 
     * 步骤: 将ResultSet中的数据赋值给实体对象并将其保存到list集合中,一行数据对应一个对象
     * 
     * @param rs
     *            数据库返回结果集
     * @param xmlPath
     *            数据库表和实体类映射文件路径
     * @return list
     * @throws Exception
     */
    public static List convert(ResultSet rs, String xmlPath) throws Exception {
        // 1.将映射文件加载到内存中
        InputStream in = new FileInputStream(xmlPath);
        SAXReader reader = new SAXReader();
        Document doc = reader.read(in);
        // 2.将实体类加载到内存中
        String xPath = "//@classPath";
        Attribute classAttr = (Attribute) doc.selectSingleNode(xPath);
        String className = classAttr.getValue();
        Class clazz = Class.forName(className);
        // 3.读取ResultSet中表结构
        ResultSetMetaData rsmd = rs.getMetaData();
        // 获得表的列数
        int colCount = rsmd.getColumnCount();
        // list 用来保存被赋值对象
        List list = new ArrayList();
        while (rs.next()) {
            // 每次循环一行数据,创建一个对象
            Object obj = clazz.newInstance();
            for (int i = 1; i <= colCount; i++) {
                // 获得表的列名
                String colName = rsmd.getColumnName(i);
                xPath = "//property[@colName='" + colName + "']";
                Element colElet = (Element) doc.selectSingleNode(xPath);
                // 获得对应实体类的属性名称
                String nameValue = colElet.attributeValue("name");
                // 使用反射获得实体类中对应的属性对象
                Field nameField = clazz.getDeclaredField(nameValue);
                nameField.setAccessible(true);
                // 实体类属性对应数据类型
                String type = colElet.attributeValue("type");
                // 获得临时表中对应的值
                String value = rs.getString(i);
                Object data = null;
                if ("int".equals(type)) {
                    data = Integer.parseInt(value);
                } else if ("java.lang.String".equals(type)) {
                    data = value;
                } else if ("double".equals(type)) {
                    data = Double.parseDouble(value);
                }
                // 赋值给指定对象
                nameField.set(obj, data);
            }
            list.add(obj);
        }
        return list;
    }
}

数据库表:
+--------+-------------+----------+
| DEPTNO | DNAME       | LOC      |
+--------+-------------+----------+
|     10 | ACCOUNTING  | NEW YORK |
|     20 | RESEARCH    | DALLAS   |
|     30 | SALES       | CHICAGO  |
|     40 | OPERATIONS  | BOSTON   |
实体类
public class DeptVO {
    
    private int deptNo;
    private String dName;
    private String loc;
 Getter/setter ();
}
实体类数据库表映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean classPath="com.xiehe.entily.DeptVO" table="dept">
         <property name="deptNo" type="int" colName="DEPTNO" colType ="int"></property>
        <property name="dName" type="java.lang.String" colName="DNAME" colType="varchar"></property>
         <property name="loc" type="java.lang.String" colName="LOC" colType="varchar"></property>
    </bean>
</beans>
原文地址:https://www.cnblogs.com/he-shao/p/6068351.html