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>
相关推荐
皮皮林5511 天前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河1 天前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程1 天前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅1 天前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者1 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺1 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart1 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP1 天前
MyBatis-mybatis入门与增删改查
java
孟陬1 天前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端