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