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>