[英]Avoid code-duplication while access different classes' static members in Java
[英]Avoid code duplication with static classes in Java
我正在編寫一個Java應用程序 ,它必須管理使用PostgreSQL創建的兩個不同的數據庫(比如說Onebase
和Twobase
)。
為了處理連接和查詢,我為第一個創建了一個帶有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.