diff --git a/src/main/java/next/dao/JdbcTemplate.java b/src/main/java/next/dao/JdbcTemplate.java new file mode 100644 index 000000000..8c5368454 --- /dev/null +++ b/src/main/java/next/dao/JdbcTemplate.java @@ -0,0 +1,73 @@ +package next.dao; + +import core.jdbc.ConnectionManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +class JdbcTemplate { + + List query(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { + + ResultSet rs = null; + try (Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(sql); + ) { + setter.values(pstmt); + + rs = pstmt.executeQuery(); + + List list = new ArrayList<>(); + while (rs.next()) { + list.add(rowMapper.mapRow(rs)); + } + + return list; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (rs != null) { + rs.close(); + } + } + + return null; + } + + Object queryForObject(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { + ResultSet rs = null; + try (Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(sql); + ){ + + setter.values(pstmt); + + rs = pstmt.executeQuery(); + + if (rs.next()) { + return rowMapper.mapRow(rs); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (rs != null) { + rs.close(); + } + } + + return null; + } + + void update(String query, PreparedStatementSetter setter) throws SQLException { + try ( + Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(query);){ + setter.values(pstmt); + } + } +} diff --git a/src/main/java/next/dao/PreparedStatementSetter.java b/src/main/java/next/dao/PreparedStatementSetter.java new file mode 100644 index 000000000..167e91518 --- /dev/null +++ b/src/main/java/next/dao/PreparedStatementSetter.java @@ -0,0 +1,8 @@ +package next.dao; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public interface PreparedStatementSetter { + void values(PreparedStatement preparedStatement) throws SQLException; +} diff --git a/src/main/java/next/dao/RowMapper.java b/src/main/java/next/dao/RowMapper.java new file mode 100644 index 000000000..88431d8d0 --- /dev/null +++ b/src/main/java/next/dao/RowMapper.java @@ -0,0 +1,8 @@ +package next.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public interface RowMapper { + T mapRow(ResultSet rs) throws SQLException; +} diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java index db270861f..494ce632f 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -1,78 +1,77 @@ package next.dao; -import java.sql.Connection; -import java.sql.PreparedStatement; +import next.model.User; + import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; - -import core.jdbc.ConnectionManager; -import next.model.User; +import java.util.stream.Collectors; public class UserDao { public void insert(User user) throws SQLException { - Connection con = null; - PreparedStatement pstmt = null; - try { - con = ConnectionManager.getConnection(); - String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; - pstmt = con.prepareStatement(sql); + + String query = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; + + JdbcTemplate insertJdbcTemplate = new JdbcTemplate(); + PreparedStatementSetter pss = pstmt -> { pstmt.setString(1, user.getUserId()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getName()); pstmt.setString(4, user.getEmail()); pstmt.executeUpdate(); - } finally { - if (pstmt != null) { - pstmt.close(); - } - - if (con != null) { - con.close(); - } - } + }; + + insertJdbcTemplate.update(query, pss); } public void update(User user) throws SQLException { - // TODO 구현 필요함. + + String query = "UPDATE USERS SET password = ?, name = ?, email = ? where userId = ?"; + + JdbcTemplate updateJdbcTemplate = new JdbcTemplate(); + PreparedStatementSetter pss = pstmt -> { + pstmt.setString(1, user.getPassword()); + pstmt.setString(2, user.getName()); + pstmt.setString(3, user.getEmail()); + pstmt.setString(4, user.getUserId()); + + pstmt.executeUpdate(); + }; + + updateJdbcTemplate.update(query, pss); } public List findAll() throws SQLException { - // TODO 구현 필요함. - return new ArrayList(); + + String sql = "SELECT userId, password, name, email FROM USERS"; + + JdbcTemplate sjt = new JdbcTemplate(); + + PreparedStatementSetter setter = preparedStatement -> {}; + + RowMapper rowMapper = this::getUser; + + return sjt.query(sql, setter, rowMapper).stream() + .map(o -> (User) o) + .collect(Collectors.toList()); + } + + private User getUser(ResultSet rs) throws SQLException { + return new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"), + rs.getString("email")); } public User findByUserId(String userId) throws SQLException { - Connection con = null; - PreparedStatement pstmt = null; - ResultSet rs = null; - try { - con = ConnectionManager.getConnection(); - String sql = "SELECT userId, password, name, email FROM USERS WHERE userid=?"; - pstmt = con.prepareStatement(sql); - pstmt.setString(1, userId); - - rs = pstmt.executeQuery(); - - User user = null; - if (rs.next()) { - user = new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"), - rs.getString("email")); - } - - return user; - } finally { - if (rs != null) { - rs.close(); - } - if (pstmt != null) { - pstmt.close(); - } - if (con != null) { - con.close(); - } - } + + String sql = "SELECT userId, password, name, email FROM USERS WHERE userid=?"; + + JdbcTemplate sjt = new JdbcTemplate(); + + PreparedStatementSetter setter = pstmt -> pstmt.setString(1, userId); + + RowMapper rowMapper = this::getUser; + + return (User) sjt.queryForObject(sql, setter, rowMapper); } }