依照上一期的继续
1.UserMapper.xml
除了直接对应基本数据类类型、表的实体类,还可能用到多表查询。
<select id="selectRolesByUserId" resultType="tk.mybatis.simple.model.SysRole">
select r.id, r.role_name roleName, r.enabled, r.create_by createBy , r.create_time createTime,
u.user_name as "user.userName",
u.user_email as "user.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>
这里可以看到映射的不仅是两个类,那如何解决呢?
(1) 新创一个类继承对应的实体类,增加要对应的属性
package tk.mybatis.simple.model;
public class SysRoleExtend extends SysRole {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
记得将resultType修改!为继承的,这里只加了username(为了举例),额外需要什么再加。
将resultType
设置为扩展属性后的
SysRoleExtend
对象,通过这种方式来接收多余的值。这种方式比较适合在需要少量额外宇段时使用,但是如果需要其他表中大量列的值时,
这种方式就不适用了,因为我们不能将一个类的属性都照搬到另一
个类中
(2)原有类基础上加对应的User类(推荐)
package tk.mybatis.simple.model;
import lombok.Data;
import java.util.Date;
@Data
public class SysRole {
private Long id;
private String roleName;
private Date createTime;
private Long createBy;
private int enabled;
private SysUser user;
}
直接在
SysRole
中增加
SysUser
对象
字段名为
user
,增加这个字段后,修改
XML
中的 selectRolesByUserId
方法。
2.UserMapper
增加
List<SysRole> selectRolesByUserId(Long userid);
3.UserMapperTest
package tk.mybatis.simple.mapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Test;
import tk.mybatis.simple.model.SysRole;
import java.util.List;
public class UserMapperTest extends BaseMapperTest{
@Test
public void testSelectRolesByUserid() {
SqlSession sqlSession = getSqlSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<SysRole> roleList = userMapper.selectRolesByUserId((long) 1);
Assert.assertNotNull(roleList);
Assert.assertTrue(roleList.size() > 0);
} finally {
sqlSession.close();
}
}
}
5.运行结果
6.遇到的问题
之前有一个插入没有成功,导致没有一一映射,就会抛出异常,查询到的结果是null。