Java 프로그래밍 -Spring 및 JDBCTemplate- 쿼리, 쿼리 포리스트 또는 QueryForrowSet을 사용합니까?
-
11-09-2019 - |
문제
내 Java (JDK6) 프로젝트가 사용됩니다 봄 그리고 jdbctemplate 모든 데이터베이스 액세스. 우리는 최근 봄 2.5에서 스프링 3 (RC1)으로 업그레이드했습니다. 프로젝트는 ORM과 같은 것을 사용하지 않습니다 최대 절전 모드 ...도 아니다 EJB.
레코드를 많이 읽고 내부 처리를 수행 해야하는 경우 몇 가지 (과부하) 방법이있는 것 같습니다 : 쿼리, 쿼리 포리스트 및 쿼리 파일 세트
상대방 대신에 사용하는 기준은 무엇입니까? 성능 차이가 있습니까? 모범 사례?
이 주제에 대한 추가 연구를 위해 외부 참조를 권장 할 수 있습니까?
해결책
목록으로 액세스하는 표준 방법은 query()
다른 접근법보다는 방법. 사이의 주요 차이점 query
다른 방법은 콜백 인터페이스 중 하나를 구현해야한다는 것입니다 ( RowMapper
, RowCallbackHandler
, 또는 ResultSetExtractor
) 결과 세트를 처리합니다.
ㅏ RowMapper
대부분의 시간을 사용하여 자신을 찾을 수있는 것일 수 있습니다. 결과 세트의 각 행이 목록의 한 개체에 해당 할 때 사용됩니다. 단일 방법 만 구현하면됩니다 mapRow
당신이 당신의 행에 들어가는 물체의 유형을 채우고 그것을 반환합니다. 봄에는 봄도 있습니다 BeanPropertyRowMapper
Bean 속성 이름을 열 이름과 일치시켜 목록의 개체를 채울 수 있습니다 (NB이 클래스는 성능이 아닌 편의를위한 것입니다).
ㅏ RowCallbackHandler
단순한 목록 이상이 되려면 결과가 필요할 때 더 유용합니다. 이 접근법을 사용하는 리턴 객체를 직접 관리해야합니다. 맵 구조가 내 리턴 유형으로 필요할 때 일반적으로 이것을 사용합니다 (예 : 트리 테이블의 그룹화 된 데이터의 경우 또는 기본 키를 기반으로 사용자 지정 캐시를 작성하는 경우).
ㅏ ResultSetExtractor
결과의 반복을 제어 할 때 사용됩니다. 당신은 단일 방법을 의미합니다 extractData
그것은 전화의 반환 가치가 될 것입니다. query
. 다른 콜백 인터페이스 중 하나를 사용하여 빌드하기에 더 복잡한 사용자 정의 데이터 구조를 구축 해야하는 경우에만 이것을 사용합니다.
그만큼 queryForList()
이러한 콜백 메소드를 구현할 필요가 없다는 방법은 방법이 가치가 있습니다. queryforlist를 사용하는 두 가지 방법이 있습니다. 첫 번째는 데이터베이스에서 단일 열만 쿼리하는 경우 (예 : 문자열 목록) 클래스를 인수하여 해당 클래스의 개체 목록을 자동으로 제공하는 메소드 버전을 사용할 수 있습니다. .
다른 구현을 호출 할 때 queryForList()
각 항목이 각 열에 대한지도 인 목록을 다시 얻을 수 있습니다. 이것은 콜백 방법을 작성하는 비용이 저장되었다는 점에서 훌륭하지만이 데이터 구조를 다루는 것은 매우 다루기 쉬운 것입니다. 지도의 값이 유형이기 때문에 많은 캐스팅을 할 수 있습니다. Object
.
나는 실제로 본 적이 없다 queryForRowSet
야생에서 사용 된 방법. 이것은 쿼리의 전체 결과를 CachedRowSet
스프링 sqlrowset에 의해 wapped 물체. 이 개체를 사용하는 데 큰 단점이 있습니다. SqlRowSet
애플리케이션의 다른 계층 주변에서 해당 계층을 데이터 액세스 구현에 연결합니다.
내가 언급 한 바와 같이이 전화들 사이에 큰 성능 차이가 없어야합니다. BeanPropertyRowMapper
. 대규모 결과 세트의 복잡한 조작으로 작업하는 경우 최적화 된 내용을 작성하여 성능을 얻을 수 있습니다. ResultSetExtractor
특정 사례.
더 배우고 싶다면 스프링 JDBC 문서 그리고 내가 언급 한 수업에 대한 Javadoc. Spring Framework의 일부 책을 볼 수도 있습니다. 조금 날짜가 있지만 스프링 프레임 워크를 통한 Java 개발 JDBC 프레임 워크 작업에있어 매우 좋은 섹션이 있습니다. 무엇보다도, 나는 각 방법으로 코드를 작성하고 자신에게 가장 적합한 것을 보게 될 것입니다.
다른 팁
당신은 멋진 제네릭 땅에 있기 때문에, 당신이 정말로하고 싶은 것은 사용하는 것입니다. SimpleJdbcTemplate
그리고 그것의 사용 query()
방법 Lists
물체와 queryForObject()
개별 물체의 경우. 이것에 대한 추론은 단순히 JdbcTemplate
.
위의 탁월한 답변에 한 가지 추가 사항이 추가됩니다. QueryForInt, QueryForLong, QueryForforlOg, QueryForObject 등과 같은 추가 방법은 간단한 쿼리를 실행하고 단일 행을 기대하는 경우 양호한 옵션처럼 보일 수 있습니다.
그러나 0 또는 1 행을 다시 얻을 수 있다면 QueryForList 메소드가 일반적으로 더 쉽습니다. 그렇지 않으면 잘못된 전력을 취해야합니다. 나는 어려운 방법을 배웠다.