我的想法正确吗?
Java数据库访问层通常是如何实现的?我想我有课DBAL
它具有类似
- 保存(对象obj)
- 删除(对象obj)
- findOne(字符串类型、字符串列、字符串值)
- findAll(字符串类型、字符串列、字符串值)
save
和delete
将接受域对象类,例如。产品、用户...然后相应地执行相应的操作
findOne
和findAll
将接受type
它对应于表名称,然后是用于 WHERE
的列和值条款。很简单,但我想知道这个想法是否正确?
通常我看到很多网站都有 DAO,但没有 ProductDAO
和UserDAO
非常相似?我可以将它们合并到 1 类 DBAL 中吗?
模拟 ORM
来自 ORM 背景。我想知道如何ResultSet.getObject
工作,它会像 ORM 一样工作吗,我查询 User 表,我可以得到 List<User>
例如?
最佳答案
在 Java 中实现数据库访问层的方法有很多种,相同的模式也适用于其他语言。最简单的形式是表数据网关。在此模式中,每个数据库表都有一个网关实例。 DAL 的其他模式是表行网关,其中表中的每个数据库行都有一个网关实例。 Active Record,其中域对象知道如何与数据库本身对话。 数据映射器,其中数据在域对象和数据库之间移动,同时保持它们彼此独立以及映射器本身独立。 这些方法各有利弊。尝试查找我提到的模式,看看哪种模式最适合您的应用程序。
人们子类化其基本 DAO(TDG、TRG,等等)的主要原因是为每个域对象类型提供一个显式的、独特的、类型安全的接口(interface) + 它使客户端更容易找到他们想要的正确的数据访问函数需要为了实现一个用例。相同的代码被抽象在基类中......
如果您处于应用程序的启动阶段,我建议您使用一个工具来处理数据访问(例如 Hibernate)。这些工具非常通用,存在一百万个问题,但至少您可以首先专注于正确处理业务逻辑,然后再担心这些应用程序域之外的问题。如果事实证明确实存在问题并且您的软件看起来很成功,那么您可以继续进行数据访问以提高性能或解决您选择的工具给您带来的其他麻烦。我这么说只是因为制作一个好的本土数据访问解决方案相当困难,并且会占用您大量的时间。考虑并发问题,从数据库 ID 到内存实例的映射,等等。
至于你关于ResultSet的问题。不,getObject 将以对象形式获取此 ResultSet 对象当前行中指定列的值。因此,您必须自己进行转换,这也是为什么如果您沿着这条路走下去,为您的域对象使用 ResultSet 的工厂是一个好主意。
这是一个很大的主题,如果我不能更详细地讨论所有模式,我很抱歉。我自己也有工作要做:-)如果您决定自己制作而不是使用“标准”工具,那么在您弄清楚我在这里提到的哪些模式可以使用之后,我很乐意回答您的更多问题。最适合您的需求。
问候。
关于Java JDBC 数据库访问层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355817/