如何在运行时选择JDBC / JPA实现



我正在编写一个应用程序,该应用程序旨在使用 jdbc和jpa 进行考试。我希望用户在开始时选择一次API使用,以便所有应用程序都将使用所选的API (无论是JPA还是JDBC)。

目前我决定使用这种方法:

  1. i创建了每个DAO类的接口(例如interface UserDAO)使用所有必需的方法声明。
  2. i为每个DAO 创建了两个类,由使用的API (例如UserDAOImplJDBCUserDAOImplJPA)区分。他们俩都实现了接口(在我们的情况下,UserDAO)。
  3. 我创建了一个扩展JDBC实现类的第三类(例如UserDAOImpl)。在我的所有代码中,我一直在使用此类。当我想切换到JPA时,我只需要在所有DAO类中更改extends ***ImplDAOJDBCextends ***ImplDAOJPA

现在,当我开始参加许多DAO课程时,每次修改代码开始变得复杂。

有没有办法更快地更改所有extends?我正在考虑在第一个屏幕(例如radioGroup)中添加一个选项以选择JDBC或JPA。但是,我不知道如何使其正常工作而无需重组所有代码。有什么想法吗?

每次需要一个工厂来获取适当的dao:

public class UserDaoFactory {
    public UserDao create() {
        if (SomeSharedSingleton.getInstance().getPersistenceOption() == JDBC) {
            return new UserDAOImplJDBC();
        }
        else {
            return new UserDAOImplJPA();
        }
    }
}

那是经典的OO模式。

也就是说,我希望您意识到您在那里所做的事情实际上永远不应该在真实的应用中完成:

  • 没有理由以两种不同的方式做完全相同的事情
  • JPA和JDBC的持久性模型截然不同:JPA实体是由JPA引擎管理的,因此对JPA实体的每一个更改都是透明的。JDBC并非如此,其中您从数据库中获得的数据被分离了。因此,JPA和JDBC之间实施业务逻辑的方法非常不同:使用JPA时,您通常不需要保存任何更改。

你有1和2对,但是3完全错误。
例如,不要让Impl扩展其他实现之一,而是选择使用实用程序方法初始化的实现。假设您不使用依赖性注入框架,例如春季。

UserDAO dao = DBUtils.getUserDAO();
public class DBUtils {
   public static boolean shouldUseJdbc() {
      // Decide on some configuration what should you use
   }
   public static UserDAO getUserDAO() {
      if (shouldUseJdbc()) {
          return new UserDAOImplJDBC();
      }
      else {
          return new UserDAOImplJPA();
      }
   }
}

这仍然是一个调查局,因为您的Daos并非每次都需要实例化,但实际上应该是单身人士。

最新更新