MyBatis XML 방식 의 기본 용법 인 다 중 표 조회 기능 의 예제 코드

1.다 중 표 조회
이전에 우리 가 예시 한 두 개의 조 회 는 모두 단일 표 조회 이지 만 실제 업무 장면 은 여러 표 조회 가 필요 할 것 이다.예 를 들 어 현재 수요 가 있다.
어떤 사용자 가 가지 고 있 는 모든 역할 을 조회 합 니 다.이 요 구 는 sysuser,sys_user_role,sys_role 세 장의 표,어떻게 실현 합 니까?
우선,SysUserMapper 인터페이스 에서 다음 과 같은 방법 을 정의 합 니 다.

/**
 *     id      
 *
 * @param userId
 * @return
 */
List<SysRole> selectRolesByUserId(Long userId);
그리고 해당 하 는 SysUserMapper.xml 파일 을 열 고 다음 selection 문 구 를 추가 합 니 다.

<select id="selectRolesByUserId" resultType="com.zwwhnly.mybatisaction.model.SysRole">
 SELECT r.id,
  r.role_name roleName,
  r.enabled,
  r.create_by createBy,
  r.create_time createTime
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{userId}
</select>
세심 한 독자 들 은 우리 가 여러 표 의 조 회 를 사 용 했 지만 resultType 은 여전히 하나의 표,즉 캐릭터 표 만 포함 하 는 정 보 를 설정 한 것 을 발견 할 수 있다.
만약 내 가 이 검색 어 를 동시에 SysUser 표 의 user 로 되 돌려 주 기 를 원한 다 면name 필드 는 resultType 을 어떻게 설정 해 야 합 니까?
방법 1:SysRole 실체 클래스 에 userName 필드 를 직접 추가 합 니 다.

private String userName;
public String getUserName() {
 return userName;
}
public void setUserName(String userName) {
 this.userName = userName;
}
이 때 resultType 은 수정 할 필요 가 없습니다.
방법 2:새 확장 클래스,확장 클래스 에 userName 필드 를 추가 합 니 다.

package com.zwwhnly.mybatisaction.model;
public class SysRoleExtend extends SysRole {
 private String userName;
 public String getUserName() {
 return userName;
 }
 public void setUserName(String userName) {
 this.userName = userName;
 }
}
이 때 resultType 을:com.zwwhnly.mybatisaction.model.SysRoleExtend로 수정 해 야 합 니 다.
이런 방식 은 소량의 추가 필드 가 필요 한 장면 에 비교적 적합 하 다.다른 표 의 많은 필드 가 필요 하 다 면 사용 방식 3 또는 방식 4,개인 추천 사용 방식 4.
방법 3:SysRole 실체 클래스 에 SysUser 형식의 필드 를 추가 합 니 다.

private SysUser sysUser;
public SysUser getSysUser() {
 return sysUser;
}
public void setSysUser(SysUser sysUser) {
 this.sysUser = sysUser;
}
이 때 resultType 은 수정 할 필요 가 없습니다.
방법 4(추천 사용):새 확장 클래스,확장 클래스 에 SysUser 형식의 필드 를 추가 합 니 다.
책 에서 추천 한 것 은 방식 3,방식 4 는 제 가 개인 적 으로 더 좋 은 방식 이 라 고 생각 합 니 다.실체 류 는 보통 도구 에 의 해 자동 으로 생 성 되 고 필드 를 추가 한 후에 잊 어 버 려 서 덮어 쓰기 쉽 기 때 문 입 니 다.

package com.zwwhnly.mybatisaction.model;
public class SysRoleExtend extends SysRole {
 private SysUser sysUser;
 public SysUser getSysUser() {
 return sysUser;
 }
 public void setSysUser(SysUser sysUser) {
 this.sysUser = sysUser;
 }
}
이 때 resultType 을:com.zwwhnly.mybatisaction.model.SysRoleExtend로 수정 해 야 합 니 다.
이 때 xml 의 검색 어 는 다음 과 같 습 니 다.

<select id="selectRolesByUserId" resultType="com.zwwhnly.mybatisaction.model.SysRoleExtend">
 SELECT r.id,
  r.role_name roleName,
  r.enabled,
  r.create_by createBy,
  r.create_time createTime,
  u.user_name "sysUser.userName",
  u.user_email "sysUser.userEmail"
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{userId}
</select>
SysUserMapperTest 에 테스트 코드 를 추가 하면 다음 과 같 습 니 다.

@Test
public void testSelectRolesByUserId() {
 SqlSession sqlSession = getSqlSession();
 try {
 SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
 List<SysRole> sysRoleList = sysUserMapper.selectRolesByUserId(1L);
 Assert.assertNotNull(sysRoleList);
 Assert.assertTrue(sysRoleList.size() > 0);
 } finally {
 sqlSession.close();
 }
}
이 테스트 방법 을 실행 하려 면 로 그 를 입력 하 십시오.

