이전 글에서 JdbcTemplate을 사용하여 쿼리를 작성할 때 ? 를 사용하였는데요. 쿼리에 필요한 파라미터가 여러개 라면 ? 의 순서를 신경써야 하는 단점이 생깁니다.

이때 JdbcTemplate 클래스를 감싸고 있는 NamedParameterJdbcTemplate 클래스를 사용하면 됩니다.

getJdbcOperations() 메소드를 사용해서 감싸고 있는 JdbcTempate 객체를 받아와서 사용할 수 있습니다.

private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

public void setDataSource(DataSource dataSource) {
    this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}

public int countOfActorsByFirstName(String firstName) {

    String sql = "select count(0) from T_ACTOR where first_name = :first_name";

    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);

    return namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
}

: 를 사용해서 ? 대신 sql의 파라미터에 이름을 줄 수 있습니다.

SqlParameterSource에는 위의 예제에 있는 MapSqlParameterSource와 아래 예제에 있는  BeanPropertySqlParameterSource 가 있습니다.

public int countOfActors(Actor exampleActor) {

    // notice how the named parameters match the properties of the above 'Actor' class
    String sql = "select count(0) from T_ACTOR where first_name = :firstName and last_name = :lastName";

    SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);

    return this.namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
}