< RowMapper 사용 방법 >
List<T> query
: 일반적으로 질의가 여러 개의 column들을 검색하는 경우 사용
① DAO 구현 클래스
public class JdbcTemplateCategoryDao implements CategoryDao {
private JdbcTemplate jdbcTemplate; // 템플릿을 DAO에 주입 (date source ---> template ---> dao)
private static final String GET_CATEGORY_SQL = "select CATID, NAME, DESCN from CATEGORY";
...
public List<Category> getCategoryList() {
List<Category> list = jdbcTemplate.query(GET_CATEGORY_SQL //String sql, new CategoryRowMapper() //RowMapper<T> rowmapper);
return list; //query 메소드는 list 타입이기 때문에 list로 리턴!
}...
}
② RowMapper 구현 클래스, DAO 구현 클래스 2개 사용이 아니라 DAO 구현 클래스 하나로 처리하기
public class JdbcTemplateCategoryDao implements CategoryDao {
private JdbcTemplate jdbcTemplate; // 템플릿을 DAO에 주입 (date source ---> template ---> dao)
...
private static final String GET_CATEGORY_SQL = "select CATID, NAME, DESCN from CATEGORY";
...
public List<Category> getCategoryList() {
List<Category> list = jdbcTemplate.query(GET_CATEGORY_SQL,
// RowMapper 구현 클래스에 있던 것들이 DAO 구현 클래스에서 query의 파라미터로 들어감
new RowMapper<Category>() { //여기보면 클래스명이 아니라 인터페이스 이름을 갖다 씀 -->익명클래스
public Category mapRow(ResultSet rs, int rowNum) throws SQLException {
Category category = new Category(); // 일단 사용할 클래스 객체 생성
category.setCategoryId(rs.getString("CATID"));
category.setName(rs.getString("NAME"));
category.setDescription(rs.getString("DESCN"));
return category;
}
}
); // 여기까지 List<Category> list
return list;
}...
}
③ java 8의 Lamda expression 활용 방법
- 더 간결
- 질의에 파라미터 있는 경우 주로 사용
public class JdbcTemplateCategoryDao implements CategoryDao {
private JdbcTemplate jdbcTemplate; // 템플릿을 DAO에 주입 (date source ---> template ---> dao)
...
private static final String GET_CATEGORY_SQL =
"select CATID, NAME, DESCN from CATEGORY where CATID = ?"; //질의에 파라미터 존재 -> 배열 필요
...
public List<Category> getCategoryList() {
List<Category> list = jdbcTemplate.query(GET_CATEGORY_SQL, new Object[] {cid}, //파라미터 있기에 배열 필요
(rs, rowNum) -> { // 세번째 파라미터
// mapRow의 파라미터만 써줌 (Lamda식 표현 방식)
Category category = new Category(); // 일단 사용할 클래스 객체 생성
category.setCategoryId(rs.getString("CATID"));
category.setName(rs.getString("NAME"));
category.setDescription(rs.getString("DESCN"));
return category;
}
}
); // 여기까지 List<Category> list
return list;
}...
}
List<T> queryForList
: 질의가 하나의 column만 조회하는 경우 사용
: column 값의 type에 해당하는 class 인자 제공
List<String> names = jdbcTemplate.queryForList(
"select PROD_NAME from PRODUCT where CAT_ID = ?", // = GET_PROD_NAME
new Object[] {"cat1"},
String.class);
List<T> queryForObject
: 질의 결과로 List가 아닌 하나의 객체 반환
( ! ) 앞에 다른 메소드들처럼 List<Category> list = ... 이 아니야 List가 아니니까!
Category category = (Category) jdbcTemplate.queryForObject(...)
: primary key를 검색하는 그런 질의
: 질의 결과로 반환되는 row가 하나인 경우 사용 가능
: 질의 결과로 반환되는 row가 다수이면 IncorrectResultSizeDataAccessException 발생
public Category getCategory(String categoryId) {
Category category = (Category) jdbcTemplate.queryForObject(
"select PROD_NAME from PRODUCT where CAT_ID = ?",
new Object[] {categoryId},
new CategoryRowMapper() );
//검색 결과 컬럼이 여러개면 rowMapper 사용해야하고 하나이면 위에 처럼 .class 인자 사용
return category; // list 리턴이 아닌 category 도메인 객체를 리턴
}
RowMapper 구현 클래스도 category 리턴
'SPRING' 카테고리의 다른 글
[NamedParameterJdbcTemplate] (0) | 2019.05.13 |
---|---|
[JdbcTemplate] 그 외 메소드 / 가변 길이 인자 지원 (0) | 2019.05.13 |
외부 설정 Property (0) | 2019.03.28 |
Bean Scope (Bean 유효범위) (0) | 2019.03.28 |
DI Java Code (0) | 2019.03.27 |