mybatis使用内部类处理一对多类型数据
当一对多关系时,需要把多的那个数据传入到一个
例如: 需要获取用户id和模板id,一个租户id 可以创建多个模板,所以租户和模板是一对多的关系,为了减少创建实体类,使用内部类存储模板id和模板名称,然后存储到list集合中。
实体类
@Data
public class TenantAndTemplateId {
private String tenantId;
private String tenantName;
private List<TemplateId> templateIds;
//注意需要用static修饰
@Data
static class TemplateId {
private String templateId;
private String templateName;
}
}
sql语句 租户表为主表,左连接模板表,此时会有查询到同一个租户有多个模板,我们将多的模板信息,封装到 List templateIds 这个集合中;
select template_id,
template_name,
tenant.tenant_id,
tenant_name
from tenant
left join template on tenant.tenant_id = template.tenant_id
使用mybatis 的xml 整理映射关系是,我们使用 collection 标签映射内部类 ,property
d对应参数 templateIds,javaType
对应 templateIds参数的类型为list, 此处需要注意 ofType
对应的是TenantAndTemplateId 实体类的路径,后面使用$
连接内部类名称即可实现内部类关系的映射
<resultMap id="tenantAndTemplateId" type="com.entity.TenantAndTemplateId">
<result property="tenantId" column="tenant_id"/>
<result property="tenantName" column="tenant_name"/>
<collection property="templateIds" javaType="java.util.List" ofType="com.entity.TenantAndTemplateId$TemplateId">
<result property="templateId" column="waf_template_id"/>
<result property="templateName" column="waf_template_name"/>
</collection>
</resultMap>
测试接口返回结果
注意点
01:resultType后面的内部类用$符号连接;
02:内部类必须有无参构造函数;
03:内部类必须为静态类有static修饰;