Java-通过反射获取数据库查询的数据

开发工具与关键技术:Java/MyEclipse 10
作者:张俊辉
撰写时间:2019年08月18日

本文章关于反射需要用到的方法函数有:
newInstance:创建对象的方法,
getMethod:返回一个 Method 对象,它反映此 Class 对象所表示的类或接 口的指定公共成员方法。
getDeclaredField:返回一个 Field 对象,该对象反映此 Class 对象所表示的类或 接口的指定已声明字段。
getSuperclass:返回表示此Class所表示的实体(类、接口、基本类型或 void)的超类(直接继承的父类)的Class。
关于ResultSet用到的方法:
ResultSetMetaData metaData=rs.getMetaData();:得到结果集(rs)的结构,比如字段数、字段名等。
int count =metaData.getColumnCount();:获取结果集列数。
代码如下:

public static <T> List<T> GetListDate(ResultSet rs,Class<T> obj){
	List<T> list = new ArrayList<T>();
	try {
		//得到结果集(rs)的结构,比如字段数、字段名等。
		ResultSetMetaData metaData=rs.getMetaData();
		//获取结果集列数int count =metaData.getColumnCount();
		while(rs.next()){
			//声明对象T t=obj.newInstance();
			for (int i = 1; i <= count; i++) {
				//---获取列名String name = metaData.getColumnName(i);
				// 首字母小写
				String name2 = name.substring(0, 1).toLowerCase() + name.substring(1);
				try {
					//获取列名在该类中对应的字段的数据类型
					Class<?> type=GetType(obj,name2);
					//---获取setter方法
					Method setMethod = obj.getMethod("set" + name, type);
					//---判断读取数据的类型
					if (type.isAssignableFrom(String.class)) {
						setMethod.invoke(t, rs.getString(name));
					}else if (type.isAssignableFrom(int.class)|| 
					type.isAssignableFrom(Integer.class)) {
							setMethod.invoke(t, rs.getInt(name));
					}else if (type.isAssignableFrom(Boolean.class) || 
					type.isAssignableFrom(boolean.class)) {
						setMethod.invoke(t, rs.getBoolean(name));
					}else if (type.isAssignableFrom(Double.class) || 
					type.isAssignableFrom(double.class)) {
						setMethod.invoke(t, rs.getDouble(name));
					}
				} catch (NoSuchMethodException e) {
					e.printStackTrace();
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}list.add(t);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} catch (InstantiationException e) {
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	}return list;
}
@SuppressWarnings("unchecked")
public static <T> Class<?> GetType(Class<T> obj,String name){
	Class<?> type=null;
	try {
		//---获取该类字段的数据类型
		type = obj.getDeclaredField(name).getType();
	} catch (NoSuchFieldException e) {
		//因getDeclaredField获取的字段不包括所继承父类的字段
		Class<T> obj2=(Class<T>)obj.getSuperclass();
		if(obj2!=null){
			//调用当前方法
			type=GetType(obj2,name);
		}
	}return type;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值