• 利用反射写出通用DAO方法


    @Test
    public void testGet() {
    String sql = "select id,name,email,birth from customers where id=?";
    int params = 1;
    Customer customer = get(Customer.class, sql, params);
    System.out.println(customer);
    sql = "select flow_id flowId,type,id_card idCard,exam_card examCard,student_name studentName,location,grade from examstudent where flow_id=?";
    Student student = get(Student.class, sql, 23);
    System.out.println(student);
    }

    public <T> T get(Class<T> clazz, String sql, Object... params) {
    //T entity = null;
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
    //得到ResultSet对象
    connection = JDBCTools.getConnection();
    preparedStatement = connection.prepareStatement(sql);
    for (int i = 0; i < params.length; i++) {
    preparedStatement.setObject(i + 1, params[i]);
    }
    resultSet = preparedStatement.executeQuery();
    //得到ResultSetMetaData对象
    ResultSetMetaData resultSetMetaData=resultSet.getMetaData();
    int count=resultSetMetaData.getColumnCount();
    //处理结果集,利用ResultSetMetaData对象填充对应的Map对象
    while (resultSet.next()) {
    // 通过解析SQL语句来判断到底选择了哪些列,以及需要为entity对象的哪些属性赋值
    //创建一个Map<String,Object>对象,键:SQL查询的列的别名;值:列的值
    Map<String,Object> map=new HashMap<String,Object>();
    for(int i=0;i<count;i++){
    String columnLabel=resultSetMetaData.getColumnLabel(i+1);
    Object columnValue=resultSet.getObject(columnLabel);
    map.put(columnLabel, columnValue);
    }
    //若Map不为空集,利用反射创建Clazz对应的对象
    if(map.size()>0){
    T entity=clazz.newInstance();
    for(Map.Entry<String, Object> entry:map.entrySet()){
    ReflectionUtils.setFieldValue(entity,entry.getKey(),entry.getValue());
    }
    return entity;
    }
    //遍历Map对象,利用反射为Class对象对应的属性赋值。
    }
    //return entity;
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    JDBCTools.release(resultSet, preparedStatement, connection);
    }
    return null;
    }

    1、利用SQL进行查询,得到结果集
    2、利用反射创建实体类的对象:创建Student对象
    3、获取结果集的列的别名:如idCard,studentName
    4、再获取结果集的每一列的值,结合3得到一个Map,键:列的名,值:列的值
    {flowId:5,type:6,idCard:xxxx....}
    5、利用反射为2的对应的属性赋值:属性即为Map的键,值即为Map的值


    ResultSetMetaData()

    1)、是描述ResultSet的元数据对象,即从中可以获取到结果集中有多少列,列名是什么...
    2)、如何用?
    <1>得到ResultSetMetaData对象:调用 ResultSet的getMetaData()方法
    <2>ResultSetMetaData有哪些方法:int getColumnCount() :sql语句中包含 多少列
    String getColumnLabel(int column)
    获取用于打印输出和显示的指定列的建议标题。 即指定列的别名,其中索引从1开始

  • 相关阅读:
    Python Day13:开放封闭原则、函数装饰器、全局局部变量
    Python Day12
    Python Day11
    Python Day10
    drf框架
    drf框架
    drf框架
    drf框架
    vue框架
    vue框架
  • 原文地址:https://www.cnblogs.com/xiaona19841010/p/5198595.html
Copyright © 2020-2023  润新知