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

博客 动态
0 183
羽尘
羽尘 2022-03-02 10:56:00
悬赏:0 积分 收藏

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


1、原理:反射+内省

2、反射:动态创建对象

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




4、结果集处理:

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

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


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

public class BeanHandler<T> implements 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<T> implements 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;	}	}

本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15954065.html

posted @ 2022-03-02 10:52 一乐乐 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员