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


1、原理:反射+内省
2、反射:动态创建对象
3、内省:动态处理对象的属性值


4、结果集处理:
(1)把结果集中的一行数据,封装成一个对象,专门针对结果集中只有一行数据的情况。 (2)处理结果集--多行数据,封装成多个对象(list)
?专门针对结果集中只有一行数据的情况(把结果集中的一行数据,封装成一个对象) BeanHandler

public class BeanHandler implements IResultHandler2 { private Class classType; //因为需要把结果集的一行封装成一个对象【? 则需要有对象的存在】,通过反射技术,动态编译是才传入具体类型的对象 public BeanHandler(Class 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; } }


【(反射+内省机制的运用)处理jdbc的结果集】?针对结果集中多行数据的情况(把结果集中的每一行数据,封装成一个对象) BeanHandler
public class BeanListHandler implements IResultHandler2> { //利用反射技术,先拥有类 private Class classType; public BeanListHandler(Class classType) { this.classType = classType; } @Override public List handle(ResultSet rs) throws Exception { List 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 = https://www.it610.com/article/rs.getObject(columnName); //设置对象属性值 pd.getWriteMethod().invoke(obj, value); } list.add(obj); } return list; } }

    推荐阅读