Java反射实现不同对象相同代码地对象查询和封装

原创 2016年06月01日 15:36:26

Java反射实现不同对象相同代码地对象查询和封装

    在操作数据库进行对象查询的过程中,对于数据库的增删改查操作,我们常常烦恼于需要为不同的对象类写不同的查询方法。比如,user类和student类,在数据库映射的表不同,类内部的属性不同,因此它们需要不同的SQL查询语句和不同属性的seter、geter方法来将查询的数据封装到对象中。对象类少还不说,要是数量过多,就需要大量的查询类代码。因此我们需要这样一段可重用的代码来完成不同类的查询封装操作。经过我一下午地编写、测试,终于,得到一份可以完成我们需要功能的Java代码。如下:
    首先,JSP页面的需求是:通过一段Java代码如:ArrayList<Object> result =new com.jkx.web.Query.Web_TestQuery(Test).QueryAll("test");得到一个查询好了的装有对象的集合来进行对象属性的显示,那么,我们需要完成的就是得到这样一个集合。此处Test应为该对象的实例,test为数据库相应表名。
   那么,com.jkx.web.Query.Web_TestQuery类中应有构造方法:
          
public  Web_TestQuery(Object obj) {      //obj即为传过来的Test
                this.object=obj;       //此处需预先申明属性:Object object;
                objclass=obj.getClass();
               } 
    因此,通用类的查询类应该这样命名:
          public ArrayList<Object> QueryAll(String TableName) {   //要满足通用所有对象,即不知道对象的类类型是什么,故用Object代替
                 ArrayList<Object> AlistTest = new ArrayList<Object>();    //这是我们需要的这个集合,不过现在还是空的。
        //之后就是一般地查询步骤,获取连接,查询,得到ResultSet rs,然后,在while (rs.next()) { }循环中添加以下代码:
        Field[] fields = objclass.getDeclaredFields();   //获得该类的所有属性,Field[]需导入包java.lang.reflect.Field
        int i=1;
        for(Field field:fields){     //遍历 fields ,获取每一个属性
            PropertyDescriptor pd = new PropertyDescriptor(field.getName(), objclass);
            Method set = pd.getWriteMethod();   //获得属性名field.getName()的set方法
            object=rs.getObject(i);//因无法得知ield.getName()属性类型,故rs.getObject(i)
            i++;                                                   
           }
         AlistTest.add(object); 
        最后,返回 集合
AlistTest即可。然而,当你们实现了上面的代码后,运行会发现,读取的数据全是ResultSet最后一条数据,那是因为,我们在while (rs.next()) { }循环开始时没有再次实例化对象object,即我们通过for(Field field:fields)不停地遍历对象属性并赋值仅仅是不停地传过来的这个唯一对象赋值(内存中仅有的一个对象)。因此虽然通过AlistTest.add(object)加入了和数据库总记录数相同条数的数据,但是这些数据的指针均指向内存中同一个对象。所以,我们需要每次在while (rs.next()) { }循环开始时都要实例化对象object一次,这样才能有不同属性值的不同对象存在于集合中。我想,对于我来说,这个才是这段代码最难的地方了,至少我是用了许多方式都没有完成这个对象的实例化。因为我不知道传入对象的类型,故无法new一个新对象。最后,才想到,实例化对象的方式不止new一种,同样可以通过object=objclass.newInstance()来实现实例化。这样,Java虚拟机也同样知道了object对象的类型,类型就是传入的Test的类类型(objclass)。至此,我们完成了Java不同对象的相同查询及封装方法的代码实现。当然此代码不仅可以完成查询操作,增删改操作同样可以,只是sql语句不同而已并且不会返回数据集了。
        注:在对象类的Javabean当中,类属性申明顺序必须和数据库相应字段名顺序一致,不然必然出现乱赋值或者无法赋值现象。
版权声明:本文为博主原创文章,未经博主允许不得转载。

java编程中减少一个类中重复代码的窍门

有时候我们会遇到这样的情况,一个类中的许多方法要调用其他类的方法。         比如类1中有方法1和方法2要调用类2中的方法3,这个时候如果在方法1和方法2中都写的话会有几句重复的代码,就是声明部...
  • bestcxx
  • bestcxx
  • 2013年12月08日 17:57
  • 1575

【送给新手】重复代码解决示例一

举例说明了遇到重复代码应该如何去处理。
  • isea533
  • isea533
  • 2013年07月05日 11:47
  • 4289

通过JAVA反射实现简单的ORM,将查询结果封装为对象

package org.test;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.Conn...
  • a600423444
  • a600423444
  • 2011年06月12日 22:36
  • 3808

JDBC之利用反射技术将查询结果封装为对象

1、User.java中的代码 package cn.itcast.jdbc.domain; import java.util.Date; /** * 用户对象 */ public clas...
  • BruceLeeNumberOne
  • BruceLeeNumberOne
  • 2017年07月16日 13:40
  • 535

Java利用反射实现对象之间相同属性复制

package com.utils; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Colle...
  • delongcpp
  • delongcpp
  • 2015年01月27日 15:08
  • 5583

利用java反射机制对比两对象同属性名的属性值

使用反射机制获取两个对象中属性名相同属性值不同的把属性名及两个对象的属性值...
  • k13670716379
  • k13670716379
  • 2017年01月11日 11:05
  • 3056

java利用反射完成不同类之间相同属性的复制

如果我们有两个不同的类对象,但他们具有相同的属性,我们怎么将一个对象的属性值复制给另外一个对象呢?我们可以利用反射完成这个需求:首先我们利用反射得到两个对象的所有属性,再通过循环得到源对象(被复制的对...
  • angelwings_hao
  • angelwings_hao
  • 2014年09月22日 16:48
  • 2196

利用java反射将结果集封装成为对象和对象集合

java反射机制 结果集封装为对象和对象集合
  • alleged
  • alleged
  • 2017年05月25日 14:37
  • 816

JAVA 利用反射机制查询数据库返回相应对象

public static void main(String [] rags){ SQLHepler SH=new SQLHepler(); String sql="select * fro...
  • whzhaochao
  • whzhaochao
  • 2014年03月04日 20:49
  • 1718

利用java反射将map值封装到对象中

有时候我们需要将map里面的值依据键依次封装到对象里面。 这时需要简单的用下反射。 例子如下:public void newLoadFromMap(Map map) throws IllegalA...
  • u011250851
  • u011250851
  • 2016年07月28日 14:56
  • 1618
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java反射实现不同对象相同代码地对象查询和封装
举报原因:
原因补充:

(最多只允许输入30个字)