<!--
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 ~
-->
ResultSet怎么映射成对象
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
下一篇:springcloud服务发现
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java循环创建对象内存溢出怎么解决
本文简要介绍了Java循环创建对象内存溢出如何解决。
java 内存溢出 对象引用