绝大多数情况下,一条完整的信息至少分别来自两张或以上的表,连表查询非常常见,这种情况下可以使用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);
for (User user : list)
logger.debug("UserCode:" + user.getUserCode() +

本文详细介绍了MyBatis框架中resultMap属性的使用方法,包括如何通过resultMap实现简单和高级结果映射,解决多表查询时的字段映射问题。文中通过具体实例,如连表查询用户信息及其角色名,以及处理一对多和一对一关系的数据映射,深入解析了association和collection标签的应用。
最低0.47元/天 解锁文章
3631

被折叠的 条评论
为什么被折叠?



