二级评论列表-Java实现

二级评论列表是很常见的功能,文章记录了新手用Java实现的具体逻辑。

整体实现逻辑是先用2个sql,分别查出两层数据。然后用java在service中实现数据组装,返给前端。这种实现思路好处是SQL简洁,逻辑分明,便于维护。

一:需求场景

一级评论的列表,平铺展示。当涉及多人回复,或者两个人多次对话后, 留言逻辑看着非常混乱。如下图

当改造为二级列表后,数据展示更加直观。如下图, 演示地址:CodingLife 

二、SQL实现

先用2个SQL分别查出两层数据,先查parent_id为空的数据,就是第一层数据。

再用MyBatis的嵌套查询,配置in语句查出所有的二级数据。

    # 一级评论
    <select id="getuserSideLevel1" resultMap="indexResultMap">
        select
            *
        from
            leave_message ml
        left join user user
            on user.id = ml.leave_id
        where
            parent_id is null
        order by
            create_time desc
        limit #{start},#{size}
    </select>

    # 二级评论
    <select id="getuserSideLevel2" resultMap="indexResultMap">
        select
            *
        from
            leave_message ml
                left join user user
        on user.id = ml.leave_id
        where
            parent_id in
        <foreach collection="parentIds" item="parentId" open="(" separator="," close=")">
            #{parentId}
        </foreach>
        order by
            create_time asc
    </select>

三、Java组装

使用Java将两级数据组装在一起,下面为service的具体代码。

        // 先查分页范围内的一级数据
        List<LeaveMessage> level1List = leaveMessageMapper.getuserSideLevel1(start,size);

        // 取出一级数据的id
        List<Integer> parentIdArray = new ArrayList<>();
        for (int i = 0; i < level1List.size(); i++) {
            LeaveMessage level1Item = level1List.get(i);
            Integer id = level1Item.getId(); // 获取 id
            parentIdArray.add(id);
        }

        // 再查以上一级数据的二级数据
        List<LeaveMessage> level2List = leaveMessageMapper.getuserSideLevel2(parentIdArray);

        // 组装如上两级数据
        for (int i = 0; i < level1List.size(); i++) {
            LeaveMessage level1Item = level1List.get(i);
            List<LeaveMessage> childList = new ArrayList<>();
            for (int j = 0; j < level2List.size(); j++) {
                LeaveMessage child = level2List.get(j);
                if (level1Item.getId().equals(child.getParentId())) {
                    childList.add(child);
                }
            }
            level1Item.setChild(childList);
        }

        return ApiResponse.success(level1List);

四、源码

演示地址为:CodingLife,源码地址为:Git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun_qqq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值