Mybatis如何一对多查询

实体类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.tignioj.pojo;  
  
import lombok.Data;  
  
import java.time.LocalDate;  
import java.time.LocalDateTime;  
import java.util.List;  
  
@Data  
public class Emp {  
    private Integer id; //ID,主键  
    private String username; //用户名  
    private String password; //密码  
    private String name; //姓名  
    private Integer gender; //性别, 1:男, 2:女  
    private String phone; //手机号  
    private Integer job; //职位, 1:班主任,2:讲师,3:学工主管,4:教研主管,5:咨询师  
    private Integer salary; //薪资  
    private String image; //头像  
    private LocalDate entryDate; //入职日期  
    private Integer deptId; //关联的部门ID  
    private LocalDateTime createTime; //创建时间  
    private LocalDateTime updateTime; //修改时间  
  
    private String deptName; // 部门名称  
    private List<EmpExpr> exprList;  
}

工作经历实体类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
/**
 * 工作经历
 */
@Data
public class EmpExpr {
    private Integer id; //ID
    private Integer empId; //员工ID
    private LocalDate begin; //开始时间
    private LocalDate end; //结束时间
    private String company; //公司名称
    private String job; //职位
}

如果是查询一条数据中关联的多个数据,需要手动映射 首先建立映射表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    <resultMap id="empInfo" type="com.tignioj.pojo.Emp" >
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="name" property="name"/>
        <result column="gender" property="gender"/>
        <result column="phone" property="phone"/>
        <result column="job" property="job"/>
        <result column="salary" property="salary"/>
        <result column="image" property="image"/>
        <result column="entry_date" property="entryDate"/>
        <result column="dept_id" property="deptId"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="dept_name" property="deptName"/>

        <collection property="exprList" ofType="com.tignioj.pojo.EmpExpr">
            <result column="p_company" property="company"/>
            <result column="p_id" property="id"/>
            <result column="p_job" property="job"/>
            <result column="p_emp_id" property="empId"/>
            <result column="p_begin" property="begin"/>
            <result column="p_end" property="end"/>
        </collection>
    </resultMap>

接着查询结果中不再使用resultType,而是使用resultMap,并指定刚刚创建的映射表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    <select id="findById" resultMap="empInfo">
        select  e.*,
                d.name dept_name,
                p.company p_company,
                p.id p_id,
                p.job p_job,
                p.emp_id p_emp_id,
                p.begin p_begin,
                p.end p_end
        from emp e left join emp_expr p on e.id = p.emp_id
            left join dept d on d.id = e.dept_id
        where e.id = #{id}
    </select>

Service

1
2
3
4
@Override  
public Emp getInfo(Integer id) {  
    return empMapper.findById(id);  
}

先查询员工id,再查询工作经历,然后把工作经历封装到员工信息。

1
2
3
4
5
6
public Emp getInfo1(Integer id) {
	Emp emp = empMapper.findById(id);
	List<EmpExpr> exprList = empExprMapper.findByEmpId();
	emp.setExprList(exprList);
	return emp;
}

相关内容

更新部分字段-前端JSON怎么传-后端动态SQL怎么写