避免Java中静态类的代码重复
我正在编写一个Java应用程序,它必须管理使用PostgreSQL创建的两个不同的数据库(比如避免Java中静态类的代码重复,java,postgresql,jdbc,Java,Postgresql,Jdbc,我正在编写一个Java应用程序,它必须管理使用PostgreSQL创建的两个不同的数据库(比如Onebase和Twobase) 为了处理连接和查询,我使用JDBC为第一个文件创建了一个文件(名为OnebaseUtil),大致如下所示: public class OnebaseUtil { private static final String JDBC_DRIVER = "org.postgresql.Driver"; private static Connection conn
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
)设置一个构造函数,每次使用它时都传递字符串。。。但我每次都要实例化它!我真的想避免这种情况
谢谢任何人的帮助 听起来像是在寻找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传递给连接到数据库的方法即可。这样,您将首先连接到相关数据库,然后执行所需的查询 事实上,这种数据库代码模式非常常见,但也有缺点
一种更好的方法是使用XML或属性声明性地存储多个数据源。(不同的开发/生产)
使用这种数据源的一种方法是使用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()) {
...
}
}
}
你想使用任何依赖注入框架吗,或者你自己可以这样做吗?我会让它们成为非静态的。您不必每次都实例化它:您可以创建所需的实例并保留对它们的引用。谢谢您的回答!你发送的链接非常有用。你知道postgres 9.5.7可以使用什么数据源吗?我只为7.3找到了一些,但我的IDE给了我警告,因为它是不推荐的!我也需要搜索。我个人会创建一个maven项目。Maven提供了一个构建基础设施sich库管理,JAR从远程到本地存储库下载到项目中。那么maven搜索是非常简单的。