JAVA 关于Bean的自动封装

本文介绍如何使用 Apache Commons BeanUtils 库自动将 Spring JdbcTemplate 查询结果封装到 JavaBean 中,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好多朋友在使用Spring框架和Structs框架结合开发项目,而不使用Hibernate的时候。当使用Spring框架的JDBCTemplate执行查寻时返回的是一个 List集合, List 中存储了一个一个的HashSet 每一个HashSet为表中的一行数据,HashSet中存储着一个一个的 Map集合,每个Map集合中存储着 列名=值 的表数据
也就是说如果我们通过String进行一个查寻操作,反加一个List集合后,我们必须要做三步:
1 遍历List集合,取每一个Set
2 遍历Set集合,取每一个Map
3 通过map集合中get方法取出每列对就的数据
这是具体的实现方法
public class Test
{
public void parse(JdbcTemplate tem){

List list = tem.queryForList("select * from jobs");
for(int i = 0; i<list.size(); i++)
{
   Set set = (Set)list.get(i);
   Iterator it = set.iterator();
   while(it.hasNext()){
    Map map = (Map)it.next();
    System.out.println("job_id="+map.get("job_id"));
   }
}
}
}
从这个方法可以看出,每次进行一个查寻都要花长时间去解悉这个集合是非常麻烦的,我们多么希望可以像Hibernate那样可以自动进行封装.
Apache公司替我们想到了这个点,我们可以通过commons包中下面的这两个方法来实现JavaBean的自动封装
org.apache.commons.beanutils.ConvertUtils;
这个类用于把参数转换成相应的数据类型
org.apache.commons.beanutils.PropertyUtils;
这个类用于把参数加入到Bean中或取得Bean中的参数类型
先介绍一个这两个类的用法
PropertyUtils.getProperty(Objct obj, String name)
这个方法用于从类obj中取得name参数的类形
PropertyUtils.setProperty(Object arg0, String arg1, Objet arg2)
这个方法用于把arg2赋给对象 arg0的arg1参数 取个例子
class Bean{
private String name;
public void setName(String name){
   this.name=name;
}
}
clas Test{
public static void main(String[] args){
Bean b = new Bean();
PropertyUtils.setProperty(b, "name", "abc");
//这样在对象b中name的值就给赋上abc了
}
}

ConvertUtils.convert(String arg0,Class arg1)
这个方法用于把arg0转换成arg1类型的类对象
如 Integer g = ConvertUtils.convert("1111",Integer.class);
将自动把 字符串"1111"转换成Integer类型

下面是一个关于这三个方法的简单使用 将实现自动把一个List集合中的Map集合封装到一个javaBean中,实现了javaBean的自动封装


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.PropertyUtils;

public class Test {

/**
* 此方法实现JDBCTemplate
* 返回的Map集合对数据的自动
* 封装功能
* List集合存储着一系列的MAP
* 对象,obj为一个javaBean
* @param listMap集合
* @param objjavaBean对象
* @return
*/
public List parse(List list,Class obj){
   //生成集合
   ArrayList ary = new ArrayList();
   //遍历集合中的所有数据
   for(int i = 0; i<list.size(); i++){
    try {
     ////生成对象实历 将MAP中的所有参数封装到对象中
     Object o = this.addProperty( (Map)list.get(i),
                            obj.newInstance() );
     //把对象加入到集合中
     ary.add(o);
    } catch (InstantiationException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IllegalAccessException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   //返回封装好的集合
   return list;
}


/**
* 跟据名称和值的集合封装javaBean
* javaBean中的属性名必须和MAP中的
* KEY对应
* 此方法用于自动将MAP中的值封装到
* javaBean中
* 例子:
* Bean类 user
*/   
public class UserBean {
     private String name;
     private String value;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public String getValue() {
      return value;
     }
     public void setValue(String value) {
      this.value = value;
     }
    }
/**Map对象中的值为 name=aaa,value=bbb
调用方法
addProperty(map,user);
*将自动将map中的值赋给user类
*此方法结合Spring框架的jdbcTemplete将非
*常有用
* @param map存储着名称和值集合
* @param obj要封装的对象
* @return封装好的对象
*/
public Object addProperty(Map map,Object obj){
   //遍历所有名称
   Iterator it = map.keySet().iterator();
   while(it.hasNext()){
    //取得名称
    String name = it.next().toString();
    //取得值
    String value = map.get(name).toString();
   
    try{
     //取得值的类形
     Class type = PropertyUtils.getPropertyType(obj, name);
    
     if(type!=null){
      //设置参数
      PropertyUtils.setProperty(obj, name,ConvertUtils.convert(value, type));
    
     }
    }catch(Exception ex){
     ex.printStackTrace();
    }
   
   }
   return obj;
  
}


public static void main(String[] args) {
   Map map = new HashMap();
   map.put("name", "aaa");
   map.put("value", "bbb");
  
   List list = new ArrayList();
   Map map1 = new HashMap();
   map1.put("name", "ddd");
   map1.put("value", "kkk");
   list.add(map1);
   list.add(map);
   list = new Test().parse(list, Test.UserBean.class);
   System.out.println(list);
}

}

如果哪位朋友对上面的这个小程序有不理解的地方,欢迎到群1871000里面去发问,在这里发留言也行.
另外我基于Spring和Structs框架,自己开发了一个小型的数据封装框架,它是基与Spring的JdbcTemplate模版,实现数据的自动封装。它并不会把所有数据全部加载入内存,大大减小了对内存的消耗。对于使用Spring框架而不用Hibernate的项目来说是个不错的选择。
它主要是覆写了Spring中JdbcTemplate中的查寻方法。如果哪个朋友喜欢的话可以到群1871000的群空间中下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值