mybatis一对多的查询的两种方式

需求简介:

有3张表,部门 ---->组织 ---->员工,一个部门包含多个组织,每个组织下有多名员工,现在需要根据部门ID查询某个部门下的所有组织,以及每个组织下的所有员工信息,返回的是一个树形结构数据。

一、表结构

1.部门表
CREATE TABLE `department` (
  `id` int NOT NULL,
  `dept_name` varchar(255) DEFAULT NULL,
  `dept_location` varchar(255) DEFAULT NULL,
  `tenant_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

2.组织表
CREATE TABLE `groups` (
  `id` int NOT NULL,
  `group_name` varchar(255) DEFAULT NULL,
  `dept_id` int NOT NULL,
  `tenant_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

3.员工表
CREATE TABLE `employee` (
  `id` int NOT NULL,
  `employee_name` varchar(255) DEFAULT NULL,
  `group_id` int NOT NULL,
  `tenant_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

二、实体类

1.部门

@Data
@TableName("department")
public class Department {
	private Integer id;
	private String deptName;
	private String deptLocation;
	private List<Groups> groupList;
}
2.组织

@Data
@TableName("groups")
public class Groups {
	private Integer id;
	private String groupName;
	private List<Employee> employeeList;
}

3.员工
@Data
@TableName("employee")
public class Employee {
	private Integer id;
	private String employeeName;
}

三、查询方法

//根据部门ID查询
@Mapper
public interface DepartmentMapper extends BaseMapper<Department> {
    List<Department> testMybatis(@Param("id") Integer id);
}

四、mapper.xml,sql有两种写法,查询结果是一样的
第一种:

<resultMap type="com.entity.Department" id="departmentMap">
        <id property="id" column="id"/>
        <result property="deptName" column="dept_name"/>
        <result property="deptLocation" column="dept_location"/>
        <collection property="groupList" ofType="com.entity.Groups"
                    javaType="ArrayList" column="id" select="selectGroup"/>
    </resultMap>

    <resultMap type="com.entity.Groups" id="groupMap">
        <id property="id" column="id"/>
        <result property="groupName" column="group_name"/>
        <collection property="employeeList" ofType="com.entity.Employee"
                    javaType="ArrayList" column="id" select="selectEmployee"/>
    </resultMap>

    <resultMap type="com.entity.Employee" id="employeeMap">
        <id property="id" column="id"/>
        <result property="employeeName" column="employee_name"/>
    </resultMap>

    <select id="testMybatis" resultMap="departmentMap">
        SELECT
            a.id,
            a.dept_name,
            a.dept_location
        FROM
            department a
        WHERE a.id = #{id}
    </select>

    <select id="selectGroup" resultMap="groupMap">
        SELECT
            b.id,
            b.group_name
        FROM
            `groups` b
        WHERE
            b.dept_id = #{id}
    </select>

    <select id="selectEmployee" resultMap="employeeMap">
        SELECT
            c.id,
            c.employee_name
        FROM
            employee c
        WHERE
            c.group_id = #{id}
    </select>

第二种:

<resultMap id="departmentMap" type="com.entity.Department">
        <id property="id" column="id"/>
        <result column="dept_name" jdbcType="VARCHAR" property="deptName"/>
        <result column="dept_location" jdbcType="VARCHAR" property="deptLocation"/>
        <collection property="groupList" ofType="com.entity.Groups">
            <id property="id" column="gid"/>
            <result column="group_name" property="groupName"/>
            <collection property="employeeList" ofType="com.entity.Employee">
                <id property="id" column="eid"/>
                <result column="employee_name" property="employeeName"/>
            </collection>
        </collection>
    </resultMap>

    <select id="testMybatis" resultMap="departmentMap">
        SELECT
            a.id,
            a.dept_name,
            a.dept_location,
            b.id as gid,
            b.group_name,
            c.id as eid,
            c.employee_name
        FROM department a
        LEFT JOIN `groups` b ON a.id = b.dept_id
        LEFT JOIN `employee` c ON b.id = c.group_id
        WHERE a.id = #{id}
    </select>

五、查询结果
在这里插入图片描述

备注:
关于查询sql的写法,第一种定义了3个resultMap,对应3个单表查询sql,比较容易理解,条理关系清晰,但是代码比较多。第二种代码量少一些,采用多表关联查询,只有一个resultMap,可以根据实际情况来选择使用哪种方式。至于两者性能,还没研究过,有空再补。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis中,进行一对多查询可以使用两种方式:分别是使用嵌套查询和使用关联查询。具体的查询语句可以根据实际情况来选择使用哪种方式。 1. 嵌套查询: 在进行一对多查询时,可以使用嵌套查询来获取关联表的数据。这种方式需要在Mapper文件中定义多个SQL语句,并使用resultMap来映射结果。 例如,假设我们有部门(Department)表和员工(Employee)表,一个部门有多个员工,我们想要查询部门及其对应的员工列表,可以使用以下SQL语句: ``` <!-- 定义查询部门及其员工的SQL语句 --> <select id="getDepartmentWithEmployees" resultMap="departmentResultMap"> SELECT d.id, d.name, e.id AS employee_id, e.name AS employee_name FROM department d LEFT JOIN employee e ON d.id = e.department_id </select> <!-- 定义结果映射 --> <resultMap id="departmentResultMap" type="Department"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="employees" ofType="Employee"> <id property="id" column="employee_id"/> <result property="name" column="employee_name"/> </collection> </resultMap> ``` 在这个例子中,我们定义了一个名为`getDepartmentWithEmployees`的查询语句,通过左连接来关联部门表和员工表,并使用resultMap来映射查询结果。部门与员工之间的关系通过嵌套的collection来表示。 2. 关联查询: 使用关联查询可以在一条SQL语句中获取关联表的数据,这种方式可以减少数据库查询次数,提高性能。关联查询可以使用MyBatis的动态SQL来实现。 例如,我们可以使用以下SQL语句来实现部门和员工的关联查询: ``` <!-- 定义关联查询 --> <select id="getDepartmentWithEmployees" resultMap="departmentResultMap"> SELECT d.id, d.name, e.id AS employee_id, e.name AS employee_name FROM department d LEFT JOIN employee e ON d.id = e.department_id WHERE d.id = #{id} </select> ``` 在这个例子中,我们使用了LEFT JOIN来关联部门表和员工表,并通过WHERE语句来限定查询结果。通过这种方式,我们可以一次性获取到部门及其对应的员工列表。 请根据实际需要选择使用嵌套查询还是关联查询,并根据自己的数据表结构和需求来编写相应的SQL语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值