避免使用Java中的静态类进行代码重复

时间:2017-08-07 16:22:05

标签: java postgresql jdbc

我正在编写一个 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...而不是{{1 }})。

如何避免两个数据库的代码重复? 请注意,您可以看到所有方法都是...onebase...,我希望通过所有代码继续将它们用作static。 我想过使用单个文件(让我们说static)设置一个构造函数,每次我使用它时都会传递BothbaseUtil ...但我每次都必须实例化它!我真的想避免这种情况。

感谢任何人的帮助!

3 个答案:

答案 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传递给连接数据库的方法即可。这样,您将首先连接到相关的数据库,然后执行所需的查询。