순서대로 바인딩
String sql = "update item set item_name=?, price=?, quantity=? where id=?";
template.update(sql,
itemName,
price,
quantity,
itemId);
위와 같이 사용할 경우 순서를 잘 지키는 것이 중요하다.
일일이 바인딩을 해야 하므로, 순서가 바뀌면 값이 잘못 바인딩 되는 경우가 생긴다.
코드를 몇줄 줄이는 편리함도 중요하지만, 모호함을 제거해서 코드를 명확하게 만드는 것이 좋다
이름 지정 바인딩(권장)
JdbcTemplate에서 위와 같은 문제를 보완하기 위해 NamedParameterJdbcTemplate 이라는 이름을 지정해서 파라미터를 바인딩 하는 기능을 제공하고 있다.
Map
- Map을 사용해서 이름 지정 바인딩을 하는 방법으로, 아래와 같이 사용한다.
@Override
public Optional<Item> findById(Long id) {
String sql = "select id,item_name,price,quantity from item where id = ?";
try {
Map<String, Object> param = Map.of("id",id);
Item item = template.queryForObject(sql, param,itemRowMapper());
return Optional.of(item);
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}
MapSqlParameterSource
- Map과 유사하지만 SQL 타입을 지정할 수 있다.
- SqlParameterSource의 구현체
@Override
public void update(Long itemId, ItemUpdateDto updateParam) {
String sql = "update item set item_name=:itemName,price=:price,quantity=:quantity " +
"where id=:id";
SqlParameterSource param = new MapSqlParameterSource()
.addValue("itemName", updateParam.getItemName())
.addValue("price", updateParam.getPrice())
.addValue("quantity", updateParam.getQuantity())
.addValue("id", itemId);
template.update(sql,param);
}
BeanPropertySqlParameterSource
- 자바 빈 프로퍼티 규약을 통해 자동으로 파라미티 객체를 생성한다.
@Override
public Item save(Item item) {
String sql = "insert into item(item_name,price,quantity) " +
"values (:itemName, :price, :quantity)";
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
KeyHolder keyHolder = new GeneratedKeyHolder();
template.update(sql, param, keyHolder);
long key = keyHolder.getKey().longValue();
item.setId(key);
return item;
}
Dto를 사용할 경우 id값을 바인딩 할 수 없기 때문에(dto에는 id가 없으므로 getId() 메서드가 없다.)
BeanPropertySqlParameterSource를 사용할 수 없다. Map이나 MapSqlParameterSource를 사용해야한다.
SimpleJdbcInsert
Jdbc에서 지원하는 INSERT SQL을 직접 작성하지 않아도 되는 기능
@Override
public Item save(Item item) {
BeanPropertySqlParameterSource param = new BeanPropertySqlParameterSource(item);
Number key = jdbcInsert.executeAndReturnKey(param);
item.setId(key.longValue());
return item;
}
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
스프링 DB 2편 - 데이터 접근 활용 기술 - 인프런 | 강의
백엔드 개발에 필요한 DB 데이터 접근 기술을 활용하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의 소개 | 인
www.inflearn.com
'🍃Spring' 카테고리의 다른 글
[Spring DB] MyBatis 사용하기 (0) | 2023.01.29 |
---|---|
[Spring DB] 테스트 - 트랜잭션 (0) | 2023.01.29 |
[Spring] Spring이란? (0) | 2023.01.28 |
[Spring] MapStruct (0) | 2023.01.23 |
[Spring] DTO를 사용하는 이유 (0) | 2023.01.22 |