好多朋友在使用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的群空间中下载