스프링/6. 스프링 DB-2

10. 이름지정 파라미터2

sdafdq 2023. 10. 8. 18:42

우리가 주로 쓰는 이름지정 파라미터의 종류는

 

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 별칭 해서 쓰면 될 듯.