1一乐

V1

2022/03/02阅读:40主题:默认主题

(反射+内省机制的运用)处理jdbc的结果集



1、原理:反射+内省

2、反射:动态创建对象

3、内省:动态处理对象的属性值




4、结果集处理:

(1)把结果集中的一行数据,封装成一个对象,专门针对结果集中只有一行数据的情况。

(2)处理结果集--多行数据,封装成多个对象(list)


专门针对结果集中只有一行数据的情况(把结果集中的一行数据,封装成一个对象) BeanHandler

public class BeanHandler<Timplements IResultHandler2<T{
 private Class<T> classType; //因为需要把结果集的一行封装成一个对象【❀ 则需要有对象的存在】,通过反射技术,动态编译是才传入具体类型的对象
 
 public BeanHandler(Class<T> classType) //通过构造器,传入具体的类型的,以便后边通过反射获取到对应类型的具体对象
  this.classType = classType;
 }

 @Override
 public T handle(ResultSet rs) throws Exception {
  //1、创建对应的类的一个对象
  T obj = classType.newInstance();
  //2、取出结果集中当前光标所在行的某一列的数据
  BeanInfo beanInfo = Introspector.getBeanInfo(classType, Object.class);
  PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
     if(rs.next()) {
      for(PropertyDescriptor pd : pds) {
       //获取对象的属性名【属性名和列名相同】
       String columnName = pd.getName();
       Object val = rs.getObject(columnName);
       //3、调用该对象的setter方法,把某一列的数据设置进去
       pd.getWriteMethod().invoke(obj, val);
      }
     }
  return obj;
 }
}

针对结果集中多行数据的情况(把结果集中的每一行数据,封装成一个对象) BeanHandler

public class BeanListHandler<Timplements IResultHandler2<List<T>> {
 //利用反射技术,先拥有类
 private Class<T> classType;
 public BeanListHandler(Class<T> classType) {
  this.classType = classType;
 }
 @Override
 public List<T> handle(ResultSet rs) throws Exception {
  List<T> list = new ArrayList<>();
  while(rs.next()) {
   T obj = classType.newInstance();
   BeanInfo benInfo = Introspector.getBeanInfo(classType, Object.class);
   PropertyDescriptor[] pds = benInfo.getPropertyDescriptors();
   for(PropertyDescriptor pd : pds) {
    String columnName = pd.getName();
    Object value = rs.getObject(columnName);
    //设置对象属性值
    pd.getWriteMethod().invoke(obj, value);
   }
   list.add(obj);
  }
  return list;
 }

 
}

分类:

后端

标签:

后端

作者介绍

1一乐
V1