Service層是提供給表示層用的,對於表示層來說,我不需要知道你怎么實現你的業務的,只要給我一個接口告訴我你能實現就可以,你由誰實現,怎么實現,表示層不關心,也就是說業務實現可能是多種多樣的,所以提供一個接口給表示層,這樣我業務層怎么改變都不需要修改表示層的代碼。
同理,DAO層是提供給業務層的,可能實現某個查詢的需求,不同的數據庫都可以做到比如Hibernate,iBatis, JDBC,提供一個接口給業務層,不管我最終使用哪個數據庫,都不會影像到業務層的代碼,從而分工明確,並實現解耦。
這里附帶談另一個問題,SQL最好還是寫在DAO層里,假設我是一個只寫業務層的程序猿,不會寫SQL,而有另一個會寫SQL專門寫DAO層的程序猿,我還會自己吭哧吭哧寫SQL嗎,肯定SQL都讓他寫,而我只關心我給什么參數,需要什么結果就好了,而對於DAO層來講,本身就可能用Hibernate或iBatis等,如果我在業務層就限定死了,以后一旦數據庫變了,是不是連帶着業務層都要改很多。