DEBUG [main] - ==> Preparing: SELECT r.id, r.role_name roleName, r.enabled, r.create_by createBy, r.create_time createTime, u.user_name "sysUser.userName", u.user_email "sysUser.userEmail" FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime, sysUser.userName, sysUser.userEmail
TRACE [main] - <== Row: 1,    , 1, 1, 2019-06-27 18:21:12.0, admin, [email protected]
TRACE [main] - <== Row: 2,     , 1, 1, 2019-06-27 18:21:12.0, admin, [email protected]
DEBUG [main] - <== Total: 2
2.여러 개의 인터페이스 매개 변수의 용법
2.1 매개 변수 유형 은 기본 유형
지금까지 우리 가 정의 한 방법 은 모두 1 개의 매개 변수 만 있 거나 1 개의 기본 유형의 매개 변수 만 있다.예 를 들 어selectById(Long id);。한 개의 대상 만 매개 변수 로 하거나 여러 개의 매개 변 수 를 하나의 대상 으로 합 쳤 다.
그러나 일부 장면 에서 예 를 들 어 두 개의 매개 변수 만 있 고 이 두 개의 매개 변 수 를 위해 대상 을 다시 만 들 필요 가 없습니다.예 를 들 어 우 리 는 현재 사용자 의 id 와 캐릭터 의 상태 에 따라 사용자 의 모든 역할 을 가 져 와 야 합 니 다.그러면 어떻게 사용 해 야 합 니까?
우선 인터페이스 SysUserMapper 에 다음 과 같은 방법 을 추가 합 니 다.

/**
 *     id    enabled         
 *
 * @param userId
 * @param enabled
 * @return
 */
List<SysRole> selectRolesByUserIdAndRoleEnabled(Long userId,Integer enabled);
그리고 해당 하 는 SysUserMapper.xml 파일 을 열 고 다음 코드 를 추가 합 니 다.

<select id="selectRolesByUserIdAndRoleEnabled" resultType="com.zwwhnly.mybatisaction.model.SysRole">
 SELECT r.id,
  r.role_name roleName,
  r.enabled,
  r.create_by createBy,
  r.create_time createTime
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{userId} AND r.enabled = #{enabled}
</select>
SysUserMapperTest 테스트 클래스 에 다음 과 같은 테스트 방법 을 추가 합 니 다.

@Test
public void testselectRolesByUserIdAndRoleEnabled() {
 SqlSession sqlSession = getSqlSession();
 try {
 SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
 List<SysRole> sysRoleList = sysUserMapper.selectRolesByUserIdAndRoleEnabled(1L, 1);
 Assert.assertNotNull(sysRoleList);
 Assert.assertTrue(sysRoleList.size() > 0);
 } finally {
 sqlSession.rollback();
 sqlSession.close();
 }
}
이 테스트 방법 을 실행 하면 다음 과 같은 오 류 를 발견 할 수 있 습 니 다.

오류 메시지 에서 인자 userId 를 찾 지 못 했 습 니 다.사용 가능 한 매개 변 수 는[0,1,param 1,param 2]입 니 다.즉,코드 를 다음 과 같이 수정 합 니 다.

WHERE u.id = #{0} AND r.enabled = #{1}
또는 다음 으로 변경:

WHERE u.id = #{param1} AND r.enabled = #{param2}
이렇게 사용 하면 테스트 에 통과 할 수 있 지만 이렇게 사용 하면 코드 를 읽 기 에 우호 적 이지 않 기 때문에 이렇게 사용 하 는 것 을 추천 하지 않 습 니 다.
인터페이스 방법의 인자 앞 에@Param 주 해 를 추가 하 는 것 을 추천 합 니 다.다음 과 같 습 니 다.

/**
 *     id    enabled         
 *
 * @param userId
 * @param enabled
 * @return
 */
List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);
방금 추 가 된 테스트 방법 을 실행 합 니 다.테스트 를 통 과 했 습 니 다.출력 로 그 는 다음 과 같 습 니 다.

DEBUG [main] - ==> Preparing: SELECT r.id, r.role_name roleName, r.enabled, r.create_by createBy, r.create_time createTime FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ? AND r.enabled = ?
DEBUG [main] - ==> Parameters: 1(Long), 1(Integer)
TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime
TRACE [main] - <== Row: 1,    , 1, 1, 2019-06-27 18:21:12.0
TRACE [main] - <== Row: 2,     , 1, 1, 2019-06-27 18:21:12.0
DEBUG [main] - <== Total: 2
2.2 매개 변수 유형 은 대상
매개 변수 형식 이 대상 의 사용 방법 임 을 보 여주 기 위해 인터페이스 SysUserMapper 에 다음 과 같은 방법 을 추가 합 니 다.

/**
 *     id    enabled         
 *
 * @param user
 * @param role
 * @return
 */
List<SysRole> selectRolesByUserAndRole(@Param("user") SysUser user, @Param("role") SysRole role);
이 때 대응 하 는 xml 의 문 구 는 다음 과 같 습 니 다.

<select id="selectRolesByUserAndRole" resultType="com.zwwhnly.mybatisaction.model.SysRole">
 SELECT r.id,
 r.role_name roleName,
 r.enabled,
 r.create_by createBy,
 r.create_time createTime
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{user.id} AND r.enabled = #{role.enabled}
</select>
3.소스 코드
원본 주소:https://github.com/zwwhnly/mybatis-action.git,다운로드 환영 합 니 다.
총결산
위 에서 말 한 것 은 소 편 이 소개 한 MyBatis XML 방식 의 기본 용법 인 다 중 표 조회 기능 의 예제 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기