在本开源项目中数据库操作采用了Mybatis,不美的是查询数据一律返回VO结构,即使只需要其中的一两个字段也如此,更别提多表联合查询时空字段占了90%,需要改进。
本文描述Mybatis如何在单表查询和多表联合查询中仅返回部分字段。
主要思路,把查询返回值从VO修改为java.util.HashMap。
作者对Mybatis一知半解,并不知其所以然,理论知识请看这里 Mybatis3简介。
1. 单表查询
以fbPlanManage对象为例,
新增一个部分字段返回的查询方法 queryList1:
1) ApiFBPlanManageMapper.xml
新建fbPlanManageListMap,type 为 “java.util.HashMap” :
<resultMap type="java.util.HashMap" id="fbPlanManageListMap">
<result property="id" column="id"/>
<result property="dayNumber" column="day_number"/>
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
<result property="pushTime" column="push_time"/>
</resultMap>
对应Sql:
<select id="queryList1" resultMap="fbPlanManageListMap">
select
p.id,
p.day_number,
p.start_date,
p.end_date,
p.push_time, from nideshop_fitbee_plan_manage p
<where>
<if test="user_id != null">
p.usr_id = #{user_id}
</if>
</where>
2) ApiFBPlanManageMapper.java
新增查询方法queryList1:
List<Map<String, Object>> queryList1(Map<String, Object> map);
3)ApiFBPlanManageService.java
修改查询接口,调用查询接口使用新方法queryList1,返回结果从FBPlanManageVo修改为Map<String, Object>:
/*public List<FBPlanManageVo> queryList(Map<String, Object> map) {
return fbPlanManageDao.queryList(map);
}*/
public List<Map<String, Object>> queryList(Map<String, Object> map) {
return fbPlanManageDao.queryList1(map);
}
4)ApiFBPlanManageController.java
修改queryList接口调用处:
/**
* 获取用户的运动计划
*/
/*@ApiOperation(value = "获取用户的运动计划接口", response = Map.class)
@PostMapping("list")
public Object list(@LoginUser UserVo loginUser) {
Map<String, Object> param = new HashMap<String, Object>();
param.put("user_id", loginUser.getUserId());
List<FBPlanManageVo> entities = fbPlanManageService.queryList(param);
return toResponsSuccess(entities);
}*/
/**
* 获取用户的运动计划
*/
@ApiOperation(value = "获取用户的运动计划接口", response = Map.class)
@PostMapping("list")
public Object list(@LoginUser UserVo loginUser) {
Map<String, Object> param = new HashMap<String, Object>();
param.put("user_id", loginUser.getUserId());
List<Map<String, Object>> entities = fbPlanManageService.queryList(param);
return toResponsSuccess(entities);
}
至此单表查询返回部分字段的修改完成。
2. 联合查询
在单表查询的基础上修改,联合查询 nideshop_fitbee_plan_manage 和 nideshop_goods两张表,在返回结果中增加 planName字段。
1)FBPlanManageVo
新增需要返回的新字段 planName
/**运动计划名称**/
private String planName;
/**
* 设置:计划名称
*/
public void setPlanName(String planName) {
this.planName = planName;
}
/**
* 获取:计划名称
*/
public String getPlanName() {
return planName;
}
2)ApiFBPlanManageMapper.xml
修改resultMap,新增待查询的字段:
<resultMap type="java.util.HashMap" id="fbPlanManageListMap">
<result property="id" column="id"/>
<result property="dayNumber" column="day_number"/>
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
<result property="pushTime" column="push_time"/>
<!--联合查询运动计划名称-->
<association property="planName" javaType="String" >
<result property="name" column="name" />
</association>
</resultMap>
修改sql:
<select id="queryList1" resultMap="fbPlanManageListMap">
select
p.id,
p.day_number,
p.start_date,
p.end_date,
p.push_time,
g.name
from nideshop_fitbee_plan_manage p
INNER JOIN nideshop_goods g
ON p.plan_id = g.id
<where>
<if test="user_id != null">
p.usr_id = #{user_id}
</if>
</where>
修改完毕,查询返回结果中将新增planName字段。
参考文章
That’s all. Thank you!