MyBatis框架—xml映射
目录
一.为什么需要进行手动映射?
二.关联查询
1.使用resultMap进行映射
2.使用Connection进行映射
一.为什么需要进行手动映射?
当我们设计多表查询或关联查询时,表中含有相同的字段名或要进行关联查询时,MyBatis无法智能识别如何处理映射结果,就需要我们进行手动映射
二.关联查询
用员工表单和部门表单进行演示,对应的表单信息如下
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对象来接收部门信息
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;}@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", department=" + department +'}';}
}
Employee接口定义:
public interface EmployeeDao {Employee findEmployeeById(int id);ArrayList<EmployeeDao> findEmployee();
}
Mapper定义:
<?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 didfrom employee e inner join department d on e.dep_id=d.idwhere e.id=#{id}</select><select id="findEmployee" resultMap="EmployeeMap">select e.name,e.gender,d.name dnamefrom employee e inner join department d on e.dep_id=d.id</select></mapper>
映射部分单独拿出来解释:
//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对应的实体类:
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;}@Overridepublic String toString() {return "Department{" +"id=" + id +", name='" + name + '\'' +", arrayList=" + employee +'}';}
}
Department对应的接口:
public interface DepartmentDao {Department findDepartmentById(int id);
}
Mapper:
<?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.idfrom employee e inner join department d on e.dep_id=d.idwhere d.id = #{id}</select>
</mapper>