работа с JDBC и запросы к БД

296
04 марта 2017, 03:07

Необходима помощь вот каком вопросе. Написал запросы к БД, на что было получено замечание, что "использование ps неэффективно". Объясните, пожалуйста, в чем ошибка.

public class UserDatabaseDao implements UserDao { 
private final Connection con; 
public UserDatabaseDao(Connection con) { 
    this.con = con; 
}  
private User getUser(ResultSet rs) throws SQLException { 
    User result = new User(); 
    result.setId(rs.getInt("id")); 
    result.setNickname(rs.getString("nickname")); 
    result.setFirstName(rs.getString("firstName")); 
    result.setSecondName(rs.getString("secondName")); 
    result.setPassword(rs.getString("password")); 
    result.setEmail(rs.getString("email")); 
    return result; 
} 
public User getById(int id) { 
    User result = null; 
    try { 
        PreparedStatement ps = con.prepareStatement("SELECT * FROM user WHERE id=?"); 
        ps.setInt(1, id); 
        ResultSet rs = ps.executeQuery(); 
        if (rs.next()) { 
            result = getUser(rs); 
        } 
        ps.close(); 
    } catch (SQLException e) { 
        e.printStackTrace(); 
    } 
    return result; 
} 
public void update(User user) { 
    try { 
        PreparedStatement ps = con.prepareStatement("UPDATE user SET nickname=?, firstName=?, secondName=?, WHERE id=?"); 
        ps.setInt(4, user.getId()); 
    } catch (SQLException e) { 
        e.printStackTrace(); 
    } 
} 

public void add(User user) { 
    PreparedStatement ps; 
    try { 
        ps = con.prepareStatement("INSERT INTO user (nickname, firstName, secondName, password, email)" + 
        " VALUES (?,?,?,?,?)"); 
        ps.setString(1, user.getNickname()); 
        ps.setString(2, user.getFirstName()); 
        ps.setString(3, user.getSecondName()); 
        ps.setString(4, user.getPassword()); 
        ps.setString(5, user.getEmail()); 
        ps.executeUpdate(); 
        ps.close(); 
    } 
    catch (SQLException e) { 
        e.printStackTrace(); 
    } 
} 
public void delete(int id) { 
    try { 
        PreparedStatement ps = con.prepareStatement("DELETE FROM user WHERE id=?"); 
        ps.setInt(1, id); 
        ps.executeUpdate(); 
    } 
    catch (SQLException e) { 
        e.printStackTrace(); 
    } 
} }
Answer 1
public class UserDatabaseDao implements UserDao { 
    private final Connection con; 
    private PreparedStatement getByIdStmt;
    private PreparedStatement updateStmt;
    ......
    public UserDatabaseDao(Connection con) { 
        this.con = con;
        updateStmt = con.prepareStatement("UPDATE user SET nickname=?, firstName=?, secondName=?, WHERE id=?");
        getByIdStmt = con.prepareStatement("SELECT * FROM user WHERE id=?");
        .......
    } 

И т.д.

Сама идея подготовленных запросов в том и состоит, что вы их один раз подготавливаете, а потом переиспользуете с разными параметрами столько раз, сколько вам нужно.

READ ALSO
Выбираю какой язык изучать - Java или Python [требует правки]

Выбираю какой язык изучать - Java или Python [требует правки]

Есть задача - создать веб-приложение по типу CRM (база данный клиентов и работа с ней) с возможностью подсоединения его к api разных сервисов,...

377
Добавление элемента в массив с циклом

Добавление элемента в массив с циклом

Есть такая конструкция

296
Ошибка: Index out of range

Ошибка: Index out of range

Что не так с кодом?

351