JdbcTemplate - 이름 지정 파라미터

박찬우·2024년 2월 5일

스프링 DB

목록 보기
26/53

이름 지정 파라미터

  • 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)
  • MapSqlParameterSource
    • 이름을 지정하여 사용
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 자동 생성

  • DB에서 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;
profile
진짜 개발자가 되어보자

0개의 댓글