예:
사용자와 주소라는 두 개의 엔터티 클래스가 있습니다
데이터베이스:
으아악mybatis 매핑 구성:
으아악사용자와 주소의 관계는 다음과 같습니다. 한 사용자는 여러 개의 주소를 갖고, 하나의 주소는 한 명의 사용자에게만 속할 수 있으며, 일대다
현재 수요는 페이지에서 사용자를 쿼리하고, 이를 테이블에 표시하고, 모두 표시하는 것입니다. 각 사용자의 주소가 나오네요
그러면 문제가 옵니다
위 쿼리에 따라 반환된 페이징 데이터에는 문제가 없지만 총 페이징 기록 수가 잘못되었습니다.
예를 들어 검색된 데이터(페이지 표시가 아닌 데이터베이스 데이터)는 다음과 같습니다.
u_id | 사용자 이름 | a_id | 세부사항 |
---|---|---|---|
1 | user1 | 1 | 베이징 하이뎬구 |
1 | user1 | 2 | 베이징 차오양구 |
2 | user2 | 3 | 천진시 |
제 요구 사항은 사용자를 페이지에 표시하는 것이므로 사용자는 페이지에 표시되는 데이터 조각입니다. 이론적으로는 다음과 같은 두 조각의 데이터입니다.
사용자 이름 | 주소 | |
---|---|---|
user1 | 1. 베이징 하이뎬구 2. 베이징 조양구 | |
user2 | 1. 텐진시 | |
count(*)를 쿼리할 때 왼쪽 조인과 관련된 모든 테이블을 제거해야 합니까? 이로 인해 반환된 데이터가 부정확해 집니까?
예제를 작성하고 테스트해봤습니다
`
두 개의 엔터티 클래스
으아악public 클래스 사용자 {
공개 수업 주소 {
으아악매핑 파일
으아악<resultMap type="com.atguigu.mybatis.entity.User" id="userMap" autoMapping="true">
<!-- tu.,ta., -->
으아악<!-- ta.id를 'a_id'로 선택, -->
<!-- tu.id를 'u_id'로 선택 -->
<!-- t_user tu에서, -->
<!-- t_address ta 여기서 ta.user_id=tu.id -->
테스트 결과
캡슐화된 List<User>의 크기는 문제가 되지 않습니다.
키워드를 그룹화하고 구체적인 동작을 직접 확인해보세요
으아악
두 개의 항목을 원했지만 SQL이 세 개의 항목을 찾으면 오류가 표시됩니다.
으아악논리를 분할해야 합니다.
먼저 원하는 사용자를 찾아야 합니다
그럼
으아악??사용자ID를 이용해서 List<Address>를 직접 확인하는 방법이에요
이 경우에는 페이징을 할 수 없습니다. 메인 테이블 데이터를 페이징해야 합니다.
원래는 100개의 데이터를 쿼리했는데, 일대다 방식은 많은 양의 데이터를 접어서 중복을 제거하기 때문에 실제 결과는 100개 미만이었습니다.
이 경우 중첩 쿼리를 사용하여 문제를 해결할 수 있으며, 이는 N+1 실행이 필요하고 느리게 로드될 수 있습니다.
또는 여기를 보세요: https://my.oschina.net/flags/...
MyBatis 콘텐츠를 보려면 http://mybatis.tk
를 방문하세요.으아악
변경:
으아악서브 쿼리를 사용해도 문제 없습니다
으아악저자는
을 살펴볼 수 있습니다.Mybatis-PageHelper
count SQL 변환 구현Paging을 구현하려면 작성자가 직접 Mybatis-PageHelper를 사용하는 것이 좋습니다