首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDBC——续写工具类

JDBC——续写工具类

作者头像
木瓜煲鸡脚
发布2019-08-06 14:47:16
5810
发布2019-08-06 14:47:16
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记

分析

  • 在原先的分析得出要用内省的方式去遍历domain类的属性
  • 我们可以做这样一个接口IResultHandle包含一个处理结果集的方法
  • 在实现类BeanHandle中使用内省需要知道是哪个字节码
  • 原先的RunSQL类中处理结果集的部分只需要调用IResultHandle的方法
  • 由于要确定是哪个字节码,所以BeanHandle对象的创建是要在各个DAO的实现类中
  • 并且需要有一个变量来存储是哪个字节码,并且在创建时决定即要有一个设置其值的构造方法
  • 这样各自的DAO实现查询时传各自的BeanHandle对象,最后统一处理

结果集处理

接口

public interface ResultSetHandle<T> {
  public T resultHandle(ResultSet re);
}

实现类

public class BeanHandle<T> implements ResultSetHandle<List<T>>{
  private Class<T> classType;
  public BeanHandle(Class<T> classType) {
    this.classType = classType;
  }
  @Override
  public List<T> resultHandle(ResultSet re){
    
    List<T> list = new ArrayList<>();
    try {
      while(re.next()) {
        T obj = classType.newInstance();
        BeanInfo bean = Introspector.getBeanInfo(classType,Object.class);
        PropertyDescriptor[] pds = bean.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {// 遍历传入的字节码类中的属性
          Object value = re.getObject(pd.getName());// 每个属性得到名字,即获得列名
          pd.getWriteMethod().invoke(obj, value);// 直接调用这个属性的set方法设置值
        }
        list.add(obj);
      }
    }catch (Exception e) {
      e.printStackTrace();
    }    
    return list;
  }
}

StuDaoImp

public class StudentDAO implements DAO {
/* 省略了其他方法
   RunSQL的query方法中需要传入结果集处理器
   并且不同的DAO实现类就会写上不同类型,和字节码
   这样就可以交给query统一解决
*/
  @Override
  public List<Student> get(int id) {
    String sql = "select * from student where id = ?";
    return RunSQL.query(sql, new BeanHandle<Student>(Student.class) , id);
  }

  @Override
  public List<Student> getAll() {
    String sql = "select * from student";
    return RunSQL.query(sql, new BeanHandle<Student>(Student.class));
  }
}

RunSQL

对于它的query方法

public static <T>T query(String sql,ResultSetHandle<T> result ,Object...x) {
    Connection con = null;
    PreparedStatement sta = null;
    ResultSet re = null;
    List<T> handleResult = new ArrayList<>();
    try {
      con = Database.getConnection();
      sta = con.prepareStatement(sql);
      for(int i = 0; i < x.length; i++) {
        sta.setObject(i+1,x[i]);
      }    
        re = sta.executeQuery();   
        return result.resultHandle(re);
    }catch (Exception e) {
      e.printStackTrace();
    }finally {
      Database.close(con, sta, re);
    }
    
    return null;
  }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档