MyBatis级联查询(多对一或一对多)

MyBatis级联查询

一、级联查询:多对一
1、实体类(多方表关联一方表)
// 员工表和部门表做逻辑外键关联
private Dept dept;

public Dept getDept() {
    return dept;
}

public void setDept(Dept dept) {
    this.dept = dept;
}
2、mapper接口
 /**
  * 级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称
  * @param number
  * @return
  */
EmpEntity selectEmpById(Integer number);
3、映射文件
<resultMap id="EmpSelDept" type="EmpEntity">
    <id column="number" property="number"/>
    <result column="name" property="name"/>
    <result column="job" property="job"/>
    <result column="mgr" property="mgr"/>
    <result column="hiredate" property="hiredate"/>
    <result column="sal" property="sal"/>
    <result column="comm" property="comm"/>
    <result column="deptno" property="deptno"/>
    <association property="dept" javaType="Dept" >
        <id column="deptno" property="deptno"/>
        <result column="dname" property="dname"/>
        <result column="loc" property="loc"/>
    </association>
</resultMap>

<!--级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称-->
<!--结果集中包含两个表的数据,结果集使用resultMap-->
<select id="selectEmpById" parameterType="integer" resultMap="EmpSelDept">
    SELECT * FROM emp e INNER JOIN dept d ON e.deptno = d.deptno WHERE e.number = #{number}
</select>
4、测试类
// 级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称
@Test
public void findEmpById(){
    EmpEntity emp = sqlSession.getMapper(EmpMapper.class).selectEmpById(1007);
    // javaBean导航
    System.out.println("员工部门:" + emp.getDept().getDname());
}
二、级联查询:一对多
1、实体类(一方表关联多方表)
 // 部门表关联员工表
private List<EmpEntity> emps;

public List<EmpEntity> getEmps() {
    return emps;
}

public void setEmps(List<EmpEntity> emps) {
    this.emps = emps;
}
2、mapper接口层
/**
 * 级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息
 * @param deptno
 * @return
 */
Dept selectEmpByDept(Integer deptno)
3、映射文件
<resultMap id="DeptSelEmp" type="Dept">
    <id column="deptno" property="deptno" />
    <result column="dname" property="dname"/>
    <result column="loc" property="loc"/>
    <collection property="emps" ofType="EmpEntity" >
        <id property="number" column="number"/>
        <result column="name" property="name"/>
        <result column="job" property="job"/>
        <result column="mgr" property="mgr"/>
        <result column="hiredate" property="hiredate"/>
        <result column="sal" property="sal"/>
        <result column="comm" property="comm"/>
        <result column="deptno" property="deptno"/>
    </collection>
</resultMap>

<!--级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息-->
<select id="selectEmpByDept" parameterType="int" resultMap="DeptSelEmp">
    SELECT * FROM dept d LEFT JOIN emp e ON e.deptno = d.deptno WHERE d.deptno = #{deptno}
</select>
4、测试类
// 级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息
@Test
public void findEmpByDept(){
    sqlSession.getMapper(EmpMapper.class).selectEmpByDept(70);
}
三、总结

一对多:以一的一方为主表; 多对一:以多的一方为主表

Association 封装一的一方的数据,固定类型搭配 :javaType

collection封装多的一方的数据,固定类型搭配:ofType

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值