续写工具类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; }
勤学如春起之苗,不见其增,只有所长。辍学如磨刀之石,不见其增,日有所亏