使用RDBMS的面向对象方法

时间:2011-08-10 14:06:26

标签: java mysql sql rdbms object-oriented-database

我有一个关于如何在使用诸如mysql之类的RDBMS时使用面向对象方法的问题。我正在开发一个跟踪计费的小应用程序。它是用java构建的,我使用MySQL数据库来存储数据。我的应用程序有一个客户和产品类。现在通常,如果我使用数组或不同的数据容器处理持久性数据存储,我会对客户类进行更新,删除等,对产品类进行更新。然而,我发现自己使用比以往更多的静态方法。因为我没有一个客户阵列,例如我只有一个带有客户信息的数据库,所以当我只能调用一个删除客户(或产品)的静态方法时,我认为创建客户对象只是为了删除它没有意义。在它的主要身份。最后,我觉得没有理由创建客户或产品类,因为不需要特定的方法。

我想问的是,在使用RDBMS时,您如何采用面向对象的方法?

6 个答案:

答案 0 :(得分:6)

使用OO原则设计Java类。

使用SQL和规范化原则设计数据库。

然后,全速进入对象/关系映射的挑战! : - )

像Hibernate和Ibatis这样的技术专门用于帮助实现这一目标,这是一个记录良好的问题。像Spring这样的其他技术可以使它们的使用非常简单和愉快。

将您的持久性抽象为DAO(数据访问对象)层,例如如果你有很多像Vehicle和Animal这样的课程,那么你就可以像VehicleDao和AnimalDao这样的DAO来区分他们如何根据他们在你的系统中从根本上做的事情与数据库进行对话。

FWIW,我主张这样做:应用程序端的优秀应用程序设计,数据方面的良好数据库设计。完成后,总是有一种方法可以在将数据库持久化并从数据库中检索类数据时对两者进行映射,这比使用一个单独的层来“帮助”另一个更好的IMO要好。

答案 1 :(得分:0)

使用DTO(数据传输对象),在您的情况下将是表示数据库中对象的类,遵循单一责任原则。这是基于OOP原则的设计模式(更具体地说是封装过程)。这可以确保您的每个类只实现一个目的。如果将业务逻辑保留在SQL字符串中,则很难维护并违反DRY“不要重复自己”的原则。根据我的经验,ORM加快了系统设计的进程。试试NHibernate。 http://geekswithblogs.net/pariam/archive/2006/07/26/86352.aspx

答案 2 :(得分:0)

如果您希望此应用程序不断增长(可能是应用程序的99%),则创建对象。即使删除是单个SQL调用,您可能需要添加逻辑(删除子表中的行,存储审计数据,转移到逻辑删除而不是硬删除等)。

答案 3 :(得分:0)

您的数据库代表您的业务对象 - 完全规范化等。

您的对象模型表示您需要如何处理代码中的数据。它们通常不相同,例如,您将客户表与一对多地链接到地址表,但在代码中您使用包含两种类型信息的对象。

您的数据访问对象(DAO)处理业务对象(即读/写)。您的服务层完成工作,必要时将DAO的输出组合到您的对象中。您的服务层也将根据需要处理交易。

从服务层抽象数据访问将使维护代码,更新数据库架构和促进测试变得更加容易。

答案 4 :(得分:0)

处理数据库和oo-code始终是一个热门话题。有些人可能会说"JUST DON'T"

我不同意这些,但是当我不得不这样做时,我已经看到了很多问题。我绝对不同意其他一些立即推荐像Hibernate这样的OR-Mappers的人。在许多情况下,您在开发过程中并没有任何好处,并且在运行期间会遇到很多问题(性能,错误诊断)。

一如既往,这完全取决于您在应用中所做的事情。你说,你没有客户对象。为什么是这样?例如,如果您只是在gui中的表中显示所有客户,并且用户可以通过右键单击或删除其中任何一个来删除其中一个,最好的方法是通过JDBC读取数据库数据,将其放入JTable并拥有再次使用JDBC的静态删除方法。

但如果您真的与应用程序内的客户进行交易,那么建立客户对象然后需要 OR-Mapping将会很有用。但是你不需要框架。手写的sql / JDBC在大多数情况下都做得很好。

从我的观点来看,OR-Mapper-Frameworks在性能不感兴趣的应用程序中可能是一件好事,而且在大多数其他情况下你并不想考虑所有数据库内容(即原型设计)用手写代码进行阅读和存储。

答案 5 :(得分:0)

Domain model是一种很好的方法。将业务逻辑分离为不依赖于数据库的层。使用SOLID原则并查看域驱动设计。这样,您将具有可读的OO代码,这些代码是隔离的并且可以轻松测试。像“Repository”这样的模式将帮助您在处理关系数据库的现实时关注业务需求。基本上你定义和界面如:

List<Customer> customers = Customers.WithOutstandingOrders(DateRange range)

然后在数据访问层(域外)实现此接口。最简单的方法是使用像Hibernate这样的ORM。数据库在这种架构中的作用更像是一个“小桶”。换句话说,大多数逻辑都存在于OO代码中,数据库只是防止数据异常并加快速度(使用规范化,参照完整性和索引)。