mybatis学习(resultMap的使用)(三)

有时候有很多的情况下实体类与数据库中要查出来的数据不一致,那么这时候就可以使用mapper文件中的resultMap来处理。

resultMap有很大的妙用,这里就简单介绍几种,

(1)实体类与要查询的表中的字段不一致

配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    
<mapper namespace="TTest">
    <!-- 这个操作的处理是当没有dept的实体类时,用emp的实体来来承载dept表中的数据, -->
    <select id = "selectAll"  resultMap = "info">
            select deptno, dname from dept
    </select>
    
    <resultMap type="Emp" id="info"> <!-- id必须要和上面的resultMap相同    此处的Emp为别名,如果在配置文件中没有配置别名,就要使用Emp实体类的全路径名 
                          具体配置见我第一篇Mybatis的博客
--> <!-- column属性是数据库中要查表的字段, property:是你这个实体类中相对应的属性 --> <!-- 一下为主键列的对应,主键列的注值要使用id --> <id column="deptno" property="empno"></id> <!-- 以下为普通字段的对应 --> <result column="dname" property="ename"/> </resultMap> </mapper>

Emp的 实体类如下:

package com.yc.mybatis;

public class Emp {
    private int empno;
    private String ename;
    private int deptno;

    private Dept dept;
    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", deptno=" + deptno + ", dept=" + dept + "]";
    }

    public int getEmpno() {
        return empno;
    }
    public void setEmpno(int empno) {
        this.empno = empno;
    }
    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public int getDeptno() {
        return deptno;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + deptno;
        result = prime * result + empno;
        result = prime * result + ((ename == null) ? 0 : ename.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Emp other = (Emp) obj;
        if (deptno != other.deptno)
            return false;
        if (empno != other.empno)
            return false;
        if (ename == null) {
            if (other.ename != null)
                return false;
        } else if (!ename.equals(other.ename))
            return false;
        return true;
    }

    public Emp(int empno, String ename, int deptno, Dept dept) {
        super();
        this.empno = empno;
        this.ename = ename;
        this.deptno = deptno;
        this.dept = dept;
    }

    public Emp() {
        super();
    }




}

结果如下:

2.通过一对一的关系来给实体类中dept属性来注值。使得dept这个属性不在为空,当然,要使注值不为空,必须要创建Dept的实体类

Dept的实体类如下:

package com.yc.mybatis;

public class Dept {

    private int deptno;
    private String dname;
    private String loc;
    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getLoc() {
        return loc;
    }
    public void setLoc(String loc) {
        this.loc = loc;
    }
    @Override
    public String toString() {
        return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + deptno;
        result = prime * result + ((dname == null) ? 0 : dname.hashCode());
        result = prime * result + ((loc == null) ? 0 : loc.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Dept other = (Dept) obj;
        if (deptno != other.deptno)
            return false;
        if (dname == null) {
            if (other.dname != null)
                return false;
        } else if (!dname.equals(other.dname))
            return false;
        if (loc == null) {
            if (other.loc != null)
                return false;
        } else if (!loc.equals(other.loc))
            return false;
        return true;
    }
    public Dept(int deptno, String dname, String loc) {
        super();
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
    }
    public Dept() {
        super();
    }
    
    
    
    
}
Dept.java

 接下来使用mapper.xml文件来配置

如下:

    <select id = "select02" resultMap="info02">
            select empno, ename, e.deptno, loc, dname from emp e, dept d where e.deptno = d.deptno
    </select>
            
    <resultMap type="Emp" id="info02" autoMapping="true"><!-- 一些表中的字段名和实体类中的属性名相同可以自匹配 -->
            <id column="empno" property="empno"></id> <!-- 主键必须要注值 -->
            <!-- 一个员工中只能有属于一个部门,从这个角度讲是属于一对一,使用association -->
             <!-- 属性是emp实体类中要注值的属性 -->
             <!-- javaType为dept的数据类型 -->
            <association property="dept" autoMapping="true" javaType="Dept" >
                <id column="deptno" property="deptno"/><!-- 主键列的对应 -->
            </association>
    </resultMap>

运行截图如下:

  

resultMap的用处远远不止这些,不过核心就是使得实体类能够获得一些经过查询后处理的数据,而处理的过程,就是使用resultMap来映射。

原文地址:https://www.cnblogs.com/1998xujinren/p/11207805.html