我正在编写一个 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...
而不是{{1 }})。
如何避免两个数据库的代码重复?
请注意,您可以看到所有方法都是...onebase...
,我希望通过所有代码继续将它们用作static
。
我想过使用单个文件(让我们说static
)设置一个构造函数,每次我使用它时都会传递BothbaseUtil
...但我每次都必须实例化它!我真的想避免这种情况。
感谢任何人的帮助!
答案 0 :(得分:3)
事实上,这种数据库代码模式经常出现,但也有缺点。
最好使用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()) {
...
}
}
}
答案 1 :(得分:0)
听起来像是在寻找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
中移除,但这不应该是件坏事。你仍然只需要在代码中使用一次。
答案 2 :(得分:0)
只需将url传递给连接数据库的方法即可。这样,您将首先连接到相关的数据库,然后执行所需的查询。