反射封裝工具類---ResultSet轉List

V_1.0 resultSet 轉換爲 list的開發方式弊端:java

      1)這個流程,實際就是一個取值賦值的過程,是沒有任何技術含量數據庫

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

      2)若是【臨時表】包含的字段個數過多 ,致使開發人員工做量過大spa

      

V_2.0  public static List convert(ResultSet rs,String [實體類映射文件地址])code

                做用: 將當前臨時表中每個行數,封裝到一個對應的實體類對象,xml

                           而後將這些實體類對象保存到統一的List集合中,並返回。對象

                           

                           

V_3.0 ResultSet 表示一張臨時表。如何可以瞭解一個陌生的臨時表中結構信息blog

         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>
相關文章
相關標籤/搜索