当前位置: 代码迷 >> J2EE >> 关于DAO的有关问题
  详细解决方案

关于DAO的有关问题

热度:241   发布时间:2016-04-22 03:38:28.0
关于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层面设置缓存策略
  相关解决方案