728x90
반응형
이름 지정 파라미터
map 처럼 key-value 데이터 구조 만들어서 전달해야 한다.
- Map
- SqlParameterSource
- MapSqlParameterSource
- BeanPropertySqlParameterSource
1. Map
Map<String, Object> param = Map.of("id", id);
Item item = template.queryForObject(sql, param, itemRowMapper());
2. MapSqlParameterSource
- Map 과 유사한데, SQL 타입을 지정할 수 있는 등 SQL에 좀 더 특화된 기능을 제공
- SqlParameterSource 인터페이스의 구현체이다.ㄴ
- MapSqlParameterSource 는 메서드 체인을 통해 편리한 사용법도 제공한다.
SqlParameterSource param = new MapSqlParameterSource()
.addValue("itemName", updateParam.getItemName())
.addValue("price", updateParam.getPrice())
.addValue("quantity", updateParam.getQuantity())
.addValue("id", itemId); //이 부분이 별도로 필요하다.
template.update(sql, param);
3. BeamPropertySqlParameterSource
- 자바빈 프로퍼티 규약을 통해서 자동으로 파라미터 객체 생성
- key=itemName, value=상품명 값
- key=price, value=가격 값
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
KeyHolder keyHolder = new GeneratedKeyHolder();
template.update(sql, param, keyHolder);
- BeanPropertySqlParameterSource를 항상 사용할 수 있는 건 아니다.
- 예를 들어서 update() 에서는 SQL에 :id 를 바인딩 해야 하는데, update() 에서 사용하는 ItemUpdateDto 에는 itemId 가 없다. 따라서 BeanPropertySqlParameterSource 를 사용할 수 없고, 대신에 MapSqlParameterSource 를 사용했다.
BeanPropertyRowMapper
- BeanPropertyRowMapper 는 ResultSet 의 결과를 받아서 자바빈 규약에 맞추어 데이터를 변환한다.
- 예를 들어서 데이터베이스에서 조회한 결과가 select id, price 라고 하면 다음과 같은 코드를 작성해준다. (실제로는 리플렉션 같은 기능을 사용한다.)
- Item item = new Item(); item.setId(rs.getLong("id")); item.setPrice(rs.getInt("price"));
- 데이터베이스에서 조회한 결과 이름을 기반으로 setId() , setPrice() 처럼 자바빈 프로퍼티 규약에 맞춘 메서드를 호출하는 것이다
별칭
- select item_name 의 경우 setItem_name() 이라는 메서드가 없기 때문에 골치가 아프다. 이런 경우 개발자가 조회 SQL을 다음과 같이 고치면 된다.
- select item_name as itemName
- 이렇게 데이터베이스 컬럼 이름과 객체의 이름이 다를 때 별칭( as )을 사용해서 문제를 많이 해결한다.
- JdbcTemplate 은 물론이고, MyBatis 같은 기술에서도 자주 사용된다.
관례의 불일치
- 자바 객체는 카멜 표기법 사용
- 관계형 데이터베이스는 주로 언더스코어를 사용하는 snake_case 표기법을 사용한다.
- BeanPropertyRowMapper는 언더스코어 표기법을 카멜로 자동으로 변환해준다.
728x90
반응형
댓글