
이름 지정 파라미터
NamedParameterJdbcTemplate 사용
- 기존 sql은
? 을 통해 파라미터를 구분했지만 이것은 이름을 지정하여 파라미터를 구분할 수 있음
의존성 주입
private final NamedParameterJdbcTemplate template;
public JdbcTemplateItemRepositoryV2(DataSource dataSource) {
this.template = new NamedParameterJdbcTemplate(dataSource);
}
파리미터 넣는 방법
BeanPropertySqlParameterSource
- 객체의 get메소드를 이용함
- 예)
getItemName() , getPrice() -> itemName, price
@Data
public class Item {
private Long id;
private String itemName;
private Integer price;
private Integer quantity;
}
String sql = "insert into item(item_name, price, quantity) values (:itemName, :price, :quantity)";
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
template.update(sql, param)
String sql = "update item set item_name=:itemName, price=:price, quantity=:quantity where id=:id";
MapSqlParameterSource param = new MapSqlParameterSource()
.addValue("itemName", updateParam.getItemName())
.addValue("price", updateParam.getPrice())
.addValue("quantity", updateParam.getQuantity())
.addValue("id", itemId);
template.update(sql, param);
Map
of를 써도 되고 new HashMap<>()을 써도 됨
String sql = "select id, item_name, price, quantity from item where id=:id";
Map<String, Object> param = Map.of("id", id);
Item item = template.queryForObject(sql, param ,itemRowMapper());
객체 변환
BeanPropertyRowMapper 사용
- 클래스만 넣어주면 그에 맞게 자바빈 프로퍼티 규약에 맞춘 메서드 를 호출한다
select itemName, price from ~ -> rs.setItemName(), rs.setPrice()
- 대신 필드명과 컬럼명을 맞춰줘야한다
- 언더스코어 표기법은 자동으로 카멜 표기법으로 변경해줌
(item_name -> itemName)
- 컬럼명이 아에 다른 경우는 쿼리에서
item_name_1 as itemName 으로 별칭을 줘야함
@Data
public class Item {
private Long id;
private String itemName;
private Integer price;
private Integer quantity;
}
private RowMapper<Item> itemRowMapper() {
return BeanPropertyRowMapper.newInstance(Item.class);
}
데이터 변경 - PK 자동 생성
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;