绝大多数情况下,一条完整的信息至少分别来自两张或以上的表,连表查询非常常见,这种情况下可以使用resultMap属性
1、使用resultMap实现简单结果映射:
user表:
role表:
user表中的userRole是外键,对应role表中的id
需求:通过userName和userRole,查询到符合条件的用户和其RoleName
在这里,用户信息来自user表,roleName来自role表。我们采用封装对象的传参的方式进行查询。首先可以修改pojo的User类,添加一个userRoleName的String属性和相应的setter、getter方法
然后在mapper文件中新建一个select标签:
<select id="getUserList" resultMap="userList" parameterType="User">
select u.*,r.roleName from smbms_user AS u,smbms_role AS r where u.userName
like CONCAT('%',#{
userName},'%') AND u.userRole = #{
userRole}
AND u.userRole = r.id
</select>
这里没有使用resultType标签了,而是换成了resultMap,它的值由我们自定义。
然后,在刚刚编写完成select标签外,创建一个resultMap标签:
<!--id与使用resultMap属性的标签值一致,type是返回类型-->
<resultMap id="userList" type="User">
<!--column是表的列名 property是查出来的字段值要赋给的实体对象的属性名称-->
<!--意味着我们采用自定义的方式进行映射-->
<result property="id" column="id"></result>
<result property="userCode" column="userCode"></result>
<result property="userName" column="userName"></result>
<!--在这里把role表的roleName列的值赋给了User类的userRoleName属性-->
<result property="userRoleName" column="roleName"></result>
</resultMap>
接口方法没有什么新变化:
List<User> getUserList(User user);
测试类:
public void getUserList() {
SqlSession sqlSession = null;
List<User> list;
User u = new User();
u.setUserName("赵");
u.setUserRole(2);
try {
sqlSession = MyBatisUtils.getSQLSession();
list = sqlSession.getMapper(UserMapper.class).getUserList(u);