美文网首页
六、使用resultMap完成查询结果的展现

六、使用resultMap完成查询结果的展现

作者: lifeline张 | 来源:发表于2018-08-25 11:37 被阅读0次

一、本课目标

  • 掌握使用resultmap实现自定义结果映射
  • 了解resultMap的自动映射级别

二、查询

  • 问题引入:按条件查询得到用户表列表的时候,需要显示指定字段,并显示用户角色(中文表述)
  • 用户表中的userRole字段记录的是角色id,不是其对应的名称,如何解决?

解决方案:
1、修改实体类User的属性,增加userRoleName属性;修改查询sql语句,连表查询
2、resultMap-自定义映射结果

2.1第一种解决方案

修改实体类:

package cn.smbms.pojo;

import java.util.Date;

public class User {
    private Integer id; //id 
    private String userCode; //用户编码
    private String userName; //用户名称
    private String userPassword; //用户密码
    private Integer gender;  //性别
    private Date birthday;  //出生日期
    private String phone;   //电话
    private String address; //地址
    private Integer userRole;    //用户角色
    private Integer createdBy;   //创建者
    private Date creationDate; //创建时间
    private Integer modifyBy;     //更新者
    private Date modifyDate;   //更新时间
    
    private Integer age;//年龄
    
    private String userRoleName;    //用户角色名称
    
    
    public String getUserRoleName() {
        return userRoleName;
    }
    public void setUserRoleName(String userRoleName) {
        this.userRoleName = userRoleName;
    }
    public Integer getAge() {
        /*long time = System.currentTimeMillis()-birthday.getTime();
        Integer age = Long.valueOf(time/365/24/60/60/1000).IntegerValue();*/
        Date date = new Date();
        Integer age = date.getYear()-birthday.getYear();
        return age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUserCode() {
        return userCode;
    }
    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    public Integer getGender() {
        return gender;
    }
    public void setGender(Integer gender) {
        this.gender = gender;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Integer getUserRole() {
        return userRole;
    }
    public void setUserRole(Integer userRole) {
        this.userRole = userRole;
    }
    public Integer getCreatedBy() {
        return createdBy;
    }
    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }
    public Date getCreationDate() {
        return creationDate;
    }
    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }
    public Integer getModifyBy() {
        return modifyBy;
    }
    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }
    public Date getModifyDate() {
        return modifyDate;
    }
    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }
}

修改xml文件中的查询语句:

  <!-- 查询用户列表 -->
    <select id="getUserList" parameterType="user" resultType="User">
        select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r
        where userName like CONCAT('%',#{userName},'%')
        and userRole=#{userRole}
        and u.userRole=r.id
    </select>

注:因为查出来的用户角色是smbms_role表中的,在这个表中的角色名字叫roleName,但是返回值类型是user,在user中这个属性名字叫做userRoleName,所以需要给查询出来的结果起一个别名,让他跟user实体类中的属性名相同,这样才能对应起来。

测试类如下:

@Test
    public void testGetUserList() {
        List<User> userList = null;
        SqlSession sqlSession = null;
        User user1 = new User();
        user1.setUserName("赵");
        user1.setUserRole(2);
        try {
            sqlSession = MyBatisUtil.createSqlSession();
        // 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
        //  userList = sqlSession.selectList("mmp.UserMapper.getUserList");
            userList = sqlSession.getMapper(UserMapper.class).getUserList(user1);
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (User user:userList) {
            logger.debug("testGetUserList userCode:" + user.getUserCode()
                    + "and userName" + user.getUserName() + user.getUserRoleName());
        }
    }

测试运行正常。

2.2第二种解决方案

实体类还是上面的实体类,里面有userRoleName属性。
配置xml文件:

<resultMap type="user" id="userList">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
        <result property="phone" column="phone"/>
        <result property="birthday" column="birthday"/>
        <result property="userRole" column="userRole"/>
        <result property="userRoleName" column="roleName"/>
    </resultMap>
    
    <!-- 查询用户列表 -->
    <select id="getUserList" parameterType="user" resultMap="userList">
        select u.*, r.roleName from smbms_user u, smbms_role r
        where userName like CONCAT('%',#{userName},'%')
        and userRole=#{userRole}
        and u.userRole=r.id
    </select>

测试代码如上。
最终测试结果正常。

小结:resultMap就是描述如何将结果集映射到java对象,尤其是在数据库中的字段名跟实体类中的属性名不一致的情况下。

image.png

2.3resultMap与resultType

image.png

基础数据类型指的是我们常说的八种基本数据类型,也包括String等等。复杂数据类型比如这个示例里面的user对象。

2.4resultMap补充

问题:使用resultMap如何实现自由灵活的控制映射结果,从而达到只对关心的属性进行赋值操作?
当xml文件如下的时候:

 <resultMap type="user" id="userList">
        <result property="userRoleName" column="roleName"/>
    </resultMap>
    
    <!-- 查询用户列表 -->
    <select id="getUserList" parameterType="user" resultMap="userList">
        select u.*, r.roleName from smbms_user u, smbms_role r
        where userName like CONCAT('%',#{userName},'%')
        and userRole=#{userRole}
        and u.userRole=r.id
    </select>

测试结果也是正常的,并没有说是实现了自由灵活的匹配结果啊?为什么?
这是因为resultMap的自动映射级别会默认匹配所有属性。


image.png

在mybatis-config.xml文件中增加setting设置之后如下:

    <settings>
        <setting name="logImpl" value="LOG4J"></setting>
        <setting name="autoMappingBehavior" value="NONE"></setting>
    </settings>

再运行的时候的结果如下:


image.png

只有手动设置映射的属性才会有值,其他的都是空。

2.5小结

image.png

相关文章

网友评论

      本文标题:六、使用resultMap完成查询结果的展现

      本文链接:https://www.haomeiwen.com/subject/igowiftx.html