SPRING

[JdbcTemplate] List<T> query 메소드들

nang. 2019. 5. 13. 20:20
반응형
SMALL

< 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 리턴

반응형
LIST

'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