最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)評論回復(fù)功能的完整步驟

 更新時間:2020年11月03日 12:13:52   作者:☜好脾氣先生✔  
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)評論回復(fù)功能的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

使用遞歸循環(huán)開發(fā)評論回復(fù)功能,適用于大部分的簡單單體應(yīng)用

評論功能或許是大多數(shù)的單體應(yīng)用之中會用到的功能,我們會在自己所開發(fā)的項目之中進行集成該功能

大多數(shù)時候我們會將評論功能劃分成以下幾種:

  • 單一型
  • 嵌套型
  • 兩層型

一、分類方式

1、單一型

單一型評論方式就是日常論壇之中的蓋樓的方式

用戶只能根據(jù)所在的文章或者問題進行單一回復(fù),評論之間沒有互動

類似于問答形式。提出問題,然后回答,一對多關(guān)系。這些回答之間沒有任何聯(lián)系

2、嵌套型

嵌套型評論方式會對有回復(fù)的評論進行遞歸,會造成后端性能不佳,而且對于前端的展示也不是很友好

3、兩層型

兩層型評論方式就是除了一級評論之外,無論是對于該評論的回復(fù)還是對于回復(fù)的回復(fù)都統(tǒng)一在第二層

二、實現(xiàn)原理

就以最常見的博客來說,不同的分類方式實現(xiàn)原理不一樣

1、單一型

我們只需要在評論的數(shù)據(jù)表格中添加博客id即可,查詢出相對應(yīng)的數(shù)據(jù)直接進行展示即可

create table `comment` (
 `id` int(11) not null auto_increment comment '主鍵id',
 `nickname` varchar(255) default null comment '評論者昵稱',
 `avatar` varchar(255) comment '評論頭像',
 `content` varchar(255) default null comment '評論的內(nèi)容',
 `blog_id` int(11) default null comment '評論的博客id',
 primary key (`id`)
 ) comment '評論表';

在業(yè)務(wù)之中根據(jù)博客id查詢出來,傳遞給前端展示出來即可

select * from comment where blog_id=#{blog_id}

2、嵌套型

嵌套型的評論方式所需要的數(shù)據(jù)結(jié)構(gòu)是樹狀型的,評論多起來的話層級結(jié)構(gòu)會變得很復(fù)雜,對于性能消耗也是很巨大,【不推薦】

實現(xiàn)原理為我們會在評論表之中添加一個【parent_id】字段,定義評論和回復(fù)為父子級的關(guān)系,評論為父級,回復(fù)為子級,默認為【-1】,表示為沒有父級,

create table `comment` (
 `id` int(11) not null auto_increment comment '主鍵id',
 `nickname` varchar(255) default null comment '評論者昵稱',
 `avatar` varchar(255) comment '評論頭像',
 `content` varchar(255) default null comment '評論的內(nèi)容',
 `blog_id` int(11) default null comment '評論的博客id',
 `parent_id` int(11) default '-1' comment '父級評論id',
 primary key (`id`)
 ) comment '評論表';

需要使用遞歸和鏈表進行循環(huán)遍歷插入回復(fù)

設(shè)計如下:

Content.java

	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "主鍵id")
	@TableId(value = "id", type = IdType.ASSIGN_ID)
	private Integer id;

	@ApiModelProperty(value = "用戶昵稱")
	@TableField("nickname")
	private String nickname;

	@ApiModelProperty(value = "頭像")
	@TableField("avatar")
	private String avatar;
	
	@ApiModelProperty(value = "評論")
	@TableField("comment")
	private String comment;

	@ApiModelProperty(value = "博客id ")
	@TableField("blog_id")
	private Integer blogId;

	@ApiModelProperty(value = "回復(fù)評論id")
	@TableField("parent_id")
	private Integer parentId;

DTO設(shè)計

ContentDTO.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "評論模型")
@JsonIgnoreProperties(value = { "handler" })
public class ContentDTO {
	private int id;
 private String nickname;
 private String content;
	private List<ContentDTO> children;
}

