Как создать диспетчер соединений и обработать результат запроса несколькими способами? (Java) - PullRequest
0 голосов
/ 30 марта 2020

извините за длинный пост. Я постараюсь быть максимально ясным.

Я создаю приложение для своего класса по разработке программного обеспечения, и я стою перед этой проблемой:

Как предположил один из наших учителей, Я должен возложить ответственность за управление ресурсами базы данных на DAO. Я создал абстрактный класс DAO, который создает соединение с моей базой данных (это база данных PostgreSQL), чтобы управлять каждым соединением в отдельном классе, который открывает поток и закрывает его после того, как результат запроса используется абстрактным методом, который будет реализовано многими конкретными синглтон-классами DAO. В конце поста есть пример того, что я кодировал.

Мне кажется, что все в порядке, потому что благодаря наследованию я могу подключить к базе данных несколько разных DAO, как в моем случае. Теперь дело в том, что я не могу понять, как я могу обработать данные внутри ResultSet, не заботясь о том, что был сделан запрос или какой метод одного из конкретных классов запрашивал соединение.

PS: я пытался найти некоторые шаблоны / решения, но я не нашел ничего подходящего для моего случая. PPS: я знаю, что должен использовать DataSource вместо DriverManager, но это то, чему учили в классе.


Абстрактный класс Пример:

public abstract class AbstractDAO {
  private static final String URL = "my_url";
  private static final String USR = "my_usr";
  private static final String PWD = "my_pwd";

  private final Logger logger = Logger.getLogger(getClass().getName());

  protected void connect(String query){
      try(Connection con = DriverManager.getConnection(URL, USR, PWD);
          PreparedStatement pst = con.prepareStatement(query)){
          ResultSet rs = pst.executeQuery();
          processResult(rs);
      }catch (SQLException e){
          logger.log(Level.SEVERE, e.getMessage());
      }
  }
  // abstract method to process atomically the result in each DAO.
  protected abstract void processResult(ResultSet rs) throws SQLException;
}

Конкретный класс Пример:

public class ConcreteDAO extends AbstractDAO {
  private static ConcreteDAO instance = null;

  private ConcreteDAO() {
      super();
  }

  private static synchronized ConcreteDAO getInstance() {
      if (ConcreteDAO.instance == null) {
          ConcreteDAO.instance = new ConcreteDAO();
      }
      return ConcreteDAO.instance;
  }
  @Override
  protected void processResult(ResultSet rs) throws SQLException {
      int numCols = rs.getMetaData().getColumnCount();
      while (rs.next()) {
          for (int i = 1; i <= numCols; i++) {
              System.out.println("\t" + rs.getString(i));
          }
          System.out.println("");
      }
  }
  public static void main(String[] args) {
    String query = "select name, surname from test";
    getInstance().connect(query);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...