MyBatis XML 방식 의 기본 용법 인 다 중 표 조회 기능 의 예제 코드
이전에 우리 가 예시 한 두 개의 조 회 는 모두 단일 표 조회 이지 만 실제 업무 장면 은 여러 표 조회 가 필요 할 것 이다.예 를 들 어 현재 수요 가 있다.
어떤 사용자 가 가지 고 있 는 모든 역할 을 조회 합 니 다.이 요 구 는 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 방식 의 기본 용법 인 다 중 표 조회 기능 의 예제 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.