日期:2014-05-19  浏览次数:20626 次

DAO层,Service层的疑问
一般DAO层负责数据库操作,Service层只处理业务。
我的问题是,对于比较复杂的SQL语句,是写在DAO层还是业务层?

我举例说明吧:
比如有 学校、班级、学生表。
对于基本的添加删除等,都好说。DAO层:SchoolDao、ClassDao、StudentDao。 Service层:SchoolService、ClassService、StudentService
但是假设有个非常复杂的业务,比如要查询某学校,班级号为偶数,年龄多大,身高多少的学生,甚至说有可能需要递归等操作。 这种业务还需要在DAO层进行接口定义吗?就算要定义,似乎也不好定义啊

我的理解,DAO层每个接口都负责自己的事情,比如StudentDao只负责学生的添加删除修改查询,而不会处理其他的。你可能会想,在StudentDao里面增加一个接口 FindBySchoolClassAgeHeight(。。。。),但是这样岂不是关联性太强了,或者说DAO层的业务性太强了?因此我认为,如果需要实现上面复杂的业务,就没办法做了。

请各位教我。灰长感Xie
------解决方案--------------------
你想问的是sql语句放哪儿,还是复杂的查询业务放在哪儿。

我的结论是sql语句放在配置文件中,日后维护方便。
你所举的例子放在StudentDao里,要是dao里只放单表操作那也太浪费了。
关键是看查询的主表是什么,因为你终究是查询符合条件的学生,所以理应放在StudentDao里。
------解决方案--------------------
sql语句都是放在dao层的。
而且这些语句一般都是固定的不用做修改的。
至于复杂的逻辑,就多次调用dao层的接口,虽然这样注定造成效率的低下,但是降低了耦合性。
另外现在一般CPU都没问题,只要不是特别大数据量的查询,硬件一般都是不成问题的。
------解决方案--------------------
DAO层最好不要加业务逻辑,DAO层就应该只是负责与数据库交互,实现数据存取操作的。
------解决方案--------------------
dao是原子层。。。就是最基本的增删改查。。没有其他东西。。一般公司都封装成jar包了。

service层是业务层。基本上的业务都是几个dao一起完成的。。最简单的例子。。登录验证身份。。一般我们都要把操作记录在日志里。所以要用到userDao和logDao。。。一起写。。。。事物也都是在业务层配置的。。
------解决方案--------------------
我也曾经遇到过这样的问题,经过大神指导,才晓得,sql语句是放在dao层的,至于放在哪个dao下,是有sql语句查询的结果来决定的,比如你最终查询的是学生,就放在studentDao下,sql语句中用到什么查询条件,就声明这个类的接口,方便使用。希望你能采纳。