Методы DAO срабатывают лишь один раз

315
09 марта 2017, 22:04

Внес исправления в предыдущее обращение и сейчас обратил внимание что мои методы работы с ДАО отрабатывают только один раз. Прошу объяснить как исправить данную проблему. Как правильно закрывать 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();
        }
    }
}
}
Answer 1

У данного класса нет ответственности в создании подключения к базе данных (он его получает извне в конструкторе), значит он не должен его закрывать. Закрытие должно происходить на уровне ее открытия. Это к вопросу о правильном закрытии подключения.

В методах getById(int id), update(User user) первой же строкой удаляешь подключение к базе (Connection con = null;) удивительно, что 1 раз отрабатывает данный класс.

READ ALSO
Как через setText присвоить textView число?

Как через setText присвоить textView число?

Необходимо конвертировать его в строку?

250
Java. Крестики нолики

Java. Крестики нолики

Игра крестики ноликиЛишние методы убрал

916
Проблемы с RecycleView android

Проблемы с RecycleView android

Добрый деньВозникла проблема с RecycleView, а именно: Как-то странно забиваются данные в список, если список данных очень большой, то создаются...

385
Медленно работает перемножение матриц java

Медленно работает перемножение матриц java

Добрый деньНаписал код, вычисляющий остаток от деления n-ного числа Фибоначчи на вводимое из консоли число, где n может быть очень большим...

380