diff --git a/src/main/java/next/controller/CreateUserController.java b/src/main/java/next/controller/CreateUserController.java index d0be7723a..a5fac2bb2 100644 --- a/src/main/java/next/controller/CreateUserController.java +++ b/src/main/java/next/controller/CreateUserController.java @@ -3,6 +3,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import next.dao.UserDao; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +20,9 @@ public String execute(HttpServletRequest req, HttpServletResponse resp) throws E req.getParameter("email")); log.debug("User : {}", user); - DataBase.addUser(user); +// DataBase.addUser(user); + UserDao userDao = new UserDao(); + userDao.insert(user); return "redirect:/"; } } diff --git a/src/main/java/next/dao/JdbcTemplate.java b/src/main/java/next/dao/JdbcTemplate.java new file mode 100644 index 000000000..76903b2be --- /dev/null +++ b/src/main/java/next/dao/JdbcTemplate.java @@ -0,0 +1,80 @@ +package next.dao; + +import core.jdbc.ConnectionManager; +import next.exception.JdbcTemplateException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class JdbcTemplate { + private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class); + + public void update(String sql, PreparedStatementSetter pstmtSetter) { + try (Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(sql)) { + pstmtSetter.setValues(pstmt); + pstmt.executeUpdate(); + } catch (SQLException e) { + log.error("SQLException!! {}", e.getMessage()); + throw new JdbcTemplateException(); + } + } + + public void update(String sql, Object... objects) { + update(sql, createPreparedStatementSetter(objects)); + } + + public PreparedStatementSetter createPreparedStatementSetter(Object... objects) { + return (PreparedStatement pstmt) -> { + for (int i = 1; i <= objects.length; i++) { + pstmt.setObject(i, objects[i - 1]); + } + }; + } + + public List query(String sql, RowMapper rowMapper, PreparedStatementSetter pstmtSetter) { + try (Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(sql)) { + pstmtSetter.setValues(pstmt); + final ResultSet rs = pstmt.executeQuery(); + List results = new ArrayList<>(); + while (rs.next()) { + final T o = rowMapper.mapRow(rs); + results.add(o); + } + return results; + } catch (SQLException e) { + log.error("SQLException!! {}", e.getMessage()); + throw new JdbcTemplateException(); + } + } + + public List query(String sql, RowMapper rowMapper, Object... objects) { + return query(sql, rowMapper, createPreparedStatementSetter(objects)); + } + + public T queryForObject(String sql, RowMapper rowMapper, PreparedStatementSetter pstmtSetter) { + try (Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(sql)) { + pstmtSetter.setValues(pstmt); + final ResultSet rs = pstmt.executeQuery(); + if (rs.next()) { + return rowMapper.mapRow(rs); + } + return null; + } catch (SQLException e) { + log.error("SQLException!! {}", e.getMessage()); + throw new JdbcTemplateException(); + } + } + + public T queryForObject(String sql, RowMapper rowMapper, Object... objects) { + return queryForObject(sql, rowMapper, createPreparedStatementSetter(objects)); + } +} diff --git a/src/main/java/next/dao/PreparedStatementSetter.java b/src/main/java/next/dao/PreparedStatementSetter.java new file mode 100644 index 000000000..f8c4881b0 --- /dev/null +++ b/src/main/java/next/dao/PreparedStatementSetter.java @@ -0,0 +1,9 @@ +package next.dao; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +@FunctionalInterface +public interface PreparedStatementSetter { + void setValues(PreparedStatement pstmt) 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..6551c86b3 --- /dev/null +++ b/src/main/java/next/dao/RowMapper.java @@ -0,0 +1,9 @@ +package next.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; + +@FunctionalInterface +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..6679f3cf5 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -1,78 +1,31 @@ package next.dao; -import java.sql.Connection; +import next.model.User; + import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; -import core.jdbc.ConnectionManager; -import next.model.User; - 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); - pstmt.setString(1, user.getUserId()); - pstmt.setString(2, user.getPassword()); - pstmt.setString(3, user.getName()); - pstmt.setString(4, user.getEmail()); + private final JdbcTemplate jdbcTemplate = new JdbcTemplate<>(); - pstmt.executeUpdate(); - } finally { - if (pstmt != null) { - pstmt.close(); - } - - if (con != null) { - con.close(); - } - } + public void insert(User user) { + jdbcTemplate.update("INSERT INTO USERS VALUES (?, ?, ?, ?)", + user.getUserId(), user.getPassword(), user.getName(), user.getEmail()); } - public void update(User user) throws SQLException { - // TODO 구현 필요함. + public void update(User user) { + jdbcTemplate.update("UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?", + user.getPassword(), user.getName(), user.getEmail(), user.getUserId()); } - public List findAll() throws SQLException { - // TODO 구현 필요함. - return new ArrayList(); + public List findAll() { + return jdbcTemplate.query("SELECT userId, password, name, email FROM USERS", + User::new); } - 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(); - } - } + public User findByUserId(String userId) { + return jdbcTemplate.queryForObject("SELECT userId, password, name, email FROM USERS WHERE userid=?", + User::new, userId); } } diff --git a/src/main/java/next/exception/JdbcTemplateException.java b/src/main/java/next/exception/JdbcTemplateException.java new file mode 100644 index 000000000..ee3705b68 --- /dev/null +++ b/src/main/java/next/exception/JdbcTemplateException.java @@ -0,0 +1,7 @@ +package next.exception; + +public class JdbcTemplateException extends RuntimeException { + public JdbcTemplateException() { + super(); + } +} diff --git a/src/main/java/next/model/User.java b/src/main/java/next/model/User.java index b0bfef294..0316acb44 100644 --- a/src/main/java/next/model/User.java +++ b/src/main/java/next/model/User.java @@ -1,7 +1,17 @@ package next.model; +import next.dao.JdbcTemplate; +import next.exception.JdbcTemplateException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.ResultSet; +import java.sql.SQLException; + public class User { - private String userId; + private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class); + + private final String userId; private String password; private String name; private String email; @@ -13,6 +23,18 @@ public User(String userId, String password, String name, String email) { this.email = email; } + public User(ResultSet rs) { + try { + this.userId = rs.getString("userId"); + this.password = rs.getString("password"); + this.name = rs.getString("name"); + this.email = rs.getString("email"); + } catch (SQLException e) { + log.error("SQLException!! {}", e.getMessage()); + throw new JdbcTemplateException(); + } + } + public String getUserId() { return userId; } diff --git a/src/main/resources/jwp.sql b/src/main/resources/jwp.sql index 85a9d3885..59d18a8b8 100644 --- a/src/main/resources/jwp.sql +++ b/src/main/resources/jwp.sql @@ -9,4 +9,5 @@ CREATE TABLE USERS ( PRIMARY KEY (userId) ); -INSERT INTO USERS VALUES('admin', 'password', '자바지기', 'admin@slipp.net'); \ No newline at end of file +INSERT INTO USERS VALUES('admin', 'password', '자바지기', 'admin@slipp.net'); +INSERT INTO USERS VALUES('siyoon', '12334', '푸루', 'jung_210@naver.com'); \ No newline at end of file diff --git a/src/test/java/next/dao/UserDaoTest.java b/src/test/java/next/dao/UserDaoTest.java index a68f75a8c..73993d322 100644 --- a/src/test/java/next/dao/UserDaoTest.java +++ b/src/test/java/next/dao/UserDaoTest.java @@ -39,6 +39,6 @@ public void crud() throws Exception { public void findAll() throws Exception { UserDao userDao = new UserDao(); List users = userDao.findAll(); - assertEquals(1, users.size()); + assertEquals(2, users.size()); } } \ No newline at end of file