1. NamedParameterJdbcTemplate란?
JdbcTemplate 객체를 사용하면 "?"를 통해 바인딩을 수행한다. 이때 우리는 "?"에 전달될 인자들을 메서드에 순서대로 전달해야 한다. 이와 같이 작업을 할 경우 가독성이 떨어지며 실수할 여지가 많다. 이를 위해 "?"대시 ":변수명"을 이용하여 처리하도록 해주는 것이 NamedParameterJdbcTemplate이다. 선언 방법은 JdbcTemplate 객체와 동일하게 DateSource 객체를 넘겨주면 된다.
private NamedParameterJdbcTemplate namedJdbcTemplate;
@Autowired
public RoleDao(DataSource dataSource) {
this.namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
JdbcTemplate의 기본적인 설명은 아래 url을 참고하면 된다.
2. Query() 메서드
Query 메서드 역시 JdbcTemplate과 동일하게 사용할 수 있다.
// RoleDaoSqls.java
public static final String SELECT_ALL = "SELECT role_id, description FROM role order by role_id";
// RoleDao.java
public List<Role> selectAll(){
return this.namedJdbcTemplate.query(SELECT_ALL, roleMapper);
}
3. update() 메서드
이번에는 전달할 인자가 있는 경우를 살펴보자. update 메서드도 JdbcTemplate과 동일한 방법으로 사용할 수 있다. 단, 이전에는 인자를 전달할 때 "?"의 순서대로 전달했지만 NamedParameterJdbcTemplate은 SqlParameterSource 타입을 전달한다. 이때 각 ":변수명"은 MapSqlParameterSource() 객체 생성시 .addValue() 메서드를 사용하여 아래와 같이 전달하여 사용한다.
- SqlParameterSource: 쿼리에 들어있는 named parameter 값을 처리하는 인터페이스
// RoleDaoSquls.java
public static final String UPDATE_ROLE = "UPDATE role SET description = :description WHERE role_id = :roleId";
// RoleDao.java
public int updateRole1(Role role) {
SqlParameterSource params = new MapSqlParameterSource()
.addValue("roleId", role.getRoleId())
.addValue("description", role.getDescription());
return this.namedJdbcTemplate.update(UPDATE_ROLE, params);
}
위와 같이 MapSqlParameterSource로 직접 전달할 인자를 정의할 수 있지만 아래와 같이 BeanPropertySqlParameterSource를 사용해 전달하려는 객체를 전달할 수도 있다. 즉, BeanPropertySqlParameterSource는 Bean 객체를 Map 객체로 자동으로 변환해 준다.
// RoleDao.java
public int updateRole2(Role role) {
SqlParameterSource param = new BeanPropertySqlParameterSource(role);
return this.namedJdbcTemplate.update(UPDATE_ROLE, param);
}
위 예제에서 사용된 main문은 아래와 같다.
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
RoleDao roleDao = ac.getBean(RoleDao.class);
Role role = new Role(1, "CAO");
// roleDao.updateRole1(role);
roleDao.updateRole2(role);
List<Role> roles = roleDao.selectAll();
for(Role r: roles) {
System.out.println(r);
}
}
'BackEnd > Spring' 카테고리의 다른 글
[Intellij] Spring xml 파일 (applicationContext.xml) 생성 (0) | 2023.04.23 |
---|---|
[Spring JDBC] BeanPropertyRowMapper (0) | 2023.01.28 |
[Spring JDBC] Jdbc Template이란? (Insert, Update, Delete) (0) | 2023.01.28 |
[Spring JDBC] Jdbc Template이란? (queryForObject, query) (0) | 2023.01.28 |
[Spring JDBC] DataSource를 통해 데이터베이스 연결하기 (0) | 2023.01.27 |