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(); } }
接下来使用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来映射。