读书人

关于DAO的有关问题

发布时间: 2012-01-14 20:02:35 作者: rapoo

关于DAO的问题
看到很多资料在使用spring框架后,为每个表对应的POJO写一个DAO接口,再写一个实现类,每个接口里都是简单的CRUD操作,感觉实在很麻烦
以前的项目里直接用struts+hibernate,有一个DbOperate类,来历不知,但它的CRUD方法可以对所有类操作,这样不是更简单?各位瞧瞧

Java code
public class DbOperate {    public boolean save(Object obj) throws HibernateException {        boolean result = false;        Session session = SessionFactory.currentSession();        if (obj != null) {            Transaction tx = null;            try {                tx = session.beginTransaction();                session.save(obj);                tx.commit();                result = true;            } catch (HibernateException e) {                if (tx != null) {                    tx.rollback();                    result = false;                }            } finally {                session.close();                return result;            }        }        return result;    }    public void update(Object obj) throws HibernateException {        Session session = SessionFactory.currentSession();        if (obj != null) {            Transaction tx = null;            try {                tx = session.beginTransaction();                ////System.out.println("aaaa");                session.update(obj);                ////System.out.println("bbbb");                tx.commit();                ////System.out.println("cccc");            } catch (HibernateException e) {                if (tx != null)                    tx.rollback();                throw e;            }        }        session.close();    }    public void delete(Object obj) throws HibernateException {        Session session = SessionFactory.currentSession();        if (obj != null) {            Transaction tx = null;            try {                tx = session.beginTransaction();                session.delete(obj);                tx.commit();            } catch (HibernateException e) {                if (tx != null)                    tx.rollback();                throw e;            }        }        session.close();    }    public void saveOrUpdate(Object obj) throws HibernateException {        Session session = SessionFactory.currentSession();        if (obj != null) {            Transaction tx = null;            try {                tx = session.beginTransaction();                session.saveOrUpdate(obj);                tx.commit();            } catch (HibernateException e) {                if (tx != null)                    tx.rollback();                throw e;            }        }        session.close();    }    public List find(String sql) throws HibernateException {        Session session = SessionFactory.currentSession();        List list = null;        Transaction tx = null;        try {            tx = session.beginTransaction();            Query query = session.createQuery(sql);            list = query.list();            tx.commit();        } catch (HibernateException e) {            if (tx != null)                tx.rollback();            throw e;        }        session.close();        return list;    }}


[解决办法]
实际方面:
面向接口编程,很多时候,接口是架构那边的人给你写好的,你过来搞的dao就是实现接口,然后实现功能,算是个具体工作套路;
理论方面:
接口可以作为模板,现在的编程已经不是面对对象了,是面对组件和更高层次的面对服务,EJB的组件与web services都是暴露接口给人调用,难道你给人暴露实现类...不让人给你反编译给改掉才怪;再有现在某些SOA框架都是集成所有的协议来传输的,协议最多也就能将接口XML化,实现类几乎不可能,协议XML化也不可能带上业务逻辑,而且协议本身就是忽视具体语言的,这是大的方面上讲;


[解决办法]
哈哈,你们都错了,要根据实际业务来地,不要那么死板,如果业务简单,当然用楼主说的没问题,但是业务复杂的话,随着project的规模膨胀 单DAO或单SERVICE都会极度膨胀,况且service层是不允许有sql代码的,一个DAO根本满足不了需求,而且面向对象的话,一个service就应该调用多个dao才合理,也极易扩展
[解决办法]
个人更支持写一个通用DAO,无非是POJO返回或参数类型不同,DAO层对象用Object基类,在具体service强制转化即可,没必要给每一个表写一堆差不多重复的CURD DAO,这么多DAO看着就累,至于事务spring既然提供了强大的按接口编程模式以及结合AOP,只要配置在service层的通用interface即可,也没必要给每个service具体实现类配置一份,另外如果有人用spring-modules缓存的话也建议只要在interface层面设置缓存策略


[解决办法]
我觉得DAO的好处与抽象工厂的好处是一致的,因为它本来是使用抽象工厂实现的。
比如我们有User,Admin2个类:

Java code
public class User {        /** Creates a new instance of User */    public User() {}    private String firstName;    private String lastName;    private String email;    private String password;    private String phone;    private String fax;    seter and geter...} 

读书人网 >J2EE开发

热点推荐