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>