【问题标题】:separating SQL from JAVA code将 SQL 与 JAVA 代码分离
【发布时间】:2013-01-29 14:47:00
【问题描述】:

问题

在我的一些项目中,我使用了 SQL 代码,这没什么特别的。 但我正在重新考虑这个策略。我搜索了一些东西来分开我的 代码和 SQL 语句。

我找到了一个我喜欢的答案,将所有 SQL 语句收集到一个属性文件中。 我认为它很好,很干净。但是如果你想插入变量怎么办。

我发现的另一个解决方案是使用 DAO 对象。例如,您使用以下方法创建一个 MYSQLFactory 类:addCustomer(Customer customer)、deleteCustomer(int CustomerId) 等。您将集中您的 SQL 代码。仍然 不会叫它分开。

有没有更好的方法来做到这一点,而不使用像 Hibernate 这样的 ORM。读得越多,我就越相信 JAVA 没有一种简洁的方法。

搜索来源

Java - Storing SQL statements in an external file

Separating SQL from the Java Code

更新

感谢您的好评。我只是对此感到好奇。 @Gilbert,我认为这是一个很好的解决方案,事实上,我曾经曾经使用过您的解决方案,所以谢谢。 :)

有时我只是想研究某些问题的新方法。

【问题讨论】:

  • “用 JAVA 没有一种简洁的方法”?你有没有找到任何其他语言的简洁方法?如果是这样,您可以尝试重新设计该方法。
  • 这个答案就是我所做的。这种方法有什么问题? stackoverflow.com/a/10873022/300257
  • 就我个人而言,你可以做的最大的事情是在属性文件中分离它,如果你想替换变量而不是使用“?”,你的查询就会受到注入攻击。
  • @GilbertLeBlanc 这种方法没有任何问题。但是那时您正在制作自己的orm。您正在做的事情与任何其他形式之间的唯一区别是您正在手动生成代码。没有任何逻辑差异。

标签: java sql dao


【解决方案1】:

你没有说明你的目标是什么。我不确定您是否只是在寻找一种将所有 SQL 代码放在一个地方的技术解决方案,或者是关于如何跨多种语言管理应用程序的建议。

为了用另一种语言管理 SQL 代码,以下是你的朋友:

  • 存储过程
  • 观看次数

以下不是你的朋友:

  • 即席查询

问题在于数据库的“API”。 SQL 是原始数据表的接口。但是,通常数据库是应用程序的一个组件,应该有自己的 API。通常,该层应由视图和存储过程组成。因此,例如,更新和插入(即即席查询)应该包装在存储过程中。

【讨论】:

    【解决方案2】:

    不,没有。如果您不使用 ORM,则需要在代码中的某处进行直接 SQL 调用。如果您开始在工厂模式中混淆 sql 调用,那么您只是在制作一个糟糕的 ORM。

    【讨论】:

      【解决方案3】:

      我个人更喜欢将 SQL 查询放在执行它的 Java 文件中。这使得维护代码更容易:无需在多个文件之间切换。

      也就是说,将 SQL 查询存储在外部文件(属性或 XML 或其他文件)中非常简单。如果你需要插入一个变量,无论如何你都会使用准备好的语句,所以你的 SQL 看起来像

      select foo.* from Foo foo where foo.id = ?
      

      唯一的困难是动态生成的 SQL 查询(例如,来自一组可选的搜索条件)。但是有些 API 允许在不连接查询部分的情况下生成此类 SQL 查询。

      【讨论】:

        【解决方案4】:

        关于您的问题:
        没有理想的方法,有几种解决方案:
        A. 使用 ORM - 不知道你为什么不想要它。
        B. 按照您的建议使用属性文件 - 关于参数,
        您将需要处理它,考虑使用一些框架来为您执行参数替换。
        C. 您可以使用数据库中的存储过程/视图层抽象一些 SQL 查询。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 1970-01-01
          • 1970-01-01
          • 2014-10-25
          • 1970-01-01
          • 1970-01-01
          • 2012-07-31
          相关资源
          最近更新 更多