Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免Java中静态类的代码重复_Java_Postgresql_Jdbc - Fatal编程技术网

避免Java中静态类的代码重复

避免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

我正在编写一个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
)设置一个构造函数,每次使用它时都传递
字符串。。。但我每次都要实例化它!我真的想避免这种情况


谢谢任何人的帮助

听起来像是在寻找
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搜索是非常简单的。