47 강을 리팩토링
interface RowMapper<T>
package net.slipp.user;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface RowMapper<T> {
T mapRow(ResultSet rs) throws SQLException ;
}
interface PreparedStatementSetter
package net.slipp.user;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public interface PreparedStatementSetter {
void setParameters(PreparedStatement pstmt) throws SQLException;
}
class UserDAO
package net.slipp.user;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import net.slipp.support.JdbcTemplate;
public class UserDAO {
public void addUser(User user) throws SQLException {
String sql = "insert into USERS values(?,?,?,?)";
JdbcTemplate.getInstance().executeUpdate(sql, user.getUserId(), user.getPassword(), user.getName(), user.getEmail());
}
public User findByUserId(String userId) throws SQLException {
RowMapper<User> row = rowMap();
String sql = "select * from USERS where userId = ?";
return JdbcTemplate.getInstance().executeQuery(sql, row , userId );
}
public void removeUser(String userId) throws SQLException {
String sql = "delete from USERS where userId = ?";
JdbcTemplate.getInstance().executeUpdate(sql,userId);
}
public void updateUser(User user) throws SQLException {
String sql = "update USERS set password = ?, name = ?, email = ? where userId = ?";
JdbcTemplate.getInstance().executeUpdate(sql,user.getPassword(), user.getName(), user.getEmail(), user.getUserId());
}
public List<User> findUsers() throws SQLException {
RowMapper<User> row = rowMap();
String sql = "select * from USERS ";
return JdbcTemplate.getInstance().list(sql, row, null );
}
private RowMapper<User> rowMap() {
RowMapper<User> row =new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs) throws SQLException {
return new User(
rs.getString("userId"),
rs.getString("password"),
rs.getString("name"),
rs.getString("email"));
}
};
return row;
}
}
class JdbcTemplate
package net.slipp.support;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import net.slipp.user.PreparedStatementSetter;
import net.slipp.user.RowMapper;
public class JdbcTemplate {
private static JdbcTemplate instance;
private JdbcTemplate() {}
public static JdbcTemplate getInstance(){
if(instance==null) instance =new JdbcTemplate();
return instance;
}
public void executeUpdate(String sql, PreparedStatementSetter set)throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
set.setParameters(pstmt);
pstmt.executeUpdate();
} finally {
if (pstmt != null)pstmt.close();
if (conn != null) conn.close();
}
}
public void executeUpdate(String sql, Object... parameters )throws SQLException {
executeUpdate(sql, createPreparedStatementSetter(parameters));
}
public <T> T executeQuery(String sql, RowMapper<T> rm , PreparedStatementSetter pss ) throws SQLException {
List<T> list =list(sql, rm, pss);
if(list.isEmpty()) return null;
return list.get(0);
}
public <T> List<T> list(String sql, RowMapper<T> rm , PreparedStatementSetter pss ) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
if(pss!=null)pss.setParameters(pstmt);
rs = pstmt.executeQuery();
List<T> list =new ArrayList<>();
while(rs.next()){
list.add(rm.mapRow(rs));
}
return list;
} finally {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}
}
public <T> T executeQuery(String sql, RowMapper<T> row, Object... parameters) throws SQLException {
return executeQuery(sql, row, createPreparedStatementSetter(parameters));
}
private PreparedStatementSetter createPreparedStatementSetter(Object... parameters) {
PreparedStatementSetter pss =new PreparedStatementSetter() {
@Override
public void setParameters(PreparedStatement pstmt) throws SQLException {
for(int i=0; i<parameters.length; i++){
pstmt.setObject(i+1, parameters[i]);
}
}
};
return pss;
}
}
댓글 ( 5)
댓글 남기기