sqlican 2019-06-30
充当数据库表访问入口的对象,一个实例处理表中所有的行。
表数据入口包含了用于访问单个表或试图的所有SQL,如选择、插入、更新、删除等。其他代码调用它的方法来实现所有与数据库的交互。
表数据入口可以和表模块一起使用,它产生一个记录集数据结构由表模块处理
数据入口特别适用于事务脚本,行数据入口和表数据入口间的选择归结于如何处理多数据行,当结果集的表现便于事务脚本处理时,用表数据入口。
如下2图分别是普通情况下、充分利用.net特征下的表数据入口实现:
充当数据源中单条记录入口的对象,每行一个实例。
特征:行数据入口是和单条记录及其相似的对象,如数据库中的一行(该对象中数据库中的每一列变成了一个域)
问题:在哪里存放产生该模式的查找操作?鉴于选择静态查找方法不支持为不同数据源提供不同查找方法的多态,需要设置单独的查找方法对象(这样关系数据库每一张表都一个查找方法类和入口来获得结果)
行数据入口和活动记录之间的区别:是否存在任何领域逻辑,如果存在,则是活动记录
事务脚本(关于表数据入口和行数据入口之间的选择,参考表数据入口)
行数据入口可以和数据映射器一起配合使用:行数据入口从元数据自动生成,数据映射器由手动实现
一个对象,它包含数据库表或视图中的某一行,封装数据库访问,并在这些数据上增加了领域逻辑
活动记录的本质是一个领域模型,这个领域模型中的类和基数据库中记录结构十分吻合。
活动记录通常具有如下方法:
由SQL结果集中的一行构造一个活动记录实例;
为将来对表的插入构造一个新的实例;
用静态查找方法来包装常用的SQL查询和返回活动记录(也可以分离为一个单独的类);
更新数据库并将活动记录中的数据插入数据库;
获取或设置域;
实现部分业务逻辑。
适合于创建、读、更新、删除等不太复杂的领域逻辑;
优点:简单,容易创建,易于理解;
缺点:要求对象的设计和数据库的设计紧耦合,项目中难以进一步重构;当业务逻辑复杂,对象间有引用、集合和继承等关心时,难以映射到活动记录
其中,标圈的是领域逻辑实现。
在保持对象和数据库(以及映射器本身)彼此独立的情况下在二者之间移动数据的一个映射器层,如下:
主要功能:分离领域和数据源
延时加载
基于元数据的映射
业务逻辑复杂,数据库方案和对象模型需要彼此独立演变时
其中,DataMapper实现了IPersonFinder接口,用于查找方法实现。