老生常谈,关于Service和DAO的解耦和

09-03-24 custer7572
各位前辈好,小弟心中存有疑问良久,望能得到各位前辈的经验之谈。

仍旧是关于Service和DAO之间的耦合性问题。

项目中80%以上的数据库操作是query操作,这意味着我不管使用JDBC或是Hibernate都会存在着要写大量的复杂的SQL或HQL语句进行query的工作。问题就在,到底这些SQL或HQL我应该写在哪里?

一,在DAO中,根据项目需求定义大量用于query的method。这样简化了Service的操作。

但是困惑是,如果这些复杂查询的业务已经被DAO实现了,要Service干吗用?

或者说,DAO作为一个与持久层打交道的层面,不应该与业务逻辑层产生任何耦合性依赖。

但如果将这些查询语句写在DAO中,如果一旦业务改变,DAO中岂非也得相应变化?

二,在DAO中使用通用方法执行查询,而查询使用的SQL或HQL作为方法的参数被调用者(Service)传进来。

这样意味着SQL必须定义在Service里。

如果可以在Service层里写SQL的话,那还需要DAO吗?

或者说,这个Service,还能被称之为Service吗?

三,将SQL或HQL写在配置文件中,

在Service里通过某个诸如SQLUtils之类的类去读取配置文件得到SQL

传递给DAO用于查询。

但同样问题多多,例如在开发时,配置文件是在初始化加载的

意味着我每次修改SQL都得加载项目。

不知道我的问题是否描述清楚,想知道各位前辈的做法

[该贴被admin于2009-03-24 13:13修改过]

1
banq
2009-03-24 13:16
>到底这些SQL或HQL我应该写在哪里

写都不该写,用对象设计来编程,将业务从SQL和HQL分离出来,具体见Evans DDD

你这种是典型的数据库思维,方向都错了,你向南已经跑出100公里,想解耦了,向北再回个5公里,不起作用。

custer7572
2009-03-24 13:41
对“用对象设计编程”,此举具体如何解决复杂查询的问题,有DEMO吗?banq老师可否给予提示?

IceQi
2009-03-24 22:45
不如看看Jdon先

DLUTkaka
2009-03-25 14:50
如果又数据持久化层的话,一般的业务流程中是用不到SQL语句的。 不过如果最后有统计和报表业务的话,还是要直接查询数据库,这种情况下DAO的作用变小,SQL写在配置文件中应该是不错

猜你喜欢
2Go 1 2 下一页