主要是在Dao层与其它层之间。以前奉行的宗旨是:只有DAO层与数据库打交道,所有的SQL或HQL都在这层写,不要含任何业务逻辑,最好的话,连一个if语句也不要有。可现在发现所用的一些框架中,基本上都是写个公共的带泛型的IBaseDao,封装了所有的操作方法。所有的模块都实现这些接口(如UserDao implements IBaseDao),然后在Service层调用这些方法即可,这就造成了所有的HQL语句,都是在Service层的。更有甚者,通过泛型,封装好Service层和Dao层,HQL语句直接写在Action层里。确实,这样做的话,能加快开发的进度,减少不少时间,但这种与平常所提倡的各层间的松藕合,似乎...请问下,对于这方面,大家平时是怎么做的?
我都是让dao层进行数据库的交互, 都是简单的增删改查
service层进行事务逻辑的实现
action进行请求调用service层的方法,然后跳转
service调用dao,可能调用多个dao,主要业务逻辑操作
action调用service,页面参数的校验,相关显示内容的转换
dao,然后再向上返回结果,
但是service层也会偶尔承载一些if else上的逻辑,因为平常要使用dwr框架进行异步处理..
BaseDao:有个方法
List<T> findObject(String queryString, Object[] obj);在Service层里,就直接写个
String queryString = "..."
baseDao.findObject(queryString, new Object[]{val1, val2...});
hql语句主要写在Dao层啊,Service主要是通过接口调用Dao层,然后把多个Dao层联系起来
目的不外乎2个,一个是提高效率,一个是便于维护。
只要是从这个2个角度出发,我觉得就可以了,而不是一定要求web、server、dao各个层之间只能写什么。对于每个项目来说,都有不同的要求,也就意味着,同样的wen需求,有的在web这里就可以完成,有的呢,则在
Business这里,有的数据处理呢,在Dao,有的呢,则需要拿到Business这里。
总而言之就是具体情况具体对待,而不能一个模式到处套用
service层来处理业务逻辑
个人感觉还是最初始的比较分得清楚至于继承BaseDao在service中使用sql等,除了方便开发 泛型滥用之外 感觉不太好
有时候分层解耦还是要看项目实际情况的,一个极简单的1人月的小web项目,你甚至可以直接在jsp里调javaBean,甚至可以在jsp里写sql。
我一般理解为,理论上dao层向下从db层获取可用连接,将po转为sql/hql去执行,向上层提供了用po实例与数据库交互的服务,一个po的dao即提供了该po对应的物理表的原子操作,那么service可按业务来分,一个业务根据需要,调用多个dao完成一系列操作,更复杂的业务来向下调用基础业务,并在action里来选择控制这些业务。数据库操作最常见的无非是curd,于是这几个典型的动作被抽到了dao的超类中,由具体的dao去扩展原有动作和加上自己独有的动作,这个也很正常。
有些事情这样做大家都知道好,但是不是一定要这么做,不要觉得奇怪。
Spring的解耦合与这里所谈的解耦合不同。这里谈的是平时我们一些操作习惯上的各层间的耦合,简言之就是:一些HQL语句你是写在哪层的
个人感觉。还是写在Dao层比较好点,维护起来比较方便。其实java本身相对其他开发语言而言开发比较复杂但维护方便。。
前阵子。。为了修改公司的网站。结果是用PHP写的、不是一般的乱。。后期维护特别麻烦
service调用dao实现业务逻辑
action调用service实现具体功能
说实话,你这的父类的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方法,然后针对常用的各种情况,你写个简单的带参方法然后调用这个方法即可。分层不是教条主义,但在实现功能的前提下 要尽量符合满足设计原则。