簡體   English   中英

避免使用Java中的靜態類進行代碼重復

[英]Avoid code duplication with static classes in Java

我正在編寫一個Java應用程序 ,它必須管理使用PostgreSQL創建的兩個不同的數據庫(比如說OnebaseTwobase )。

為了處理連接和查詢,我為第一個創建了一個帶有JDBC的文件(名為OnebaseUtil ),它或多或少看起來像這樣:

public class OnebaseUtil {
    private static final String JDBC_DRIVER = "org.postgresql.Driver";
    private static Connection conn = null;
    private static String url = "jdbc:postgresql://localhost:5432/onebase?user=useradmin&password=123456";

    private static void dbConnect() { ... }

    private static void dbDisconnect() { ... }

    public static ResultSet dbExecuteQuery(String queryStmt) { ... }

    public static void dbExecuteUpdate(String sqlStmt) { ... }
}

然后我開始編寫TwobaseUtil ,只是發現代碼完全相同,除了url...twobase...而不是...onebase... )。

如何避免兩個數據庫的代碼重復? 請注意,正如您所看到的,所有方法都是static ,我希望通過所有代碼繼續使用它們作為static 我想過使用單個文件(比如說BothbaseUtil )設置一個構造函數,每次我使用它時都會傳遞String ...但我每次都要實例化它! 我真的想避免這種情況。

謝謝任何人的幫助!

實際上,這種數據庫代碼模式經常被看到,但是有缺點。

最好使用DataSource並以XML或屬性聲明性地存儲多個數據源。 (與開發/生產不同)。

使用這種DataSource的一種方法是使用CDI,依賴注入。 然后,您仍然可以自由地通過測試數據源創建單元測試。

開放/關閉級別和執行功能也很誘人,但是try-with-resources和PreparedStatement是優越的。

try (Connection con = ...) {
}

即使返回/異常,也會自動關閉連接。

try (PreparedStatement stm = con.prepare...) {
    stm.setString(1, "me");
    try (ResultSet rs = stm.executeQuery()) {
        while (rs.next()) {
            ...
        }
    }
}

聽起來你正在尋找一個enum

enum Db {
    One("jdbc:postgresql://localhost:5432/onebase?user=useradmin&password=123456"),
    Two("Something else");
    private static final String JDBC_DRIVER = "org.postgresql.Driver";
    private static Connection conn = null;
    private final String url;


    Db(String url) {
        this.url = url;
    }

    private static void dbConnect() { ... }

    private static void dbDisconnect() { ... }

    public static ResultSet dbExecuteQuery(String queryStmt) { ... }

    public static void dbExecuteUpdate(String sqlStmt) { ... }

}

請注意,任何使用url字段的方法都必須從static刪除,但這不應該是一件壞事。 您仍然只需要在代碼中使用一次。

只需將url傳遞給連接數據庫的方法即可。 這樣,您將首先連接到相關的數據庫,然后執行所需的查詢。

暫無
暫無

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

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