public void updateStock(Connection conn, long foodId, int stock) throws SQLException {
try (PreparedStatement ps = conn.prepareStatement("""
UPDATE foods
SET stock = ?
WHERE id = ?
""")) {
ps.setInt(1, stock);
ps.setLong(2, foodId);
ps.executeUpdate();
}
}
여기서 PreparedStatement와 ps.executeUpdate() 부분의 반복을 없애볼 것이다.
public class MyJdbcTemplate {
public int update(Connection conn, String sql, Object... params) {
try(PreparedStatement ps = conn.prepareStatement(sql)) {
for (int i = 0; i < params.length; i++)
ps.setObject(i + 1, params[i]);
return ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
커넥션과 SQL을 받아서 params를 그대로 박아 넣는 것이다.
이제 업데이트에 PreparedStatement를 직접 안써도 된다. try-catch도 필요없다.
public void updateStock(Connection conn, long foodId, int stock) throws SQLException {
myJdbcTemplate.update(conn, """
UPDATE foods
SET stock = ?
WHERE id = ?
""", stock, foodId);
}
순서가 뒤바뀌면 SQL이 이상하게 동작할 수 있다는게 아쉽다.
그래도 PreparedStatement를 처리하는 코드를 벗어났다는 점에서 위안이 된다.