使用mybatis做為持久層框架,編寫sql查詢語句進行嵌套查詢,

 <resultMap id="commentDTOMap" type="com.zukxu.items.comment.entity.ContentDTO">
  <id property="id" column="comment_id"></id>
  <result property="nickname" column="nickname"></result>
  <result property="content" column="content"></result>
 
  <association property="children"
      select="com.zukxu.items.comment.mapper.ContentMapper.selectCommentById" column="{blogId=blog_id,parentId=comment_id}"
      fetchType="lazy">
  </association>
 </resultMap>

 <select id="selectCommentById" resultMap="commentDTOMap">
  SELECT comment_id,nickname,content,blog_id,parent_id FROM blog WHERE blog_id = #{blogId} AND parent_id = #{parentId}
 </select>

結(jié)果如下:

[
    {
      "id": "1309302063977304065",
      "nickname": "1",
      "content": "這次該可以了吧",
      "children": [
        {
          "id": "1309319425866698753",
          "nickname": "1",
          "content": "好了?",
          "children": []
        }
      ]
    },
    {
      "id": "1309341283121154994",
      "nickname": "4",
      "content": "為什么呢",
      "children": [
        {
          "id": "1309373849414787073",
          "nickname": "1",
          "content": "好了?",
          "children": []
        },
        {
          "id": "1309308402422091778",
          "nickname": "1",
          "content": "可以了吧",
          "children": []
        },
        {
          "id": "1309373675783184385",
          "nickname": "1",
          "content": "好了?",
          "children": [
            {
              "id": "1309373886580514817",
              "nickname": "1",
              "content": "???",
              "children": []
            }
          ]
        }
      ]
    }
  ]

結(jié)果會造成多重嵌套,不是很友好

3、兩層型

比單一型多了互動的功能,比嵌套型更加簡潔,方便操作管理
設(shè)計和嵌套型保持一致,只需要在查詢出來數(shù)據(jù)之后對數(shù)據(jù)進行處理即可
將嵌套型轉(zhuǎn)為兩層型結(jié)構(gòu)

處理每個父級評論的子級及其嵌套子級

 public List<CommentDTO> findParent(List<CommentDTO> comments) {

  for (CommentDTO comment : comments) {

   // 防止checkForComodification(),而建立一個新集合
   ArrayList<CommentDTO> fatherChildren = new ArrayList<>();

   // 遞歸處理子級的回復(fù),即回復(fù)內(nèi)有回復(fù)
   findChildren(comment, fatherChildren);

   // 將遞歸處理后的集合放回父級的孩子中
   comment.setChildren(fatherChildren);
  }
  return comments;
 }

 public void findChildren(CommentDTO parent, List<CommentDTO> fatherChildren) {

  // 找出直接子級
  List<CommentDTO> comments = parent.getChildren();

  // 遍歷直接子級的子級
  for (CommentDTO comment : comments) {

   // 若非空,則還有子級,遞歸
   if (!comment.getChildren().isEmpty()) {
    findChildren(comment, fatherChildren);
   }

   // 已經(jīng)到了最底層的嵌套關(guān)系,將該回復(fù)放入新建立的集合
   fatherChildren.add(comment);

   // 容易忽略的地方:將相對底層的子級放入新建立的集合之后
   // 則表示解除了嵌套關(guān)系,對應(yīng)的其父級的子級應(yīng)該設(shè)為空
   comment.setChildren(new ArrayList<>());
  }
 }
}

