resultMap继承、嵌套、关联其他mapper的小demo

一、说明:

前台分页展示activity,展示的信息中除了activity的信息,还包括applicant(活动申请人)的部分信息,比如name、mobile等。由于activity表中保存的是applicant表中的id,之前的做法是:即写一个ActivityDTO类,继承Activity类,并对ActivityDTO类增加name、mobile等实例变量,这样做的话,如果之后需要展示更多applicant表中的信息,那么ActivityDTO类需要持续的增加实例变量,维护起来有一些繁琐。

因为Applicant类的存在,所以设想如果使ActivityDTO类继承activity类,并在ActivityDTO类中增加一个Applicant类变量,那么就可以减少一些不必要的更改。

二、操作

使用的ssm框架

解决方案集中在mybatis上,让ActivityDTO能够在用较少代码的前提下实现以上设想。

1、首先准备po和DTO类、mapper:

Activity类(对应activity表),如下图

ActivityDTO类,继承Activity,并将Applicant设置为自己的实例变量,如下图

其实也可以将Activity和Applicant都设置为ActivityDTO的实例变量,这种情况下,我目前只掌握了在service中进行获取并设置对象的方法,暂时没有在mybatis中处理这种情况的方案,所以舍弃了这种做法。

Applicant类(对应applicant表),如下图

mapper:

ActivityMapper和ApplicantMapper是两个独立的mapper,分别处理activity表和applicant表。

ActivityMapper:

如下图,可以看到ActivityMapper中已经有了Activity类的resultMap

resultMap继承、嵌套、关联其他mapper的小demo_第1张图片

ApplicantMapper:

如下图,可以看到ApplicantMapper中已经有了Applicant类的resultMap

2、做法

因为主要展示activity的信息,所以在ActivityMapper中进行操作。

ActivityMapper中增加一个ActivityDTO类的resultMap,如下图

ActivityMapper中增加一个ActivityDTO类的select语句,如下图

注意:resultMap对应的是ActivityDTO类的resultMap。

依次说明写法:

a、处理activity表中的信息
extends="BaseResultMap"

ActivityDTO类继承了Activity类,ActivityMapper中又有Activity类的resultMap,通过这种写法,ActivityDTO类的resultMap不需要再书写Activity类中包含的字段和变量的映射,可以直接将在activity表检索出的信息赋值给Activity类的resultMap。

b、处理applicant表中的信息

标签

用来关联类中的某个实体类的变量,在本文中关联Applicant类,这里的并不是基本类型的包装类,而是自定义的实体类,所以使用,另外,如果使用标签的话,就无法使用select属性。

property="applicant"

这个对应的是ActivityDTO类中的Applicant类型的applicant,名称一定要一致,这个跟标签是一样的。

column="operator_id"

这个是作为参数值传入到引用的select语句中。这个operator_id来自activity表,应该是在ActivityDTO类的select语句检索时获取的。

select="com.xxx.dao.ApplicantMapper.selectByPrimaryKey"

select属性用来检索applicant表中信息。因为出现了跨mapper的情况,所以使用了ActivityMapper的namespace + select的id的形式来引用其他表的检索语句。ActivityMapper表中的语句不再赘述。

至此,使用junit测试一下该mapper,没有问题,数据正确。

3、另记

数据正确的情况下,不管是检索单条还是多条activity表中的信息,applicant表中的信息都可以对应上,这种情况仅限于一对一或多对一的情况,即一条或多条activity对应一条applicant,不能出现一条activity对应多条applicant的情况,如果需要这种情况,ActivityDTO类需要重新修改下,改成List,其实如果一开始就在ActivityDTO类中写成List,那么这几种情况都可以适用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mybatis)