簡體   English   中英

我應該將 SQL 文件放在我的 Java 項目中的什么位置?

[英]Where should I put the SQL files in my Java project?

我有一個 Java 項目,其中將包含許多用於查詢數據庫的大型 SQL 語句。 我的問題是:我應該把它們存放在哪里?

我很確定我希望每個語句都有自己的文本文件,由源代碼控制管理。 由於 Java 不支持多行字符串,因此我無法輕松地將 SQL 放入我的.java文件中,而且我認為無論如何我都不想這樣做。 在構建時,我可以將這些文本文件放在 JAR 中並使用ClassLoader.getResourceAsStream()獲取內容。

所以我的問題變成了我應該將這些文件放在哪些目錄中以及我應該如何稱呼它們。 理想情況下,我希望人們從.sql文件中知道哪個 Java 類使用它。 我絕對不希望是一個單獨的目錄全名為很多喜歡的東西文件的report1.sqlreport3.sql等。

我的傾向是將它們與所有.java文件一起放在包目錄中,但我有一位同事不喜歡在這棵樹中包含.java文件以外的任何其他文件。 所以這導致了一個單獨的目錄結構的替代方案,它反映了 Java 包,但這似乎是不必要的開銷。

所以我很想聽聽您如何處理 SQL 文件。

我們正在使用 Netbeans 6.5,以防這會影響您的答案。

這個問題很相似,但遺憾的是答案非常針對 C#,這對這個問題有好處,但對我不利。)

在 Java/Maven 設置中,我們用作項目層次結構:

project/src/main/java/Package/Class.java
project/src/test/java/Package/ClassTest.java
project/src/main/resources/Package/resource.properties
project/src/test/resources/Package/test_resource.properties

為了回答您的問題:我會將 SQL 文件與資源一起放在 src/main/resources 下。

你可能想看看這個線程

我很想將 SQL 查詢放在 src 下的專用SQL文件夾中。 這將 Java 代碼與 SQL 分開:

+ src
  + java 
  + sql
     - Package/Class.sql
+ test

或者,您可以使用上述結構將它們放入簡單的屬性文件中:

getUserByName = select * from users where name=?

getUserByEmail = select * from users where email=?

getUserByLongQuery = select * from users where email=? \
   and something = ? \
   where something_else = ?

另外,我認為值得一提的是,如果您更喜歡采用這種方式,可以將多行字符串放入 Java 類中:

class MyClass {
    MY_QUERY = "select * from users where email = ? " + 
               "and something_else = ?";
}

為了與http://maven.apache.org/pom.html#Resources保持一致,這個地方可能是以下之一:

  • src/main/sql
  • src/main/upgradesrv/main/migrate - 用於版本之間的升級/遷移腳本
  • src/main/db , src/main/schema , src/main/ddl - 用於當前項目數據庫架構,用於初始項目部署
  • 等,只需放入src/main/NAME目錄
  • src/main/resources/NAME是將 SQL 文件放入類路徑的最快方法,因為默認情況下 Maven/Gradle 會將所有內容從 ``src/main/resources/` 復制到最終工件。

其他需要考慮的事項:

IDE 可能不支持項目瀏覽器中項目查看器src/main/javasrc/main/resources ,請改用文件查看器

我完全同意布塔。 Maven 為 src 文件夾管理設置了一個很好的標准。 您是否考慮過將 SQL 存儲在 XML 中? 將查詢保存在單個文件中可以更輕松地管理 SQL。 我的第一直覺很簡單:

<?xml version="1.0" encoding="UTF-8"?>
<queries>
    <query id="getUserByName">
        select * from users where name=?
    </query>
    <query id="getUserByEmail">
        select * from users where email=?
    </query>
</queries>

要解析文件,請使用 xpath 甚至 SAX 創建由 id 鍵控的查詢映射,以便快速查詢查找。

這是對最初問題的一個小小的重復,但可以說 SQL 越復雜,它就越屬於數據庫(或服務層),而不是您的 Java 代碼。

否則,隨着代碼的成熟,會出現這樣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM