对象/关系映射(ORM)技术在一定程度上将基于关系数据库的应用开发引向了错误的方向。一个好的技术方案应该是把事情变得越来越简单,而不是越来越复杂。
实际上,访问数据库的核心任务可以简化为两个步骤:构造SQL语句和执行SQL语句。当前的ORM框架在SQL语句的执行方面提供了强大的支持,例如SpringJDBC就是一个出色的SQL执行工具。但是对于复杂查询语句,仍然需要开发人员去手写SQL语句或任何形式包装的SQL语句构造代码。我们需要的是一个能够完全自动化的SQL语句生成方案。
目前,大多数ORM框架能够通过实体对象获取表名和列名,并由此构建基本的单表增删查改语句,而查询子句的构建则需要用户提供若干对应的查询参数。根据高内聚原则,我们可以将每张表的所有查询参数集中定义在一个对象中,我称之为查询对象。如果查询对象中的每个字段都可以构建一个查询条件,我们便可以通过该查询对象构建完整的查询子句。这些查询参数还包括排序和分页的参数。这样一来,实体对象和查询对象就构成一对正交的用于构建单表增删查改语句的对象。
© 2024 Yuan Zhen. All rights reserved.
除了单表增删查改语句,SQL语句的构造还需要支持复杂查询语句。但是,实体对象无法用于构建复杂查询语句,因为实体对象中的字段只对应单张表中的列,而复杂查询语句中的列可能来自多张表,还可以包括聚合表达式。所以我们需要设计另一个对象来构建聚合表达式、分组子句、表连接关系等静态部分,这个对象被称为视图对象。同时,我们可以复用查询对象来构建复杂查询语句中的查询子句。视图对象和查询对象构成另一对正交的用于生成复杂查询语句的对象。下图是Java语言的一个示例,右侧的SQL语句为TPC-H基准测试的第3个查询语句。
最后,我把这项通过对象自动生成数据库查询语句的技术称为对象查询映射(Object/Query-Language Mapping,OQM)。在下一篇文章中,我将详细介绍查询对象的映射方法。
© 2024 Yuan Zhen. All rights reserved.