主要是在Dao层与其它层之间。以前奉行的宗旨是:只有DAO层与数据库打交道,所有的SQL或HQL都在这层写,不要含任何业务逻辑,最好的话,连一个if语句也不要有。可现在发现所用的一些框架中,基本上都是写个公共的带泛型的IBaseDao,封装了所有的操作方法。所有的模块都实现这些接口(如UserDao implements IBaseDao),然后在Service层调用这些方法即可,这就造成了所有的HQL语句,都是在Service层的。更有甚者,通过泛型,封装好Service层和Dao层,HQL语句直接写在Action层里。确实,这样做的话,能加快开发的进度,减少不少时间,但这种与平常所提倡的各层间的松藕合,似乎...请问下,对于这方面,大家平时是怎么做的?

解决方案 »

  1.   

    对于我自己来说
        我都是让dao层进行数据库的交互, 都是简单的增删改查
        service层进行事务逻辑的实现
        action进行请求调用service层的方法,然后跳转
      

  2.   

    dao层进行数据库操作
    service调用dao,可能调用多个dao,主要业务逻辑操作
    action调用service,页面参数的校验,相关显示内容的转换
      

  3.   

    嗯,,我也基本差不多都是这样子来设计。不过有些细节部分还是不太清楚。。比如前台输入数据的验证,是该在Action层做服务器端验证,还是Service层呢、0128?还有, Action要怎么分割?按功能?还是按照业务?比如UserAction,ArticalAction?
      

  4.   

    基本上差不多,页面传值到action后,action传递给service service传递给dao
    dao,然后再向上返回结果,
    但是service层也会偶尔承载一些if else上的逻辑,因为平常要使用dwr框架进行异步处理..
      

  5.   

    我主要想问的是,那些HQL语句,你们是写在哪层?我觉得应该只能在Dao,可实际中,大多都写在Service层里了比如说:
    BaseDao:有个方法
    List<T> findObject(String queryString, Object[] obj);在Service层里,就直接写个
    String queryString = "..."
    baseDao.findObject(queryString, new Object[]{val1, val2...});
      

  6.   

    Service层有些if else 等,是蛮正常的,不然,Service层就太悠闲了
      

  7.   

    SSH如果在大的项目中的话还是很好用的,不过如果做的只是一些小项目的话就没必要了。在大项目中,层次会分的很清,不过如果是小项目的话就不需要这样做了。
      

  8.   

    接口哦……呵呵……Dao层简单的增删改查,service再写逻辑,Action中调用就OK了……我觉得这样算是解耦而来吧
      

  9.   


    hql语句主要写在Dao层啊,Service主要是通过接口调用Dao层,然后把多个Dao层联系起来
      

  10.   

    首先要搞清楚为什么要用模式,为什么要耦合?
    目的不外乎2个,一个是提高效率,一个是便于维护。
    只要是从这个2个角度出发,我觉得就可以了,而不是一定要求web、server、dao各个层之间只能写什么。对于每个项目来说,都有不同的要求,也就意味着,同样的wen需求,有的在web这里就可以完成,有的呢,则在
    Business这里,有的数据处理呢,在Dao,有的呢,则需要拿到Business这里。
    总而言之就是具体情况具体对待,而不能一个模式到处套用
      

  11.   

    确实 dao层主要就是处理一些持久化的东西 和数据库打交道
    service层来处理业务逻辑
    个人感觉还是最初始的比较分得清楚至于继承BaseDao在service中使用sql等,除了方便开发 泛型滥用之外 感觉不太好 
      

  12.   

    很久不要DAO层了, 直接在service层的实现类里搞定, hql语句, 没什么太多内容, 干脆不要DAO了, 哈哈
      

  13.   

    连一个if都不给写,这太教条了吧。
    有时候分层解耦还是要看项目实际情况的,一个极简单的1人月的小web项目,你甚至可以直接在jsp里调javaBean,甚至可以在jsp里写sql。
    我一般理解为,理论上dao层向下从db层获取可用连接,将po转为sql/hql去执行,向上层提供了用po实例与数据库交互的服务,一个po的dao即提供了该po对应的物理表的原子操作,那么service可按业务来分,一个业务根据需要,调用多个dao完成一系列操作,更复杂的业务来向下调用基础业务,并在action里来选择控制这些业务。数据库操作最常见的无非是curd,于是这几个典型的动作被抽到了dao的超类中,由具体的dao去扩展原有动作和加上自己独有的动作,这个也很正常。
    有些事情这样做大家都知道好,但是不是一定要这么做,不要觉得奇怪。
      

  14.   

    解耦合。请问一下spring 干嘛去了
      

  15.   


    Spring的解耦合与这里所谈的解耦合不同。这里谈的是平时我们一些操作习惯上的各层间的耦合,简言之就是:一些HQL语句你是写在哪层的
      

  16.   

    写在Dao层 便于后期的代码维护吧 不然太乱了
      

  17.   

    标准的做法应该是所有的HQL语句都写在Dao层的,这样可维护性 及 后期开发修改,都比较方便但如果直接写在Service层 或 Action层,开发效率要高些
      

  18.   

    如果项目是用SSH框架的话,那用跟数据库打交通的话就用Hibernate来实现,Hibernate来负责实现Dao层
      

  19.   

    我的HQL语句基本上写在service层里面
      

  20.   


    个人感觉。还是写在Dao层比较好点,维护起来比较方便。其实java本身相对其他开发语言而言开发比较复杂但维护方便。。
    前阵子。。为了修改公司的网站。结果是用PHP写的、不是一般的乱。。后期维护特别麻烦
      

  21.   

    我的HQL语句基本上写在service层里面
      

  22.   

    dao层主要进行一些基本的数据操作
    service调用dao实现业务逻辑
    action调用service实现具体功能
      

  23.   


    说实话,你这的父类的Dao接口设计就有问题,它并不健壮,已经依赖了Hibernate的api来实现了,如果父类的Dao接口应该是和具体实现是无关的。我觉得比较好的父DAO接口设计是先设计一个和具体ORM的BaseDao<T> ,只针对单个实体(单表)进行的CRUD简单方法进行定义。你再设计一个HibernateGenericDao<T>继承自BaseDao<T>,然后你的其他的具体的dao接口,比如departmentDao 就直接继承自HibernateGenericDao 就完了.如果你用其他的实现,比如Ibatis,你可以写个和ibatis耦合的IbatisGenericDao来继承自baseDao。至于你dao中的方法,hql肯定是写在dao中,毫无疑问的。 因为service层会调用dao层的方法来实现自己的逻辑,service层中的接口肯定也是和中间持久层的api方法没有耦合的。你这个 findObject 方法,应该写在你的具体的HibernateGenericDao 接口中,而不是在你的baseDao中。你应该写一个通用多条件的findObject方法,然后针对常用的各种情况,你写个简单的带参方法然后调用这个方法即可。分层不是教条主义,但在实现功能的前提下 要尽量符合满足设计原则。