<!--
	Title:关于如何把ResultSet中查询到的值放到自定义实体中的方法讨论
	Subject:J2EE Programming
	Author:Lovingshu
	Date:2012-02-12 18:28
	Remark:百思不得其解的我终于在向Sir的指导下,搞定了~感谢我亲爱的老师们!
-->
写在前面的话:记得在寒假的最后几天里(其实寒假也就没几天),我一直忙于写一个自己的框架,用于抗衡Hibernate和Spring,当时的想法太天真了,呵呵,不过回想过来,发现自己虽然天真,但是却收获不少,至少自己对Hibernate和Spring的内部构架有了进一步了解!到了最后,我才发现,与其抗衡,还不如同流合污,啊~不是啊,打错了,应该是还不如相互借鉴,经过向Sir的指导和自己的理解,所有问题都迎刃而解了!

接下来就是开始正式的代码叙述了!

第一步,需要一个方法来判定对象经过反射取出来的属性是不是普通类型,或者是不是类与类之间的引用类型!

/**
*用于判断一个字段是不是自定义实体数据类型
*/
private boolean isEntity(Field fid){
	//得到属性的类型的名称
	String fidTypes=fid.getType().getName();
		//判断依据:除开基本数据外,封装数据类型都是以java.lang或java.util开头的,利用这里点就可以进行判断了!
		if(
				fidTypes.startsWith("java.lang")
				||
				fidTypes.startsWith("java.util")
				||
				fidTypes.startsWith("int")
				||
				fidTypes.startsWith("float")
				||
				fidTypes.startsWith("double")
				||
				fidTypes.startsWith("long")
				||
				fidTypes.startsWith("short")
				||
				fidTypes.startsWith("byte")
			)
		{
			return false;
		}
		return true;
}

二,在设置值之前需要的工作,如下:

	//得到元数据
	ResultSetMateData rsmd=rs.getResultSetMateData();
	//暂时不用泛型
	List list=new ArrayList();
	//千万要注意的一点:rs.next()走完后就没有了,就像嫁出去的女儿一样!
	while(rs.next()){
		//之所以要重新实例化对象,是为了避免List中放入同一个对象!
		obj=obj.getType().newInstance();
		//调用接下来我们要讲到的方法:setValueToEntity;
		list.add(setValueToEntity(rs,rsmd,obj));
	}

三,接下来就是关键的了(其实当时自己已经想出来90%了,可惜就是忘记了一步~),放值了!
关键:注意这里为了达到无数层类与类之间的完整性,所以要用到递归的思想(超级绕,一不注意就晕了)!

private Object setValueToEntity(ResultSet rs,ResultSetMateData rsmd,Object obj){
	//将查询出来的列与实体中的属性进行比较!
	for(int i=1;i<=rsmd.getColumnCount();i++){
			for(Field fid : obj.getClass().getDeclaredFields()){
				//得到该列的名字
				String colName=rsmd.getColumnName(i);
				fid.setAccessible(true);
				//如果是实体对象
				if(isEntity(fid)){
					//实例化一个该类型的对象(注:这里之所以不用fid.get(obj),是因为有可能为空!)
					Object tempObj=fid.getType().newInstance();
					//哎呀呀呀呀~~就是这步啦,当时没成功就是差这步,哎,结果老师一直点马上就知道了~哈哈~再次感谢我亲爱的老师们,鼓掌~...
					setValue(rsmd, tempObj, rs);
					fid.set(obj, tempObj);
				}else{
					//如果是匹配的列
					if(colName.equalsIgnoreCase(fid.getName())){
						//获取类型
						String colType=fid.getType().getName();
						//根据类型放值,注,这里fid.setInt不能跟Integer的值!
						if(colType.equalsIgnoreCase("java.lang.integer")){
							fid.set(obj,new Integer(rs.getInt(colName)));
						}else if(colType.equalsIgnoreCase("java.lang.double")){
							fid.setDouble(obj, new Double(rs.getDouble(colName)));
						}else if(colType.equalsIgnoreCase("java.lang.Float")){
							fid.setFloat(obj, new Float(rs.getFloat(colName)));
						}else if(colType.equalsIgnoreCase("java.lang.Byte")){
							fid.setByte(obj, new Byte(rs.getByte(colName)));
						}else if(colType.equalsIgnoreCase("java.lang.short")){
							fid.setShort(obj, new Short(rs.getShort(colName)));
						}else if(colType.equalsIgnoreCase("java.lang.String")){
							fid.set(obj,rs.getString(colName));
						}else if(colType.equalsIgnoreCase("java.util.date")){
							fid.set(obj,rs.getDate(colName));
						}//.....后面还有其他数据,这里就不列全了
					}
				}
				fid.setAccessible(false);
			}
		}
		return obj;
}

Finally:就这样完成了RS与Entity之间的恩怨情仇,哈哈,现在只贴这些方法,等我哪天把我自己的这个框架写好了,我再把所有源码贴上来!
注意哦,不是用来抗衡Hibernate和Spring的哦,而是取长补短,相互促进的哦!

<!--
	Author:lovingshu
	Date:2012-02-12 18:54
	Remark:U guess what?~Yesterday is my 1st time to wacth 3D movie,Oh~man,That's ~that's really~really fantastic!
	And thanks to San wiht me!THANKS ~
-->