最后的結(jié)果如下:

 [
    {
      "id": "1309302063977304065",
      "userId": "1",
      "comment": "這次該可以了吧",
      "children": [
        {
          "id": "1309319425866698753",
          "userId": "1",
          "comment": "好了?",
          "children": []
        }
      ]
    },
    {
      "id": "1309341283121154994",
      "userId": "4",
      "comment": "為什么呢",
      "children": [
        {
          "id": "1309373849414787073",
          "userId": "1",
          "comment": "好了?",
          "children": []
        },
        {
          "id": "1309308402422091778",
          "userId": "1",
          "comment": "可以了吧",
          "children": []
        },
        {
          "id": "1309373886580514817",
          "userId": "1",
          "comment": "???",
          "children": []
        },
        {
          "id": "1309373675783184385",
          "userId": "1",
          "comment": "好了?",
          "children": []
        }
      ]
    }
  ]

絕大多數(shù)時候我們都會去使用兩層型的評論方式做評論

總結(jié)

到此這篇關(guān)于Java實現(xiàn)評論回復(fù)功能的文章就介紹到這了,更多相關(guān)Java實現(xiàn)評論回復(fù)功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jar包運行一段時間后莫名其妙掛掉線上問題及處理方案

    jar包運行一段時間后莫名其妙掛掉線上問題及處理方案

    這篇文章主要介紹了jar包運行一段時間后莫名其妙掛掉線上問題及處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java 超詳細講解ThreadLocal類的使用

    Java 超詳細講解ThreadLocal類的使用

    寫SpringBoot項目的時候,經(jīng)常用到的一個保存用戶信息的類就是Threadlocal,我們今天就來詳細介紹一下這個類,感興趣的朋友來看看吧
    2022-04-04
  • SpringBoot中的Actuator詳解

    SpringBoot中的Actuator詳解

    這篇文章主要介紹了SpringBoot中的Actuator詳解,Spring Boot Actuator 在Spring Boot第一個版本發(fā)布的時候就有了,它為Spring Boot提供了一系列產(chǎn)品級的特性,監(jiān)控應(yīng)用程序,收集元數(shù)據(jù),運行情況或者數(shù)據(jù)庫狀態(tài)等,需要的朋友可以參考下
    2023-09-09
  • java判斷是否為圖片的步驟和方法

    java判斷是否為圖片的步驟和方法

    在本篇內(nèi)容里小編給大家分享的是關(guān)于java判斷是否為圖片的做法和步驟,需要的朋友們學(xué)習(xí)下。
    2018-12-12
  • 淺談java的守護線程與非守護線程

    淺談java的守護線程與非守護線程

    這篇文章主要介紹了淺談java的守護線程與非守護線程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例

    java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例

    本文主要介紹了java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java實現(xiàn)的自定義類加載器示例

    Java實現(xiàn)的自定義類加載器示例

    這篇文章主要介紹了Java實現(xiàn)的自定義類加載器,結(jié)合具體實例形式分析了java自定義類加載器的原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • 輕松掌握Java享元模式

    輕松掌握Java享元模式

    這篇文章主要幫助大家輕松掌握Java享元模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JVM的基本介紹以及垃圾回收

    JVM的基本介紹以及垃圾回收

    垃圾回收(Garbage Collection,GC),顧名思義就是釋放垃圾占用的空間,防止內(nèi)存泄露,這篇文章主要給大家介紹了關(guān)于JVM垃圾回收的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • springboot如何讀取application.yml文件

    springboot如何讀取application.yml文件

    這篇文章主要介紹了springboot如何讀取application.yml文件的方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-12-12

最新評論

永安市| 武安市| 永新县| 铜鼓县| 名山县| 正阳县| 重庆市| 梅河口市| 高清| 陈巴尔虎旗| 皋兰县| 贵南县| 石阡县| 仙游县| 武山县| 桐梓县| 沁阳市| 二连浩特市| 玉门市| 五河县| 甘洛县| 乌审旗| 虞城县| 临漳县| 丹阳市| 铜梁县| 玛纳斯县| 大渡口区| 长白| 鄄城县| 沙湾县| 奉节县| 蓝田县| 大余县| 蕲春县| 年辖:市辖区| 长岛县| 荣成市| 桦川县| 托里县| 会昌县|