mybatis高级映射,嵌套resultMap,collection,一对多对多关系的映射

        大家好!欢迎大家观看本博客,我是Java开发工程师-魏哲敏,在日常开发中,其实要求一次查询出三层映射关系的需求并不多,一般设计都是先查出一层,在通过这一层的关系去查询另一层...

        但是难免甲方会有这种无理需求,作为专业开发人员,我们只能去实现它的需求咯

        但是在mybatis官网并没有提供合适的三层映射关系示例,只提供了内嵌多个完整类关系来映射,实际上这种示例并不能映射出三层关系,只能映射出俩层。

今天我将教大家该如何完整的映射出三层类关系

假设我有三个domain类:

公司下面有部门,部门下面有人员

1.Company(公司类):

引用了泛型为Department(部门类)的List集合类型

//公司类
class Company{
    //公司Id
    private int companyId;
    //公司名
    private int companyName;
    //公司下的部门集合
    private List<Department> departments;
}

2.Department(部门类):

引用了泛型Person(人员类)的List集合类型

//部门类
class Department{
    //部门Id
    private int departmentId;
    //部门名
    private int departmentName;
    //部门下的人员集合
    private List<Person> persons;
}

         3.Person(人员类)

//人员类
class Person{
    //人员Id
    private int personId;
    //人员名
    private int personName;
}

 需要在mybatis的xml文件中配置映射信息:

Company公司类:

<!--resultMap标签定义Company在数据库查询中的对应关系,其中id为别名,用于在xml文件中引用,type对应了Java指定的类地址-->

<resultMap id="companyResult" type="io.run.cloud.comman.api.domain.Company">

         <!--id标签用于主键id的映射,column为数据库中主键id的名称或别名,property对应了Java类中需要映射的属性名称-->

        <id column="c_copany_id" property="companyId" />

        <!--result标签用于其它普通属性的映射,column为数据库中对应的名称或别名,property对应了Java类中需要映射的属性名称-->

        <result column="c_company_name" property="companyName" />

        <!--collection标签用于集合属性的映射,property对应了Java类中需要映射的属性名称,departmentResult为xml文件中定义的department类映射关系的别名-->

        <collection property="departments" resultMap="departmentResult"/>

</resultMap>

Department部门类:

<resultMap id="departmentResult" type="io.run.cloud.comman.api.domain.Department">

        <id column="d_department_id" property="departmentId" />

        <result column="d_department_name" property="departmentName" />

        <!--人员集合映射-->

        <collection property="persons" resultMap="personResult"/>

</resultMap>

Person人员类:

<resultMap id="personResult" type="io.run.cloud.comman.api.domain.Department">

        <id column="p_person_id" property="personId" />

        <result column="p_person_name" property="personName" />

</resultMap>

     该配置定义了三个resultMap,其中使用result标签定义基本类型,collection定义集合类型,通过设置collection标签中的resultMap设置此collection需要映射的类型 

     通过以上配置可将完整的Company公司类三层关系映射出来

     为什么不使用collection嵌套collection的方式进行定义呢?

     因为在这个插件中使用collection嵌套的方式会将人员类集合属性归属于公司,其实人员类集合属性是属于部门的,应该是个bug。

   需要注意的是:通过多层映射的关系需要写出完整的列名,不能通过设置collection的columnPrefix属性定义前缀,否则会出现映射为空的情况,必须要在result标签中声明属性对应的完整列名!!!

感谢您的阅读,免费制作不易,希望得到您的支持,麻烦留下一个小赞吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值