Mybatis之高级映射【一对多映射】

一对多映射(两种方式)
三张表关联查询。当然resultType也能实现,需要将所查询的信息定义到一个pojo(详情见一对一映射中的resultType),这里讲的是resultMap。
需求:查询人员、部门信息并关联查询其父级部门信息。
随意定义数据库的三张表:

人员表:
这里写图片描述
部门表:
这里写图片描述
父级部门表:
这里写图片描述

方式一:association (一对一映射)+collection(一对多映射)
a.建立人员表的pojo:

package com.example.data;

import java.util.List;

public class User {
    private String id;
    private String deptId;
    private String name;
    private String sex;
    private String age;
    private String remark;

    /**
     * User表中有一个dept_id字段,要在User类中定义一个dept属性,
     * 用于维护dept和user之间的一对一关系
     */
    private Dept dept;

    //使用一个List<Pdept>集合属性表示父级部门中的子部门
    private List<Pdept> pdepts;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDeptId() {
        return deptId;
    }

    public void setDeptId(String deptId) {
        this.deptId = deptId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public List<Pdept> getPdepts() {
        return pdepts;
    }

    public void setPdepts(List<Pdept> pdepts) {
        this.pdepts = pdepts;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", deptId='" + deptId + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age='" + age + '\'' +
                ", remark='" + remark + '\'' +
                ", dept=" + dept +
                ", pdepts=" + pdepts +
                '}';
    }
}

b.建立部门表的pojo:

package com.example.data;

public class Dept {
    private String id;
    private String deptName;
    private String parentId;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "id='" + id + '\'' +
                ", deptName='" + deptName + '\'' +
                ", parentId='" + parentId + '\'' +
                '}';
    }
}

b.建立父级部门表的pojo:

package com.example.data;

public class Pdept {
    private String id;
    private String pdeptName;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPdeptName() {
        return pdeptName;
    }

    public void setPdeptName(String pdeptName) {
        this.pdeptName = pdeptName;
    }

    @Override
    public String toString() {
        return "Pdept{" +
                "id='" + id + '\'' +
                ", pdeptName='" + pdeptName + '\'' +
                '}';
    }
}

b.编写Mapper.xml:

<select id="selectOneToMany"  resultMap="selectRstMapTwo">
        <![CDATA[
            select * from bank_user,bank_dept,bank_pdept where bank_user.dept_id=bank_dept.id 
            and bank_dept.parent_id=bank_pdept.id
        ]]>
    </select>

    <!--定义resultmap
        column:数据库中对应的列名(名字必须完全一样)
        property:实体类pojo中的属性名(名字必须完全一样)-->
    <resultMap type="com.example.data.User" id="selectRstMapTwo">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <!--association:一对一关联映射-->
        <association property="dept" javaType="com.example.data.Dept">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
        </association>

        <!-- collection:一对多关联映射 
             property表示集合类型属性名称,也就是User实体类中定义的部门List名字
             ofType表示集合中的对象的类型-->
        <collection property="pdepts" ofType="com.example.data.Pdept">
            <id column="id" property="id"/>
            <result column="pdept_name" property="pdeptName"/>
        </collection>
    </resultMap>

c.编写Mapper.java:

    //一对多查询:查询人员、部门信息并关联查询其父级部门信息
    public List<User> selectOneToMany()throws Exception;

输出结果日志:

这里写图片描述

方式二:extends
与方式一不同点在于Mapper.xml:
上一篇一对一映射博客地址,下面实例会引用一个resultMap。

<select id="selectOneToMany"  resultMap="selectRstMapTwo">
        <![CDATA[
            select * from bank_user,bank_dept,bank_pdept where bank_user.dept_id=bank_dept.id 
            and bank_dept.parent_id=bank_pdept.id
        ]]>
    </select>

    <!--定义resultmap
        column:数据库中对应的列名(名字必须完全一样)
        property:实体类pojo中的属性名(名字必须完全一样)
        extends:继承一个resultMap,把其中的所有配置都继承(这里继承的是上一篇一对一映射的resultMap)
        使用extends,只编写collection元素即可。
    -->
    <resultMap type="com.example.data.User" id="selectRstMapTwo" extends="selectRstMap">
        <!-- collection:一对多关联映射 
             property表示集合类型属性名称,也就是User实体类中定义的部门List名字
             ofType表示集合中的对象的类型-->
        <collection property="pdepts" ofType="com.example.data.Pdept">
            <id column="id" property="id"/>
            <result column="pdept_name" property="pdeptName"/>
        </collection>
    </resultMap>

高级映射:【一对一映射】 【多对多映射】

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟驿站ㅤ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值