import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;import javax.servlet.http.HttpServletRequest;import org.hibernate.Session;
import org.hibernate.Transaction;import com.hz.sessionFactory.HibernateSessionFactory;public class FsFactory {
    public static boolean getAdd(String tableName,HttpServletRequest request) throws Exception{
     Class clazz = Class.forName(tableName);
Object po = (Object) clazz.newInstance();
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs){
String mname = "set"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
if(!mname.equals("setId")){
Method me = clazz.getMethod(mname, f.getType());
Class fclass = f.getType();
Constructor con = fclass.getConstructor(String.class);
Object obj = con.newInstance(request.getParameter(f.getName())!=null?request.getParameter(f.getName()):"");
me.invoke(po, obj);
}
}
 RoleDao j=new RoleDao();
         boolean b=j.gettest(po);
         System.out.println(b+"添加数据库");
         return b;
    }
    private  boolean gettest(Object obj){
Session s = null;
Transaction tx = null;;
try{
    s = HibernateSessionFactory.getSession(); 
tx= s.beginTransaction();
s.save(obj);
tx.commit();
return true;
}catch (Exception e) {
tx.rollback();
e.printStackTrace();
return false;
} finally {
s.close();
}
}
}
小弟用的是struts,hibnate框架作的程序,在Dao封装一个添加的公共类,请各位做下评价,是否可用

解决方案 »

  1.   

    前台的text框的name名与bean的名相同
      

  2.   

    一般不建议把HttpRequest传到DAO层,这样会增加MVC层和后面的强偶合。不利于扩展
      

  3.   

    使用闭包列传持久层需要的最大参数集合。发现HttpRequest是弱关系,取消。FsFactory 起名让人误解为工厂模式,其实内部使用的是普通的关系操作,而不是获得产品对象的总门面。
      

  4.   

    可以很负责任的说:不可用。
    既然你用了hibernate,那么实现公用save、update、delete的普遍做法是定义一个实现了公用操作的DAO类,让所有其他DAO都继承这个。方法参数是Object,实现是取得session,调用session的save、update、delete方法。
    你写的这个可以说是没有价值的,如果只是想练习反射封装数据,代码可以参考struts如何ActionForm的,具体就是RequestUtils的populate方法。
      

  5.   

    漏了句话:你传request不如传ActionForm,虽然都是破坏mvc分层,传ActionForm可以用BeanUtil的copyProperties方法,比自己写强。
      

  6.   

    个人认为这样做不好,直接从request就到数据库了,中间省略了业务逻辑层;难道你的系统不需要业务逻辑层?你的这种实现的前提是要数据库中的字段与页面表单的一致才可以,如果两边的字段不一致,那你还得另外写程序去处理,不可取~~我觉得10楼说的对,如果只是练习反射的话,可以参考Struts中请求Action时构造Form的实现。
      

  7.   

    如果我把request 换成 Map 集合,可以吗?
      

  8.   

    你想做的无非是直接从Request填充VO属性。但是你想没想过,一个VO的所有属性可能不会完全来自浏览器提交数据,而且还涉及到多种数据类型,如整数、浮点数、日期、文件。表单提交的数据要经过转换、整理才能进库。
    所以才会有中间过渡用的DTO,ActionForm就是这个功能。Struts准备好的你不用,非要自己写。而Struts的优势就是表示层的ActionForm和控制层的Action,现在你非要抛开ActionForm,那何必用Struts。
    最经典的代码就是Struts填充formbean了,自己去看源码吧。
      

  9.   

    String mname = "set"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);这段代码就有问题你封装的东西根本就没有按照 JavaBeans 规范提供的类和方法来做
      

  10.   

    JavaBean 的属性并不是从 Field 中获得的,而是从方法名中获得的!