Внес исправления в предыдущее обращение и сейчас обратил внимание что мои методы работы с ДАО отрабатывают только один раз. Прошу объяснить как исправить данную проблему. Как правильно закрывать connection
и как правильно с ним работать.
package com.oleg.dao.impl;
import com.oleg.dao.UserDao;
import com.oleg.first.User;
import java.sql.*;
public class UserDatabaseDao implements UserDao {
private final Connection con;
private PreparedStatement getByIdStmt;
private PreparedStatement updateStmt;
private PreparedStatement addStmt;
private PreparedStatement deleteStmt;
User user = new User();
public UserDatabaseDao(Connection con) throws SQLException {
this.con = con;
getByIdStmt = con.prepareStatement("SELECT * FROM user WHERE id=?");
updateStmt = con.prepareStatement("UPDATE user SET nickname=?, firstName=?, secondName=?, WHERE id=?");
addStmt = con.prepareStatement("INSERT INTO user (nickname, firstName, secondName, password, email)" +
" VALUES (?,?,?,?,?)");
deleteStmt = con.prepareStatement("DELETE FROM user WHERE id=?");
}
private User getUser(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setNickname(rs.getString("nickname"));
user.setFirstName(rs.getString("firstName"));
user.setSecondName(rs.getString("secondName"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
return user;
}
public User getById(int id) throws SQLException {
User user = null;
try {
getByIdStmt.setInt(1, id);
ResultSet rs = getByIdStmt.executeQuery();
if (rs.next()) {
user = getUser(rs);
}
rs.close();
getByIdStmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
getByIdStmt.close();
}
return user;
}
public void update(User user) throws SQLException {
try {
updateStmt.setInt(4, user.getId());
updateStmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
updateStmt.close();
}
}
public void add(User user) throws SQLException {
try {
addStmt.setString(1, user.getNickname());
addStmt.setString(2, user.getFirstName());
addStmt.setString(3, user.getSecondName());
addStmt.setString(4, user.getPassword());
addStmt.setString(5, user.getEmail());
addStmt.executeUpdate();
addStmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
addStmt.close();
}
}
public void delete(int id) throws SQLException {
try {
deleteStmt.setInt(1, id);
deleteStmt.executeUpdate();
deleteStmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
deleteStmt.close();
}
}
public static void closeConnection(Connection con) throws SQLException {
if (con != null) {
try {
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
con.close();
}
}
}
}
У данного класса нет ответственности в создании подключения к базе данных (он его получает извне в конструкторе), значит он не должен его закрывать. Закрытие должно происходить на уровне ее открытия. Это к вопросу о правильном закрытии подключения.
В методах getById(int id)
, update(User user)
первой же строкой удаляешь подключение к базе (Connection con = null;
) удивительно, что 1 раз отрабатывает данный класс.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый деньВозникла проблема с RecycleView, а именно: Как-то странно забиваются данные в список, если список данных очень большой, то создаются...
Добрый деньНаписал код, вычисляющий остаток от деления n-ного числа Фибоначчи на вводимое из консоли число, где n может быть очень большим...