簡體   English   中英

用Java處理丑陋的SQL

[英]Dealing with ugly SQL in Java

這是一個SQL-Java編碼風格的問題...

這里的其他人如何處理干凈地在Java中創建復雜的自定義查詢?

我說的是准備一個似乎是要執行的SQL語句的字符串的看似簡單的任務。

我知道HQL以及存儲過程,但是老實說我並不真正喜歡這些解決方案。 也許可以說服我不同。 存儲過程部署/維護很煩人,而對我而言,解析性能並不是一個大問題-靈活性優先。 HQL似乎是一個巨大的飛躍,並且對我的復雜查詢有一些限制。

明確地說,我說的是看起來很丑陋的代碼,如下所示:

    return 
        "(" + topTwenty + ")" +
        "UNION " +
        "(" + twentyBeforeMe + ")" +
        "UNION " +
        "(" + meDummyQuery + ")" +
        "UNION " +
        "(" + twentyAfterMe + ")";

例如,在變量topTwenty所在的地方,子查詢也類似地創建。

我從沒想過要這么說,但是在PHP中它比較干凈,因為PHP中包含多行字符串和$ variable嵌入到字符串中。

人們是否曾經使用過簡單的模板庫? 您如何整齊地將字符串保留在程序中? 還是將它們放在單獨的文件中(對我來說似乎也很煩)。

如果不進行數據庫抽象,則可以使用PreparedStatment使查詢更具可讀性-更不用說它有助於提高安全性。

您可能想看看參數化查詢,您可以使用JDBC PreparedStatement查詢。 如果您來自PHP世界,則類似於PDO。 基本上。 您上面提到的PHP字符串中所有的動態$variable都將是? 參數化查詢中的。 ? 使用PreparedStatement實現的方法以安全的方式(以正確的轉義方式)進行替換。

有關示例和更多說明,請參見Sun的PreparedStatement教程

Java具有PrintFormat類,該類與C中的sprintf十分相似,您可能想利用它來格式化查詢。

以下代碼段摘自http://java.sun.com/developer/technicalArticles/Programming/sprintf/

System.out.println(
new PrintfFormat("Pre %s Post%%").sprintf("target")
);  

SQL構造集 ,這是我的項目。

我要做的是將String.format用於表名和無法參數化的東西,以及此類 (NamedPreparedStament), 該類允許對綁定變量而不是問號使用好的名稱。

String sql = "SELECT id FROM %s WHERE id > :lastInsertedYesterday ";
NamedParameterStatement p = new NamedParameterStatement(con, 
                                    String.format(sql, "table1"));
p.setInt("lastInsertedYesterday", lastOne);

如果您認為這會使代碼看起來更簡潔,則可以嘗試使用StringBuilder.append():

return new StringBuilder()
   .append("(").append(topTwenty).append(")")
   .toString();

暫無
暫無

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

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