比较优雅的联表查询

说明一个简单的场景,就是获取视频表中数据同时查询用户信息。


能实现的方法有很多

  • 字段冗余
  • 通过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,复用性会高很多。

7 个赞

可以可以 感谢分享

2 个赞

用惯c# 的lamada 和linq查询,看这种写sql还真不习惯 :rofl:

3 个赞

好厉害,感谢大佬

1 个赞

好思路,感谢大佬分享

1 个赞