一直被Dao層應該如何抽象,Dao職責如何劃分這樣的問題困擾,突然間,我彷彿看到了真理。程序員
之前我對Dao的理解是下面這樣的:sql
dao層只提供操做接口,不處理業務邏輯。也就是隻處理數據存儲的規約,而非業務邏輯。這一點須要特別注意。什麼是存儲規約?例如,數據類型轉換。什麼是業務邏輯?例如,你的sql語句出現了某些寫死的固定狀態查詢,而這種固定狀態表明瞭某種特定的業務。實際上你應該經過接收參數的方式來查詢不一樣狀態的數據。
這是不對的!!!存取數據自己就是業務的一部分,按照上面的邏輯思考這個問題,會出現業務邏輯由於分頁,聯表等操做被強行帶入sql的問題。但若是按照新的原則來思考,Dao爲一個肯定的數據實體提供操做接口,問題就迎刃而解了!code
這個原則沒有限制Dao和表的一對一關係(也就是數據實體和表的關係),一個Dao能夠對應多個表,也能夠只對應一個表。不過我傾向於一對一的解決方案。接口
這個原則沒有制約業務邏輯入侵sql,但因爲Dao的操做是聚焦於一個特定數據實體的,其接口從某種意義上說,就只是數據存取。sql語句