JDBC——续写工具类

#2020云栖大会#阿里云海量offer来啦!投简历、赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>> hot3.png

续写工具类 1.分析 2.结果集处理
3.之后的DAO实现类
4.之后的RunSQL

分析

  • 在原先的分析得出要用内省的方式去遍历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;  }




b7979ac5fe59782203c52486804f1db9e97.png 7ad0b187a8d2ae678236a6e49dbabcdee32.gif

勤学如春起之苗,不见其增,只有所长。辍学如磨刀之石,不见其增,日有所亏

46db21bdb71b20b70ce58d95908943ae4b9.jpg



3f6ef95898ee8d9d04da00fdd6305955df0.png

本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

posted @ 2019-08-03 15:02  木瓜煲鸡脚  阅读(24)  评论(0)    收藏  举报