2012-02-20 64 views
0

我的想法正确吗?Java JDBC数据库访问层

Java数据库访问层通常如何实现?我想我有一个类DBAL它具有的功能,如

  • 保存(obj对象)
  • 删除(obj对象)
  • findOne(字符串类型,String列,字符串值)
  • 的findAll(字符串类型,String列,字符串值)

savedelete将接受的域对象类例如。产品,用户...然后执行相应的动作相应地

findOnefindAll将接受type其对应于表名,然后使用柱和值用于WHERE子句。非常简单,但我想知道这个想法是否正确?

通常我看到很多网站有DAO但不会ProductDAOUserDAO会很相似吗?我可以将它们合并为1类DBAL?

模拟ORM

从ORM正在添加背景。我想知道ResultSet.getObject将如何工作,它会像ORM那样工作,我查询用户表,我可以找回例如List<User>

回答

4

在Java中实现数据库访问层的方法有很多,其他语言也适用相同的模式。最简单的形式是表数据网关。在这种模式下,每个数据库表都有一个网关实例。 DAL的其他模式为表行网关其中表中每个数据库行都有一个网关实例。 活动记录,其中域对象知道如何与数据库本身交谈。 数据映射器其中数据在域对象和数据库之间移动,同时保持它们彼此独立和映射器本身。 每种方法都有各种优点和缺点。尝试查看我提到的模式,看看最适合您的应用的是什么。

人们对他们的基本DAO(TDG,TRG,你有什么)进行子类化的主要原因是为每个域对象类型提供一个明确的,不同的类型安全接口+它使客户更容易找到正确的数据访问函数他们需要为了实现一个用例。这是相同的基类是抽象的代码......

如果你在应用程序的开始阶段我会建议您使用工具来处理数据访问(如Hibernate为例)。这些工具非常通用,并且存在一百万个问题,但至少您可以专注于先让您的业务逻辑正确,然后再担心这些应用领域之外的问题。如果事实证明问题毕竟存在,并且您的软件看起来像是成功了,那么您可以继续进行数据访问,以改善性能或您选择的工具所带给您的其他令人头痛的问题。我只是这样说,因为制作一个好的本地数据访问解决方案相当困难,而且这将花费你大量的时间。考虑并发问题,从数据库ID到内存实例(s!)的映射等等。

至于你关于ResultSet的问题。不,getObject将以Result对象的形式获取此ResultSet对象的当前行中指定列的值。因此,您必须自己进行投射,这也是为什么从您的域对象获取来自ResultSet的Factory的好主意(如果沿着这条路径)。

这是一个巨大的话题,我很抱歉,如果我不能进入所有的模式更详细。我也努力做自己:-)如果你决定自己做,而不是使用“标准”工具,我会很乐意回答你的更多问题,在你弄清楚我提到的哪些模式后最适合你的需求。

问候。