博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射实现不同对象相同代码地对象查询和封装
阅读量:7208 次
发布时间:2019-06-29

本文共 1670 字,大约阅读时间需要 5 分钟。

背景

在操作数据库进行对象查询的过程中,对于数据库的增删改查操作,我们常常烦恼于需要为不同的对象类写不同的查询方法。比如,user类和student类,在数据库映射的表不同,类内部的属性不同,因此它们需要不同的SQL查询语句和不同属性的seter、geter方法来将查询的数据封装到对象中。对象类少还不说,要是数量过多,就需要大量的JDBC查询代码。因此我们需要这样一段可重用的代码来完成不同类的查询封装操作。经过我一下午地编写、测试,终于,得到一份可以完成我们需要功能的Java代码。

实现

前端需求可以是通过以下代码:

ArrayList result =new com.jkx.web.Query.Web_TestQuery(Test).QueryAll("test");复制代码

来得到一个查询好了的装有对象的集合来进行对象属性的展示,那么,我们需要完成的就是得到这样一个集合(此处Test应为该对象的实例,test为数据库相应表名)。

通用的查询类:

public  Web_TestQuery(Object obj) {      //obj即为传过来的Test	this.object=obj;       //此处需预先申明属性:O  bject  object;	objclass=obj.getClass();}  public ArrayList QueryAll(String TableName) {	ArrayList AlistTest = new ArrayList();	ResultSet rs=null; //【此处省略获取连接,查询,得到ResultSet rs】	while (rs.next()) {		Field[] fields = objclass.getDeclaredFields();		int i=1;		for(Field field:fields){ 			PropertyDescriptor pd = new PropertyDescriptor(field.getName(), objclass);			Method set = pd.getWriteMethod();			object=  rs.getObject(i);			i++;		}		AlistTest.add(object);	 }	return AlistTest;}复制代码

最大的Bug出现

当你实现了上面的代码后,运行会发现,读取的数据全是ResultSet最后一条数据。原因是:

我们在while (rs.next()) { }循环开始时没有再次实例化对象object,即我们通过 for(Field field:fields)不停地遍历对象属性并赋值仅仅是不停地传过来的这个唯一对象赋值(内存中仅有的一个对象)。因此虽然通过AlistTest.add(object) 加入了和数据库总记录数相同条数的数据,但是这些数据的指针均指向内存中同一个对象。所以,我们需要每次在while (rs.next()) { }循环开始时都要实例化对象object一次,这样才能有不同属性值的不同对象存在于集合中。

解决该Bug:


我想,对于我来说,这个才是这段代码最难的地方了,至少我是用了许多方式都没有完成这个对象的实例化。因为我不知道传入对象的类型,故无法new一个新对象。 最后才想到,实例化对象的方式不止new一种,同样可以通过 object= objclass.newInstance()来实现实例化。这样,Java虚拟机也同样知道object对象的类型,类型就是传入的Test的类类型( objclass )。至此,我们就完成了Java不同对象的相同查询及封装方法的代码实现。当然此代码不仅可以完成查询操作,增删改操作同样可以,只是sql语句不同而已,并且不会返回数据集了。 注:在对象类的Javabean当中,类属性申明顺序必须和数据库相应字段名顺序一致,不然必然出现乱赋值或者无法赋值现象。

转载地址:http://aylum.baihongyu.com/

你可能感兴趣的文章
JAVA Calendar具体解释
查看>>
MongoDB入门简单介绍
查看>>
Git show-branch显示提交信息
查看>>
秒杀 ILSpy 等反编译利器 DotNet Resolver
查看>>
SharePoint 2013 中代码创建列表查阅项字段
查看>>
2014仲秋校招之面试篇
查看>>
负载均衡研究 基础
查看>>
10.cadence.自定义焊盘的创建[原创]
查看>>
shell编程总结
查看>>
Docker源码分析(七):Docker Container网络 (上)
查看>>
一些旁门左道
查看>>
Common Pitfalls In Machine Learning Projects
查看>>
Android内存泄漏分析及调试
查看>>
todoing
查看>>
[Cocos2d-x]Cocos2d-x 3.2 学习笔记
查看>>
进程调度
查看>>
使用代码为TextView设置drawableLeft
查看>>
Android开发(十八)——头部、中部、底部布局技巧
查看>>
Egret 集成第三方库 记录
查看>>
同源策略——浏览器安全卫士
查看>>