日期:2014-05-20  浏览次数:20805 次

关于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层面设置缓存策略