Java 프로그래밍 -Spring 및 JDBCTemplate- 쿼리, 쿼리 포리스트 또는 QueryForrowSet을 사용합니까?

StackOverflow https://stackoverflow.com/questions/1660756

문제

내 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 메소드가 일반적으로 더 쉽습니다. 그렇지 않으면 잘못된 전력을 취해야합니다. 나는 어려운 방법을 배웠다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top