Java JDBC 数据库访问层

标签 java database jdbc

我的想法正确吗?

Java数据库访问层通常是如何实现的?我想我有课DBAL它具有类似

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

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

findOnefindAll将接受type它对应于表名称,然后是用于 WHERE 的列和值条款。很简单,但我想知道这个想法是否正确?

通常我看到很多网站都有 DAO,但没有 ProductDAOUserDAO非常相似?我可以将它们合并到 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/

相关文章:

php - 重复从数据库中选择下拉列表值

java - 从 SQL 表中进行统计

mysql - 如何优化长SQL语句?

java - 了解 Oracle JDBC 驱动程序中的 defaultRowPrefetch 和 defaultBatchValue

java - 哪个 ODBC-JDBC 桥将自己的调用映射到 JDBC 驱动程序?

java - 创建可配置的依赖资源

Java : add integers using StringTokenizer

java - 为目录中的每个文件创建 JButton

java - 帮助遍历节点/输入文件读取

java - 如何查看 Prepared Statements SQL 字符串?