CRUD(Create, Read,Update, Delete)操作中最難處理的是查詢。因為查詢總是多樣化的,如果每個特定查詢調用都編制一個對象方法,則維護量太大且擴展性很差。如果編制一個通用的
查詢接口,一般的做法是直接以SQL文本作為參數,但這樣就幾乎喪失了封裝的意義。這里的核心問題是Query本身是復雜的,我們應該將它對象化為一個
類,在程序中控制Query的結構,而一個文本對象與一個復雜的Java結構對象的差異就在于對于文本對象我們很難有什么假定,因而在程序中也很難編制通
用的程序對其進行處理,一般只能對它進行傳遞。實際上,文本中描述的結構存在于java程序之外!當然,我們可以利用Parser來重新發現這種結構,那
最容易使用的Parser就是xml parser了,所以我們應該將Query的結構建立在xml描述的基礎上。
edu.thu.search.Query類直接體現了對主題域的通用查詢條件。(對比我對數據倉庫模型的描述)
class Query{
List getFields();
TreeNode getCondition();
}
查 詢條件主要通過TreeNode進行顯式建模,使得程序有可能對它進行進一步的處理。例如,在DataSource處理Query之前,權限配置模塊可以 將附加約束直接追加到現有查詢條件之后,實現對數據權限的行級控制。因為把Fields明確分離出來,我們也可以做到對權限的列級控制。
Query類的使用示例如下:
Query.begin().fields(TEST_FIELDS)
.condition().eq(ID,"3")
.end().resultType(IQueriable.TYPE_ROW_MAP)
.findOne(dataSource).mapValue();
這里的調用接口的設計基本遵循與SQL類相同的風格,只是面向主題域而不是直接針對SQL語言的封裝。
edu.thu.search.Query類直接體現了對主題域的通用查詢條件。(對比我對數據倉庫模型的描述)
class Query{
List getFields();
TreeNode getCondition();
}
查 詢條件主要通過TreeNode進行顯式建模,使得程序有可能對它進行進一步的處理。例如,在DataSource處理Query之前,權限配置模塊可以 將附加約束直接追加到現有查詢條件之后,實現對數據權限的行級控制。因為把Fields明確分離出來,我們也可以做到對權限的列級控制。
Query類的使用示例如下:
Query.begin().fields(TEST_FIELDS)
.condition().eq(ID,"3")
.end().resultType(IQueriable.TYPE_ROW_MAP)
.findOne(dataSource).mapValue();
這里的調用接口的設計基本遵循與SQL類相同的風格,只是面向主題域而不是直接針對SQL語言的封裝。