2

作为我Java程序的一部分,我需要对 ( Oracle) 数据库进行大量查询。

目前,我们创建了一个混合 SQL 和 Java,(我知道)这是一件坏事。

处理这样的事情的正确方法是什么?如果可能,包括示例。

谢谢你。

编辑:

有关该应用程序的更多信息。它是一个主要从数据库获取内容的 Web 应用程序(它接受用户输入并根据数据库认为真实的内容绘制接下来要看到的内容)。

我对今天如何完成它的最大担忧是混合 Java 代码和 SQL 查询在紧密耦合时看起来“不合时宜”(查询硬编码为源代码的一部分)

我正在寻找一种更简洁的方法来处理这种情况,这将提高手头项目的可维护性和清晰度

4

7 回答 7

4

对于您所描述的内容,合并对象关系映射器 (ORM) 或重写为存储过程可能比您想要接受的工作更多。两者都有非平凡的学习曲线。

相反,一个好的做法是将 SQL 合并到每个表或目的的类中。看看表数据网关对象数据访问对象设计模式,看看这是如何在实践中完成的。

这种方法的结果是无数的。您可以更好地重用,因为查询在一个位置。当您用方法调用(例如userTableDataGateway.getContentToShow(pageId))替换几行 JDBC 和 SQL 时,客户端代码变得更易读。最后,这将帮助您更清楚地看到 ORM 帮助解决的问题。

于 2012-05-10T02:45:25.913 回答
3

好吧,您可以考虑的一件事是对象关系映射器(例如,Hibernate)。这将允许您将数据库模式映射到 Java 对象,这通常会清理您的 Java 代码。

但是,如果性能和速度至关重要,则最好使用普通的 JDBC 驱动程序。

这当然也取决于您的应用程序试图完成的任务。例如,如果您需要基于 CSV 文件进行批量更新,我可能会使用纯 JDBC 解决方案。如果您正在设计 Web 应用程序,我肯定会选择 ORM 解决方案。

另外,请注意纯 JDBC 解决方案将涉及在您的 Java 代码中使用 SQL。实际上,就此而言,在任何 ORM 解决方案中都必须有某种形式的 SQL,无论是HQLJPQL还是纯 SQL。重点是,Java 应用程序中的某些 SQL 没有任何问题。

编辑以响应 OP 的编辑

如果我从头开始编写 Web 应用程序,我会使用 ORM。但是,由于您已经有一个工作应用程序,因此从纯 JDBC 解决方案过渡到 ORM 将非常痛苦。它会清理您的代码,但需要大量的学习曲线,并且需要进行大量设置。如果您使用某种 bean 管理系统(如 Spring),设置时的一些痛苦会得到缓解,但它仍然非常重要。

它还取决于您想将应用程序带到哪里。如果您计划在很长一段时间内维护和添加此代码,则可能需要进行重构。但是,我不会因为您不喜欢在应用程序中硬编码 SQL 就建议您重新编写系统。

于 2012-05-10T02:15:35.093 回答
2

根据您的更新,我同意 Tim Pote 的编辑:集成 ORM 的学习曲线。但是,您可以不集成 ORM,而是使用准备好的语句,然后将其存储在属性文件中。或者甚至将您的查询存储在数据库中,以便您可以对它们进行细微的更新,然后可以立即读取这些更新,而无需重新启动您的应用服务器。这两种策略都会整理你的硬编码 SQL 的 Java 代码。

但最终,我认为您的问题没有明确的答案,因为您所做的事情本身并没有错。这有点不灵活,但对于您的情况来说可能是可以接受的。

也就是说,我将其发布为答案!

于 2012-05-10T02:30:24.907 回答
2

我不确定项目的状态,但您也可以找到一个名为 MyBatis 的“替代”对象关系映射器。它的学习曲线比流行的 hibernate 或 eclipselink 低,让您实际编写查询,这样您就知道代码在做什么。那就是如果 ORM 是你的事。

我现在正在使用 JPA(主要是因为这是当前的趋势,需要学习)。JPA 是 ORM 的 Java 标准。如果您要了解目前典型的 ORM 做事方式,JPA 可能是最好的选择。像 Hibernate 和 Eclipselink 这样的框架驱动它。根据您选择支持 JPA 应用程序的框架,您可以使用专有功能,但这会将您与该框架联系在一起。JPA 不难开始使用,但是当它不起作用时可能会非常神秘,因为它会混淆与数据库的交互(请注意,它确实允许使用本机 SQL 查询的选项,但是那种否定人们说 JPA 风格的数据库访问很好的原因)。

是的,仍然有人使用带有准备好的语句的 JDBC。通常,在使用普通的旧 JDBC 进行编程时,您将使用一些实践/模式,它们的行为就像一个非常非常简约的 ORM ......或者真的更接近 MyBatis。同样,如果你走这条路,请使用准备好的语句。他们否定了许多危险。

这是一个宗教问题,所以你会听到很多以你写问题的方式传教的声音。事实上,有人可能会为此拒绝你的问题。我认为您可能会问的唯一可能更糟的问题是 emacs 还是 vi 对一群 unix 极客来说更好。

于 2012-05-10T02:39:14.453 回答
1

您的问题似乎太笼统了,但是如果您在 Oracle 和 Java SQL 上混合使用 Direct SQL,最好花一些时间在像 Hibernate 或 Apache Cayenne 这样的 ORM 上。ORM 是一种单独的设计方法,用于将数据库操作与 Java 端分离。所有数据库交互和数据库设计都在 ORM 上实现,所有访问和业务逻辑都将驻留在 Java 中,这是一个建议。不过,仍然不清楚您的实际问题。

于 2012-05-10T02:14:56.680 回答
1

我对今天如何完成它的最大担忧是混合 Java 代码和 SQL 查询在紧密耦合时看起来“不合时宜”(查询硬编码为源代码的一部分)

你的这个假设并不是真的“正确”,因为你的问题会有一个真/假的答案。这里的这个问题解释了有几种处理混合Java和SQL的方法:

Java 编程 - SQL 语句应该存储在哪里?

它本质上区分了 SQL:

  • 在业务对象中硬编码
  • 嵌入在SQLJ子句中
  • 封装在单独的类中,例如数据访问对象
  • 元数据驱动(将对象模式与数据模式解耦 - 在元数据中描述它们之间的映射)
  • 放入外部文件(例如属性或资源文件)
  • 放入存储过程

我会补充一点:

于 2013-09-07T13:24:26.180 回答
0

Apache Cayenne,是最容易使用的 ORM 之一。它带有一个 Cayenne Modeller 来对数据对象建模并进行映射。我会向 ORM 的初学者推荐 Cayenne。它可以通过建模器创建映射类和数据库同步。

于 2012-05-10T02:36:40.800 回答