NamedParameterJdbcTemplate
은 스프링 JDBC 모듈에서 제공하는 클래스이다. 일반적인 JdbcTemplate는 SQL 쿼리에서 물음표 (?)로 파라미터를 지정하는데, 이 방식은 파라미터의 순서가 중요해서 코드 가독성이 떨어지고 실수하기 쉽다.
반면 NamedParameterJdbcTemplate은 파라미터에 이름 (:name, :id 등)을 부여해서 사용할 수 있게 해준다.
또한 NamedParameterJdbcTemplate은 맵 기반 (Map<String, Object>) 형태로 파라미터를 전달하므로, 파라미터 이름과 값을 쉽게 매핑할 수 있다.
✍️ 예제 코드
public class UserRepository {
private NamedParameterJdbcTemplate jdbcTemplate;
// 생성자에서 DataSource를 받아 NamedParameterJdbcTemplate 객체 생성
public UserRepository(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
// 사용자 조회 예제: id가 일치하는 사용자 조회
public User findUserById(Long id) {
String sql = "SELECT id, name, email FROM users WHERE id = :userId";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("userId", id);
return jdbcTemplate.queryForObject(sql, params, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
});
}
// 사용자 리스트 조회 예제: 이름에 해당하는 사용자들 조회
public List<User> findUsersByName(String name) {
String sql = "SELECT id, name, email FROM users WHERE name = :name";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", name);
return jdbcTemplate.query(sql, params, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
});
}
}
멋쟁이사자처럼 강의자료