一般DAO层负责数据库操作,Service层只处理业务。
我的问题是,对于比较复杂的SQL语句,是写在DAO层还是业务层?我举例说明吧:
比如有 学校、班级、学生表。
对于基本的添加删除等,都好说。DAO层:SchoolDao、ClassDao、StudentDao。 Service层:SchoolService、ClassService、StudentService
但是假设有个非常复杂的业务,比如要查询某学校,班级号为偶数,年龄多大,身高多少的学生,甚至说有可能需要递归等操作。 这种业务还需要在DAO层进行接口定义吗?就算要定义,似乎也不好定义啊我的理解,DAO层每个接口都负责自己的事情,比如StudentDao只负责学生的添加删除修改查询,而不会处理其他的。你可能会想,在StudentDao里面增加一个接口 FindBySchoolClassAgeHeight(。),但是这样岂不是关联性太强了,或者说DAO层的业务性太强了?因此我认为,如果需要实现上面复杂的业务,就没办法做了。请各位教我。灰长感Xie

解决方案 »

  1.   

    你想问的是sql语句放哪儿,还是复杂的查询业务放在哪儿。我的结论是sql语句放在配置文件中,日后维护方便。
    你所举的例子放在StudentDao里,要是dao里只放单表操作那也太浪费了。
    关键是看查询的主表是什么,因为你终究是查询符合条件的学生,所以理应放在StudentDao里。
      

  2.   

    sql语句都是放在dao层的。
    而且这些语句一般都是固定的不用做修改的。
    至于复杂的逻辑,就多次调用dao层的接口,虽然这样注定造成效率的低下,但是降低了耦合性。
    另外现在一般CPU都没问题,只要不是特别大数据量的查询,硬件一般都是不成问题的。
      

  3.   

    我理解DAO,Service没多久,有些不太懂的。 
    我不就是想举个复杂业务例子嘛,我不说那么麻烦了,就说班级和学生吧。
    照你的意思,我在StudentDao里面, 有个
    QueryXXXX()
    {
     select * from student where id in (select * from class); 
    ......
    }这样的话,StudentDao里面竟然出现了select * from class ,这不是ClassDao应该出现的吗,我总觉得不妥,转不过来弯。
    请指教,再次感谢。
      

  4.   

    DAO层最好不要加业务逻辑,DAO层就应该只是负责与数据库交互,实现数据存取操作的。
      

  5.   

    dao是原子层就是最基本的增删改查。。没有其他东西。。一般公司都封装成jar包了。service层是业务层。基本上的业务都是几个dao一起完成的。。最简单的例子。。登录验证身份。。一般我们都要把操作记录在日志里。所以要用到userDao和logDao一起写。事物也都是在业务层配置的。。
      

  6.   

    哎,1楼说是 StudentDao里面可以有复杂查询的接口,以免浪费,2楼4楼却说要分开,DAO层最好不加业务。
    我现在蛋疼了,啊,蛋疼了,求药
      

  7.   


    照你这么说, select * from student where id in (select * from class); 
    上述语句,就必须在业务层先用ClassDao查询,再用StudentDao查询?
      

  8.   

    我也曾经遇到过这样的问题,经过大神指导,才晓得,sql语句是放在dao层的,至于放在哪个dao下,是有sql语句查询的结果来决定的,比如你最终查询的是学生,就放在studentDao下,sql语句中用到什么查询条件,就声明这个类的接口,方便使用。希望你能采纳。