目录
一.为什么需要进行手动映射?
当我们设计多表查询或关联查询时,表中含有相同的字段名或要进行关联查询时,MyBatis无法智能识别如何处理映射结果,就需要我们进行手动映射
二.关联查询
用员工表单和部门表单进行演示,对应的表单信息如下
sql
create table employee(
id int primary key auto_increment,
name varchar(20),
gender char(1),
dep_id int,
constraint employee_department foreign key(dep_id) references department(id)
)
create table department(
id int primary key auto_increment,
name varchar(10)
)
1.使用resultMap进行映射
我们需要用员工的id来查询他所在的部门
Employee实体类定义:
用一个Department对象来接收部门信息
java
public class Employee {
private int id;
private String name;
private String gender;
private Department department;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", department=" + department +
'}';
}
}
Employee接口定义:
java
public interface EmployeeDao {
Employee findEmployeeById(int id);
ArrayList<EmployeeDao> findEmployee();
}
Mapper定义:
java
<?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="Demo.dao.EmployeeDao">
<resultMap id="EmployeeMap" type="Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<!-- 在关联表时,会自动创建映射对象 -->
<association property="department" javaType="Department">
<id property="id" column="did"/>
<result property="name" column="dname"/>
</association>
</resultMap>
<select id="findEmployeeById" parameterType="int" resultMap="EmployeeMap">
select e.name,e.gender,d.name dname,d.id did
from employee e inner join department d on e.dep_id=d.id
where e.id=#{id}
</select>
<select id="findEmployee" resultMap="EmployeeMap">
select e.name,e.gender,d.name dname
from employee e inner join department d on e.dep_id=d.id
</select>
</mapper>
映射部分单独拿出来解释:
java
//id就是resultMap的名字,type就是映射对象的数据类型(对应的实体类)
<resultMap id="EmployeeMap" type="Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<!-- 在关联表时,会自动创建映射对象 -->
//property接收映射结果对象的名字,javaType就是在java中对应的数据类型
<association property="department" javaType="Department">
<id property="id" column="did"/>
<result property="name" column="dname"/>
</association>
</resultMap>
2.使用Connection进行映射
我们需要查找某个部门的所有员工
Department对应的实体类:
java
public class Department {
private int id;
private String name;
private ArrayList<Employee> employee;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Employee> getArrayList() {
return employee;
}
public void setArrayList(ArrayList<Employee> arrayList) {
this.employee = arrayList;
}
@Override
public String toString() {
return "Department{" +
"id=" + id +
", name='" + name + '\'' +
", arrayList=" + employee +
'}';
}
}
Department对应的接口:
java
public interface DepartmentDao {
Department findDepartmentById(int id);
}
Mapper:
java
<?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="Demo.dao.DepartmentDao">
<resultMap id="departmentMap" type="Department">
<id column="id" property="id"/>
<result column="name" property="name"/>
<!-- 这里的property必须和对应实现类的集合名相同,javatype指的是java中的数据类型,ofType指的是集合的泛型 -->
<collection property="employee" javaType="arraylist" ofType="Employee">
<id column="did" property="id"/>
<result column="ename" property="name"/>
<result column="egender" property="gender"/>
</collection>
</resultMap>
<!-- 查询结果必须全部写在映射里面 -->
<select id="findDepartmentById" parameterType="int" resultMap="departmentMap">
select e.name ename,e.gender egender,e.id eid,d.name,d.id
from employee e inner join department d on e.dep_id=d.id
where d.id = #{id}
</select>
</mapper>