二級評論列表是很常見的功能,文章記錄了新手用Java實現的具體邏輯。
整體實現邏輯是先用2個sql,分別查出兩層數據。然后用java在service中實現數據組裝,返給前端。這種實現思路好處是SQL簡潔,邏輯分明,便于維護。
一:需求場景
一級評論的列表,平鋪展示。當涉及多人回復,或者兩個人多次對話后, 留言邏輯看著非常混亂。如下圖
當改造為二級列表后,數據展示更加直觀。如下圖,?演示地址:CodingLife?
二、SQL實現
先用2個SQL分別查出兩層數據,先查parent_id為空的數據,就是第一層數據。
再用MyBatis的嵌套查詢,配置in語句查出所有的二級數據。
# 一級評論<select id="getuserSideLevel1" resultMap="indexResultMap">select*fromleave_message mlleft join user useron user.id = ml.leave_idwhereparent_id is nullorder bycreate_time desclimit #{start},#{size}</select># 二級評論<select id="getuserSideLevel2" resultMap="indexResultMap">select*fromleave_message mlleft join user useron user.id = ml.leave_idwhereparent_id in<foreach collection="parentIds" item="parentId" open="(" separator="," close=")">#{parentId}</foreach>order bycreate_time asc</select>
三、Java組裝
使用Java將兩級數據組裝在一起,下面為service的具體代碼。
// 先查分頁范圍內的一級數據List<LeaveMessage> level1List = leaveMessageMapper.getuserSideLevel1(start,size);// 取出一級數據的idList<Integer> parentIdArray = new ArrayList<>();for (int i = 0; i < level1List.size(); i++) {LeaveMessage level1Item = level1List.get(i);Integer id = level1Item.getId(); // 獲取 idparentIdArray.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