设计模式 - 将数据库记录和数据集抽象为对象时,对象模型的外观



我问所有没有使用库的人,而是构建自己的对象来管理流入和流出数据库表的数据。 我有记录集对象吗? 每行数据一个对象?双?也不? 欢迎任何建议或经验。请不要告诉我使用ORM或其他此类工具包。 这对我的项目来说是矫枉过正的,此外,这不是现在的问题,是吗?

我强烈建议你学习Martin Fowler的企业应用程序架构模式,它描述了许多数据库模式,这些模式将有助于了解,并让您了解模式在ORM库上的演变。

您可能感兴趣的特定模式:

  • 记录集
  • 行数据网关
  • 表数据网关
这些

基本模式将使您了解如何构建对象,而更高级的模式(如活动记录/数据映射器)您将看到这些模式与问题域的关系,超出了您当前的需求。

您的数据模型由域实体(现实世界的事物)主导。 现实世界的事物有时可以映射到数据库中的单行。 一个实体是一个对象是一个关系行 - 大多数情况下。

有时,现实世界的实体非常复杂,并且跨越多个数据库行。 这就是"聚合"问题。 对象可以是聚合。 关系行不能在不破坏所有正常形式规则的情况下轻松聚合。

有时,由于类继承,您会在如何使对象映射到数据库行方面感到困惑。 是继承层次结构的每一层一行吗? 还是所有图层都平展为每个子类表中的列?

此外,你需要有事物的集合(数据库是事物的集合)。

这些"集合"或"

记录集"或"管理器"或"数据访问对象"在持久性 (SQL?) 和域实体之间进行中介。 记录集从它有权访问的任何 SQL 内容生成域对象。 同样,记录集将域对象展开为 SQL 内容。

ORM

是处理这个问题的一种方法;ORM框架提供了这些类定义。 如果ORM"矫枉过正",借用设计模式。 阅读 iBatis API。 [当你在它的时候,你可能会发现ORM没有什么太小的。

简而言之,两者:"记录集对象"加上"每行数据一个对象" - 大约。

如果您觉得需要滚动自己的记录集集合,可以尝试使用简单的序列化来保存对象。 在尝试序列化聚合和子类关系的复杂性之上,您将堆积复杂性。 为什么? 对象彼此之间具有直接引用。 SQL 数据库必须使用主键和外键模拟这一点。

无论您的项目规模如何,我都会说使用 ORM :-P

但。。。。。

在没有ORM库的日子里,我们曾经手动从Java记录集对象中提取所有字段并将它们插入到真正的Java类中。

反向应用于插入和删除(带有一个标志来指示将要发生的事件)

通常将多行填充到一个列表中。

这将取决于您是希望数据库设计如何驱动对象设计,还是域模型如何驱动数据库的设计。

在第一种方案中,为每个表创建一个类。 正如您将很快发现的那样,有时您需要一个联接两个表的对象,因此您必须有一个方案来处理该异常。

在第二种情况下,需要您创建对象的标识映射,并以某种方式将类的关系映射回表。 在这种情况下,在某些情况下,您没有对象与表的一对一关系。

我知道你不想要一个工具的处方,但SubSonic是一个非常直接,稳定的工具包,可以帮助你从数据库结构生成代码,并且非常适合每个表有一个类的情况。 您可以在半小时内安装并开始生成代码。 值得一看。

要管理流入和流出数据库的实际数据(没有ORM),您应该查看Jakarta Commons DbUtils。

它提供了非常轻量级的帮助程序来运行查询和更新,例如自动将结果集转换为 Bean 列表等。

最新更新