大家好!欢迎大家观看本博客,我是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标签中声明属性对应的完整列名!!!
感谢您的阅读,免费制作不易,希望得到您的支持,麻烦留下一个小赞吧!