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>
相关推荐
郑州光合科技余经理17 分钟前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼17 分钟前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
梦想平凡1 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
sunshine22 girl2 小时前
Idea中如何搜索
java·ide·intellij-idea
猫吻鱼2 小时前
【AI 01】【Spring AI 基础使用】
java·spring·spring ai
梨涡泥窝2 小时前
基于SSM的校园二手交易平台的设计与实现
java·tomcat
许彰午3 小时前
44-useRowSet镜像实现
java·低代码·架构
bamboolm3 小时前
springboot+Ollama整合
java·ollama
我不会起名字3224 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
Wang's Blog5 小时前
Java框架快速入门: Spring Security+OAuth2之JWT核心概念与实战
java·spring·log4j