zoukankan      html  css  js  c++  java
  • 反射封装工具类---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>
  • 相关阅读:
    jmeter:dubbo接口测试
    聊聊基准测试的MVP方案
    建立团队的性能文化
    针对 Intellij IDEA 2018.2 版本 异常退出问题
    maven settings.xml配置优化
    Windows安装MySQL
    String的intern()方法详解
    Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法
    Iterator迭代器快捷键
    $.each $.map $.filter 区别 Script
  • 原文地址:https://www.cnblogs.com/he-shao/p/6068351.html
Copyright © 2011-2022 走看看