package core.jdbc;
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 {
public void executeUpdate(String sql, PreparedStatementSetter pss) throws DataAccessException {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
pss.setParameters(pstmt);
pstmt.executeUpdate();
} catch (SQLException e) {
throw new DataAccessException(e);
} finally {
try {
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new DataAccessException(e);
}
}
}
public void executeUpdate(String sql, Object... parameters) {
executeUpdate(sql, createPreparedStatementSetter(parameters));
}
public <T> T executeQuery(String sql, RowMapper<T> rm, PreparedStatementSetter pss) {
List<T> list = list(sql, rm, pss);
if (list.isEmpty()) {
return null;
}
return list.get(0);
}
public <T> T executeQuery(String sql, RowMapper<T> rm, Object... parameters) {
return executeQuery(sql, rm, createPreparedStatementSetter(parameters));
}
public <T> List<T> list(String sql, RowMapper<T> rm, PreparedStatementSetter pss) throws DataAccessException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
pss.setParameters(pstmt);
rs = pstmt.executeQuery();
List<T> list = new ArrayList<T>();
while (rs.next()) {
list.add(rm.mapRow(rs));
}
return list;
} catch (SQLException e) {
throw new DataAccessException(e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new DataAccessException(e);
}
}
}
public <T> List<T> list(String sql, RowMapper<T> rm, Object... parameters) {
return list(sql, rm, createPreparedStatementSetter(parameters));
}
private PreparedStatementSetter createPreparedStatementSetter(Object... parameters) {
return new PreparedStatementSetter() {
@Override
public void setParameters(PreparedStatement pstmt) throws SQLException {
for (int i = 0; i < parameters.length; i++) {
pstmt.setObject(i + 1, parameters[i]);
}
}
};
}
}