怎样将查询出来的list集合 赋值给BO(高手请进)

garnettcwm 2008-11-24 11:40:38
我通过查询数据库得到一个list集合,里面有3个对象(A1,A2,A3)
然后我建了一个bean 用于页面显示时用 bean里面有这3个对象包含的所有属性

正常情况下 我得一个一个set进去,但是这些属性很多,有没有什么简单的方法可以实现自动set啊??????

如A1对象 name sex address age
A2对象 name sex address age
A3对象 name sex address age
另外我还要在bean里set一个 3个age相加的属性(sumAge)

请问怎么实现啊????
...全文
271 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hl_ghost 2008-11-24
  • 打赏
  • 举报
回复
把request中的参数放到目标对象中,如果你能看懂这个,那你那个需求也就不成问题了
只支持Integer,String,Date(日期格式为yyyy-mm-dd)

public static void fromRequest(Object target, HttpServletRequest request)
throws Exception {
Class action = target.getClass();

Field[] fields = action.getDeclaredFields();
for (Field field : fields) {
String fieldType = field.getType().getSimpleName();
String fieldValue = request.getParameter(field.getName());
if (fieldValue == null || "".equals(fieldValue))
continue;
Method method = action.getMethod("set"
+ new StringBuffer(field.getName()).replace(0, 1, field
.getName().substring(0, 1).toUpperCase()),
new Class[] { field.getType() });
if (method == null)
continue;
if (fieldType.equals("Integer") || fieldType.equals("String")
|| fieldType.equals("Double")) {
if (fieldValue != null) {
if (fieldType.equals("Integer"))
method.invoke(target, new Object[] { Integer
.parseInt(fieldValue) });
else if (fieldType.equals("Double"))
method.invoke(target, new Object[] { Double
.parseDouble(fieldValue) });
else
method.invoke(target, new Object[] { fieldValue });

}
} else if (fieldType.equals("Date")) {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-mm-dd");
Date date = sd.parse(fieldValue);

method.invoke(target,new Object[]{date });
}
}
}
lisl2003 2008-11-24
  • 打赏
  • 举报
回复
感觉会比较麻烦。

反射的话,就是取A对像属性值,放到B属性里,我见到的做法是让B属性的类型和名字与A属性名相同,方便操作。

问题是,如果出现属性名相同的怎么办?
garnettcwm 2008-11-24
  • 打赏
  • 举报
回复
map的话也要一个一个put进去~ 太麻烦了 反射机制怎么做能具体点吗?
sunwei_07 2008-11-24
  • 打赏
  • 举报
回复
写个方法吧~~ 或者你在SQL语句里直接进行相加操作,然后把结果放置MAP里,也可以直接使用
boboo_2000_0 2008-11-24
  • 打赏
  • 举报
回复
楼主可以用反射机制试一下。
lisl2003 2008-11-24
  • 打赏
  • 举报
回复
参考5楼的代码写的一个方法:

public class A {
private int i;
private long l;
private char c;
private String str;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public long getL() {
return l;
}
public void setL(long l) {
this.l = l;
}
public char getC() {
return c;
}
public void setC(char c) {
this.c = c;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}


public class B {//和类A一模一样
private int i;
private long l;
private char c;
private String str;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public long getL() {
return l;
}
public void setL(long l) {
this.l = l;
}
public char getC() {
return c;
}
public void setC(char c) {
this.c = c;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}



public class Main {
public static void main(String[] args){
A a = new A();
a.setI(1);
a.setL(2L);
a.setC('c');
a.setStr("str");//初始化A

try {
B b = covertA2B(a);
System.out.println(b.getStr());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

}
public static B covertA2B(A a) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
B b = new B();

Class clazz1 = a.getClass();
Field[] fields1 = clazz1.getDeclaredFields();
Class clazz2 = b.getClass();
for(Field field1 : fields1){
System.out.println("field1.getName():"+field1.getName());

String methodName1 = "get"+ new StringBuffer(field1.getName()).replace(0, 1, field1.getName().substring(0, 1).toUpperCase());//构造字段的get方法名
Method method1 = clazz1.getMethod(methodName1);//获得字段的get方法
Object value = method1.invoke(a);//得到字段的值

String methodName2 = "set"+ new StringBuffer(field1.getName()).replace(0, 1, field1.getName().substring(0, 1).toUpperCase());//构造字段的set方法名
Method method2 = clazz2.getMethod(methodName2, new Class[] { field1.getType() });//获得字段的set方法
method2.invoke(b, value);//给字段赋值

}

return b;
}
}


第一次用反射写字段拷贝,十分简陋,欢迎拍砖~
cy729215495 2008-11-24
  • 打赏
  • 举报
回复
有,struts框架的BeanUtils的一个静态方法可以拷贝两个对象的属性;
BeanUtils.copyProperties(dest, orig),前面是目的对象,也就是你要显示页面上的,后面就是你从数据库里面查的bean,要保证这两个bean的属性相同.
hl_ghost 2008-11-24
  • 打赏
  • 举报
回复
简单说下思路:
  从目标对象中遍历其属性(如Integer id,String name),然后从request中找是否有id(String pid =request.getParameter("id")),最后跟据目标对象id的类型把pid转成相应类型set到目标对象的相应属性里。
sunwei_07 2008-11-24
  • 打赏
  • 举报
回复

PropertyDescriptor pd = new PropertyDescriptor(name, class);
Method mt = pd.getWriteMethod();
try {
mt.invoke(form,new Object[]{value});
} catch (Exception e) {
。。。。
}

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