为什么每个pojo都要对应一个DAO,如user.java--->userDao.java,org.java-->orgDao.java   我觉得直接用一个DAO就已经能够操作所有的pojo类了如:user.java,org.java。。---->DAO.java,我觉得这样很简单,持久层变得很容易维护,也很容易更换。
这样做的好处是什么,怎样样体现出来,不要告诉我一些空话,提高系统灵活性,搞高可维护性,。我要的是你说搞高了灵活性,那么是怎样搞高的,为什么能提高,不要空话。

解决方案 »

  1.   

    并非每一个POJO都得对应一个DAO你完全可以按照功能拆分对应DAO这样写只是方便Service层引用 事务提交
      

  2.   

    每一个POJO所需的持久性功能并不是完全相同的,但是可以把公用部分(如基本的CUDE)抽出来。
    一个POJO对应一个DAO,这样做也方便开发人员查看代码呀。
      

  3.   

    如果对于事务的控制我交由spring管理,我没必要去涉足啊
    如果方便service层调用,我直接一个公用的dao注入到service里面去,这样不是更方便吗?我没必要每一个类都得注入一个对应的dao啊
      

  4.   

    Dao主要是定义一个接口,然后有不同的实现类操作不同的数据库,比如 UserImplByMySql,UserImplBySQL
    ,这样只要在Service里定义一个Dao就可以了,如果要更改数据库的话,在beans里更改Dao的实现类就可以了.
    如果不跨库的话没必要定义接口,直接实现就行.不知道我解释清楚没.
      

  5.   

    按照你的想法所有的Service都可以做成一个Service.java注射到Action里;所有的Action也可以做成一个Action.java。
    这样会方便么???功能再拓展怎么办???
    OOAD中的一个目标就是要把类的职能单一化。类的职能单一后,才能真正达到对拓展开放,对修改关闭。不知道这样说你能明白不。
      

  6.   


    這樣的話,你的一個公用的dao,會有很多的方法內容,增加該類的代碼量 ,加載這個類的時候耗時更長
    每一個實體類,對應一個dao,每一個dao又對應每一個service這樣一對一的關係很清晰,並且,每個業務層的業務不同,這就要求dao裏面實現的方法不同。而每個dao有針對於一個實體類,對其專門的管理,如果你把所有的業務方法都放到一個dao裏面維護起來那麼多代碼,不方便找。更不方便後來人員的對其維護,這樣的框架,把bean ---dao----service----action分層聯繫起來線路清晰,按照這個規則--------無論是你,或者是後序人員更改和修改程序都有據可循另外,如果只有一個dao,每次維護都有更改該類,不方便版本控制一般都是一個人負責一個模塊,把這些分開,分層,無論你維護那一個業務層,都不會影響到其他的業務方法按照你的想法,把所以的業務方法都放在一個dao裏面,試問,維護其中某一個也為方法,勢必影響其他業務方法
    他們在同一個dao裏面。把業務方法,分層,分開,就是為了,方便後期維護,希望你能明白。
      

  7.   

    我的意思是我的DAO层只用这样简单一个接口,一个实现类来实现如下:
    public interface IDAOBase<T> {
    /**
     * 刷出并清空Session
     */
    public void flushAndClearSession(); /**
     * 保存实体
     */
    public void save(T o) throws SQLException; /**
     * 更新实体
     */
    public void update(T o) throws SQLException; /**
     * 更新或者保存实体
     */
    public void saveorupdate(T o) throws SQLException; /**
     * 根据ID删除实体
     */ public void delete(String obj, String string) throws SQLException;

    /**
     * 根据ID查找实体
     */
    public T findById(Class clazz, Serializable id) throws SQLException; /**
     * 根据条件查找所有实体且分页
     */
    public List<T> findByCriteria(Class clazz, int currentpage, int rows, String s)
    throws SQLException; /**
     * 根据字符串查找实体
     */
    public List<T> findTo(String obj) throws SQLException; /**
     * 根据字符串查找实体且分页
     */
    public List<T> findTopage(String obj, int currentpage, int rows)
    throws SQLException; /**
     * 前台根据字符串查找实体且分页
     */
    public List<T> findToweb(String obj, int currentpage, int rows)
    throws SQLException; /**
     * 刷新缓存
     */
    public void flush() throws SQLException; /**
     * 清除缓存
     */
    public void clear() throws SQLException; /**
     * 得到所有数据
     */
    public int getAllCount() throws SQLException; /**
     * 执行hql语句
     */
    public void exesql(String sql) throws SQLException;}
    public class DAOImplBase<T> implements IDAOBase<T> {.
    .
    .}
    在service层我可以这样pbulic Class userService{
    DAOBase service通过spring注入以后,我就可以操作了
    }
    我的意思就是有没有必要在在定义一层UserDAO出来这样使用
    pbulic Class userService{
    UserDao userdao   
    }
    因为在我看到的不管大大小小的项目中都这样使用,我老是觉得这样多太麻烦了,增加了很多类和接口,像我上面的做法不是很简单吗,而且符合开闭原则啊,
      

  8.   

    注明一点,在这个问题中采用的持久化框架是hibernate
      

  9.   


    就是hibernate这样设计的这样是维护,和修改都很方便并且互不影响
    估计楼主没有做过二次开发或者,去修改别人的代码.......
      

  10.   

    楼主的做法跟我的是一样的,我的也只有一个基本的dao层,里面封装了操作数据库所需要的一些方法,比如:查询结果分页等。不同的功能点对应不同的service类,在service里面直接写业务逻辑处理的代码以及SQL,然后在service中调用dao实例执行就可以了。我也不清楚为什么需要每个功能点都对应一个service和一个dao,service貌似只是起到了连接action和dao的作用。而且既要维护一个dao还要维护对应的一个service,工作量明显增多了,干嘛不把dao中的代码写到service中去呢?这样后台的业务逻辑系统跟前台的action展示也是耦合的啊。呵呵,只是发表了自己的看法,可能有不成熟的地方。
      

  11.   


    在控制层中写Sql语句和在JSP中写java语句犯的错是一个级别的。
      

  12.   

    你这个类是持久化层的工具类。是供每个Dao来使用的,而不是直接让Service来使用。
    你总不能在逻辑控制层去写hql语句吧,大哥。
      

  13.   

    为什么要有Dao层呢
    Data Access Object
    就是要完全屏蔽数据库的底层操作,上层Service根本不用关心数据库的类型及表结构(甚至于底层到底是不是一个真正的数据库,比如只是一个简单的配置文件)。
      

  14.   

    如果按照楼主的意思,在项目中只需要一个Dao和一个service,如果这个项目很大的话,估计你这个类的容量是相当客观的,光编译一次估计都要花费很长时间,更不说提高性能了。
      

  15.   

    是为了方便维护,扩展,公用1个DAO,很可能造成改一处而动全身。
      

  16.   

    不太赞同你的观点。这是设计和性能没关系。编译时间的确是增加了,但是运行时性能不一定差。
    如果都写到一个类里面性能还可能提高呢,至少层次少了完成同一个功能调用的方法少了。
    OOAD不是为了解决性能问题的,相反有时还会影响性能。比如J2ME开发时,就要尽量少用OOAD。
      

  17.   



    怎么就不懂嫩,就那么简单的事10楼说的很详细了你记住,你用一个共同的IDao 接口,用Spring 去注入是很方便。但是如果你以后的项目有变动,需要修改。或者你的项目别人要去修改,你用个IDAO 去注入,Spring能找到,但是别人能那么快的速度找到么?看来看去就晕了,主要就是一个那种分成方式很清晰。别人修改你的代码,直接就可以了解跟踪你的逻辑。

      

  18.   

    dao 是专门用来 和数据库打交道 ,他只负责数据库采取CRUD操作  只是单纯的数据库操作,不对结果数据进行  逻辑处理  ,逻辑处理部分交给  service来处理  这样代码 就会很清晰,也方便维护  也符合OOP  和mvc 。如果是小规模应用  根本没有必要 分什么 DAO 等等 直接JSP+javabean+servlet也OK
      

  19.   

    并没有硬性规定一个po对应一个dao,只是在程序设计上,为了清晰。易于管理,把一个po对应于相应的dao.
    同时你也可以把一些公共的方法都放到一个DAO中,让其他子类的dao都继承这个父类。这样可以简化开发