一、说明:
前台分页展示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
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类,这里的并不是基本类型的包装类,而是自定义的实体类,所以使用
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