Posted on 2005-11-19 10:58
canonical 阅读(896)
评论(0) 编辑 收藏 所属分类:
Witrix开发平台
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语言的封装。