MyBatis框架—xml映射

目录

一.为什么需要进行手动映射?

二.关联查询

1.使用resultMap进行映射

2.使用Connection进行映射


一.为什么需要进行手动映射?

当我们设计多表查询或关联查询时,表中含有相同的字段名或要进行关联查询时,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>
相关推荐
有梦想的攻城狮几秒前
Java 11中的Collections类详解
java·windows·python·java11·collections
六千江山21 分钟前
从字符串中提取符合规则的汽车车牌
java
33255_40857_2805930 分钟前
从韩立结婴看Java进阶:一个10年老码农的修仙式成长指南
java
赵星星52030 分钟前
透彻理解Java中的深拷贝与浅拷贝:从误区到最佳实践
java·后端
心月狐的流火号32 分钟前
Java CompletableFuture 核心API
java
黑客影儿42 分钟前
Java技术总监的成长之路(技术干货分享)
java·jvm·后端·程序人生·spring·tomcat·maven
京东云开发者1 小时前
EXCEL导入—设计与思考
java·架构
Warren981 小时前
软件测试-Selenium学习笔记
java·javascript·笔记·学习·selenium·测试工具·安全
没有bug.的程序员1 小时前
JVM 运行时数据区详解:内存模型与对象生命周期全景解析
java·jvm·运行时数据区·内存模型·对象生命周期
一语长情2 小时前
Netty流量整形:保障微服务通信稳定性的关键策略
java·后端·架构