【发布时间】:2010-11-14 05:31:01
【问题描述】:
我正在为数据库构建 DataAccess 层,建议使用什么数据结构来传递和返回集合?
【问题讨论】:
-
好问题 .. 我一直在使用 DataSet 但不认为那是最好的 ..
标签: data-structures data-access-layer
我正在为数据库构建 DataAccess 层,建议使用什么数据结构来传递和返回集合?
【问题讨论】:
标签: data-structures data-access-layer
我使用映射到 db 表的数据访问对象列表。
【讨论】:
我不确定您使用的是哪种语言,但总的来说,在简单性与可扩展性之间存在权衡。
如果您直接返回 DataSet,您现在已经将自己与特定于数据库的类相耦合。这留下了很少的扩展空间 - 如果您允许访问文件或其他类型的数据源怎么办?但是,它也很简单。这就是记录集模式,C#/VB 对此提供了很多内置支持。 GUI 层可以访问记录集并轻松地操作数据。这适用于简单的应用程序。
另一方面,您可以将数据集包装在自定义对象中,并提供网关方法(请参阅网关模式http://martinfowler.com/eaaCatalog/gateway.html)。这种方法更复杂,但提供了更多的可扩展性。在较大的应用程序中,当您需要分离业务逻辑、数据逻辑和 GUI 逻辑时,这是一种更健壮的方法。
对于大型企业应用程序,您可以考虑使用对象关系映射工具 (ORM)。它们有助于自动将 java 对象映射到数据库表。它们隐藏了很多令人痛苦的 SQL 细节。 Spring 等框架为 ORM 提供了出色的支持。
【讨论】:
我倾向于使用对象数组,这样我就可以断开 DAO 与业务逻辑的连接。
例如,您可以将 DAO 中的数据存储为数据集,并为它们提供一种在进行更新之前添加到数据库的简单方法,以便它们可以传入信息以进行修改操作,然后在需要时提交他们可以一次性完成的更改。
我更喜欢用户不能自己添加/修改结构,因为这样更难确定数据库中必须更改的内容。
通过最初返回一个数组,他们可以显示数据库中的内容。
然后,随着表示层发生变化,控制器可以更新 DAO。通过松散耦合,整个系统变得更加灵活,因为您可以将 DAO 从数据集更改为其他内容,而应用程序的其余部分并不关心。
【讨论】:
有两个最通用的选择。
查看 ResultSet 的第一种方法是作为 Map 列表,其中每个 Map 代表 ResultSet 中的一行。键是 FROM 子句中列出的列;这些值是数据库值。
查看 ResultSet 的第二种方法是作为 List 的 Map,其中每个 List 代表 ResultSet 中的一列。 Map 键是 FROM 子句中列出的列;这些值是数据库值的列表。
如果您不想做成熟的 ORM,这些可以带您走很长的路。
【讨论】: