우리가 주로 쓰는 이름지정 파라미터의 종류는
Map,
MapSqlParameterSource
BeanPropertySqlParameterSource
이렇게 있음
Sql 붙은 건 당빠 SqlParameterSource 상속받은거
Map은 그냥 쓰면 되고
MapSqlParameterSource는
그냥 Map처럼 쓰면 되는데, addValue해서 직접 key, value로 추가하고,
근데 이건 Sql에 좀더 특화된 기능을 가지고 있는 Map이라고 함.
BeanPropertySqlParameterSource는
자바 빈 프로퍼티 규약을 통해 자동으로 파라미터 객체를 생성한다고 함.
예를 들어 getItemName -> itemName
저 itemName이 key가 되고 getItemName()해서 얻은 게 value가 되는거지.
String sql = "insert into item(item_name, price, quantity) " +
"values(:itemName, :price, :quantity)";
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
여기선 맵핑되는건 쓰고 안되는 건 안쓰고..
꼭 파라미터 개수가 맞을 필요는 없는 듯.
나는 뭐랄까 내가 직접 만들어서 넣어줘야 하는?
그런 건 MapSqlParameterSource 쓰고
그냥 객체 하나로 다 묶을 수 있는 건 BeanPropetySqlParameterSource 쓸 듯.
private RowMapper<Item> itemRowMapper(){
return BeanPropertyRowMapper.newInstance(Item.class);
}
이 부분
전과 비교해 보자면
private RowMapper<Item> itemRowMapper(){
return (rs, row)->{
Item item = new Item();
item.setId(rs.getLong("id"));
item.setItemName(rs.getString("item_name"));
item.setPrice(rs.getInt("price"));
item.setQuantity(rs.getInt("quantity"));
return item;
};
}
일일히 맵핑 해 주던거,
rs의 키 이름을 알아서 읽어서 예를 들어 rs의 키 이름이 price면
item.setPrice(rs.get("price")) 이런 식으로 해 주는 듯.
근데 위처럼 id가 다른 경우는?
예를 들어 Item 클래스에서는 itemName을 필드로 쓰는 데 db에서는 item_name으로 씀.
이럴 경우는, sql을
String sql = "select id, item_name as itemName, price, quantity from item where id = :id";
이렇게 as 붙이고 별칭으로 쓸 수 있다.
그럼 저 item_name을 itemName이라는 이름으로 가져온다는 뜻이다.
rs.get("itemName") 이렇게 할 수 있게 된다는 뜻인듯?
근데 사실,
자바는 camel표기법을 쓰고,
db는 주로 snake표기법을(_언더바) 많이 쓰기 때문에,
언더스코어표기법을 카멜표기법으로 자동변환 해 준다.
아마 underbar 위치 찾아서 없으면(-1이면) 그냥 넘어가고 있으면
그 언더바 지우고 다음 언어 -30인가? 대소문자 차이가? 그렇게 해줄 듯.
DB같은 경우 대소문자를 구분하지 않기 위해 _를 쓴거임.
그냥 좀 뭐랄까 컬럼 이름이랑 객체의 필드 이름이랑 완전히 다른 경우,
그 떄 as 별칭 해서 쓰면 될 듯.
'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글
12. DB 접근 기술 테스트 하는 법 (0) | 2023.10.09 |
---|---|
11. JDBC 기능들 (0) | 2023.10.08 |
9. 이름지정 파라미터 (0) | 2023.10.08 |
8. 구현한 Jdbc로 갈아 끼우기. (0) | 2023.10.08 |
7. Jdbc 템플릿 + h2를 리포지토리 구현체로 (0) | 2023.10.08 |