извините за длинный пост. Я постараюсь быть максимально ясным.
Я создаю приложение для своего класса по разработке программного обеспечения, и я стою перед этой проблемой:
Как предположил один из наших учителей, Я должен возложить ответственность за управление ресурсами базы данных на 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);
}
}