说明一个简单的场景,就是获取视频表中数据同时查询用户信息。
能实现的方法有很多
- 字段冗余
- 通过sql联表查询
今天学到一个较为优雅的方式。
VideoInfoQuery
代码,仅仅展示部分
/**
* 视频信息参数
*/
public class VideoInfoQuery extends BaseParam {
/**
* 视频ID
*/
private String videoId;
private String videoIdFuzzy;
/**
* 视频封面
*/
private String videoCover;
private String videoCoverFuzzy;
/**
* 视频名称
*/
private String videoName;
private String videoNameFuzzy;
/**
* 用户ID
*/
private String userId;
private String userIdFuzzy;
/**
* 是否查询用户信息
*/
private Boolean queryUserInfo;
}
这里通过给VideoInfoQuery
添加 queryUserInfo
布尔属性,在需要查询的地方设置为 true
,不需要的地方设置为false
,
再结合Mybatis动态SQL
如下,展示部分代码
<!-- 查询集合-->
<select id="selectList" resultMap="base_result_map">
SELECT
<include refid="base_column_list"/>
<if test="query.queryUserInfo">
,u.nick_name,u.avatar
</if>
FROM video_info v
<if test="query.queryUserInfo">
left join user_info u on u.user_id = v.user_id
</if>
<include refid="query_condition"/>
<if test="query.orderBy!=null">
order by ${query.orderBy}
</if>
<if test="query.simplePage!=null">
limit #{query.simplePage.start},#{query.simplePage.end}
</if>
</select>
- 控制层代码
/**
* 查询推荐视频
*
* @return
*/
@RequestMapping("/loadRecommendVideo")
public ResponseVO loadRecommendVideo() {
VideoInfoQuery videoInfoQuery = new VideoInfoQuery();
videoInfoQuery.setQueryUserInfo(true);
videoInfoQuery.setOrderBy("create_time desc");
videoInfoQuery.setRecommendType(VideoRecommendTypeEnum.RECOMMEND.getType());
List<VideoInfo> recommendVideoList = videoInfoService.findListByParam(videoInfoQuery);
return getSuccessResponseVO(recommendVideoList);
}
感觉比以前直接写一个联表SQL,复用性会高很多。