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

SpringBoot實(shí)現(xiàn)無限級評論回復(fù)的項目實(shí)踐

 更新時間:2023年03月24日 11:23:24   作者:吳名氏  
本文主要介紹了SpringBoot實(shí)現(xiàn)無限級評論回復(fù)的項目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

評論功能已經(jīng)成為APP和網(wǎng)站開發(fā)中的必備功能。本文采用springboot+mybatis-plus框架,通過代碼主要介紹評論功能的數(shù)據(jù)庫設(shè)計和接口數(shù)據(jù)返回。我們返回的格式可以分三種方案,第一種方案是先返回評論,再根據(jù)評論id返回回復(fù)信息,第二種方案是將評論回復(fù)直接封裝成一個類似于樹的數(shù)據(jù)結(jié)構(gòu)進(jìn)行返回(如果數(shù)據(jù)對的話,可以根據(jù)評論分頁),第三種方案是將所有數(shù)據(jù)用遞歸的SQL查出來,再把數(shù)據(jù)解析成樹,返回結(jié)果

1 數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計

表結(jié)構(gòu):

CREATE TABLE `comment` (
  `id` bigint(18) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(18) NOT NULL DEFAULT '0',
  `content` text NOT NULL COMMENT '內(nèi)容',
  `author` varchar(20) NOT NULL COMMENT '評論人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '評論時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

數(shù)據(jù)添加:

INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (1, 0, '這是評論1', '吳名氏', '2023-02-20 17:11:16');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (2, 1, '我回復(fù)了第一條評論', '吳名氏', '2023-02-20 17:12:00');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (3, 2, '我回復(fù)了第一條評論的第一條回復(fù)', '吳名氏', '2023-02-20 17:12:13');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (4, 2, '我回復(fù)了第一條評論的第二條回復(fù)', '吳名氏', '2023-02-21 09:23:14');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (5, 0, '這是評論2', '吳名氏', '2023-02-21 09:41:02');
INSERT INTO `comment` (`id`, `parent_id`, `content`, `author`, `create_time`) VALUES (6, 3, '我回復(fù)了第一條評論的第一條回復(fù)的第一條回復(fù)', '吳名氏', '2023-02-21 09:56:27');

添加后的數(shù)據(jù):

2 方案一

方案一先返回評論列表,再根據(jù)評論id返回回復(fù)列表,以此循環(huán),具體代碼下文進(jìn)行展示

2.1 控制層CommentOneController.java

/**
 * 方案一
 * @author wuKeFan
 * @date 2023-02-20 16:58:08
 */
@Slf4j
@RestController
@RequestMapping("/one/comment")
public class CommentOneController {
 
    @Resource
    private CommentService commentService;
 
    @GetMapping("/")
    public List<Comment> getList() {
        return commentService.getList();
    }
 
    @GetMapping("/{id}")
    public Comment getCommentById(@PathVariable Long id) {
        return commentService.getById(id);
    }
 
    @GetMapping("/parent/{parentId}")
    public List<Comment> getCommentByParentId(@PathVariable Long parentId) {
        return commentService.getCommentByParentId(parentId);
    }
 
    @PostMapping("/")
    public void addComment(@RequestBody Comment comment) {
        commentService.addComment(comment);
    }
 
}

2.2 service類CommentService.java

/**
 * service類
 * @author wuKeFan
 * @date 2023-02-20 16:55:23
 */
public interface CommentService {
 
    List<Comment> getCommentByParentId(Long parentId);
 
    void addComment(Comment comment);
 
    Comment getById(Long id);
 
    List<Comment> getList();
}

2.3 service實(shí)現(xiàn)類CommentServiceImpl.java

/**
 * @author wuKeFan
 * @date 2023-02-20 16:56:00
 */
@Service
public class CommentServiceImpl implements CommentService{
 
    @Resource
    private CommentMapper baseMapper;
 
    @Override
    public List<Comment> getCommentByParentId(Long parentId) {
        QueryWrapper<Comment> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        return baseMapper.selectList(queryWrapper);
    }
 
    @Override
    public void addComment(Comment comment) {
        baseMapper.insert(comment);
    }
 
    @Override
    public Comment getById(Long id) {
        return baseMapper.selectById(id);
    }
 
    @Override
    public List<Comment> getList() {
        return baseMapper.selectList(new QueryWrapper<Comment>().lambda().eq(Comment::getParentId, 0));
    }
 
}

2.4 數(shù)據(jù)庫持久層類CommentMapper.java

/**
 * mapper類
 * @author wuKeFan
 * @date 2023-02-20 16:53:59
 */
@Repository
public interface CommentMapper extends BaseMapper<Comment> {
 
}

2.5 實(shí)體類Comment.java

/**
 * 評論表實(shí)體類
 * @author wuKeFan
 * @date 2023-02-20 16:53:24
 */
@Data
@TableName("comment")
public class Comment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long parentId;
    private String content;
    private String author;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
}

2.6 使用Postman請求接口,查看返回數(shù)據(jù)

2.6.1 請求評論列表接口(本地的url為:http://localhost:8081/one/comment/ ,GET請求),請求結(jié)果如圖

2.6.2 根據(jù)評論id(或者回復(fù)id)返回回復(fù)列表(本地url為:http://localhost:8081/one/comment/parent/1 ,GET請求),請求結(jié)果如圖

3 方案二

方案二采用的是將數(shù)據(jù)裝到一個類似樹的數(shù)據(jù)結(jié)構(gòu),然后返回,數(shù)據(jù)如果多的話,可以根據(jù)評論列表進(jìn)行分頁

3.1 控制層CommentTwoController.java

/**
 * @author wuKeFan
 * @date 2023-02-20 17:30:45
 */
@Slf4j
@RestController
@RequestMapping("/two/comment")
public class CommentTwoController {
 
    @Resource
    private CommentService commentService;
 
    @GetMapping("/")
    public List<CommentDTO> getAllComments() {
       return commentService.getAllComments();
    }
 
    @PostMapping("/")
    public void addComment(@RequestBody Comment comment) {
        commentService.addComment(comment);
    }
}

3.2 service類CommentService.java

/**
 * service類
 * @author wuKeFan
 * @date 2023-02-20 16:55:23
 */
public interface CommentService {
 
    void addComment(Comment comment);
 
    void setChildren(CommentDTO commentDTO);
 
    List<CommentDTO> getAllComments();
}

3.3 service實(shí)現(xiàn)類CommentServiceImpl.java

/**
 * @author wuKeFan
 * @date 2023-02-20 16:56:00
 */
@Service
public class CommentServiceImpl implements CommentService{
 
    @Resource
    private CommentMapper baseMapper;
 
    @Override
    public void addComment(Comment comment) {
        baseMapper.insert(comment);
    }
 
    @Override
    public List<CommentDTO> getAllComments() {
        List<CommentDTO> rootComments = baseMapper.findByParentId(0L);
        rootComments.forEach(this::setChildren);
        return rootComments;
    }
 
    /**
     * 遞歸獲取
     * @param commentDTO 參數(shù)
     */
    @Override
    public void setChildren(CommentDTO commentDTO){
        List<CommentDTO> children = baseMapper.findByParentId(commentDTO.getId());
        if (!children.isEmpty()) {
            commentDTO.setChildren(children);
            children.forEach(this::setChildren);
        }
    }
 
}

3.4 數(shù)據(jù)庫持久層類CommentMapper.java

/**
 * mapper類
 * @author wuKeFan
 * @date 2023-02-20 16:53:59
 */
@Repository
public interface CommentMapper extends BaseMapper<Comment> {
 
    @Select("SELECT id, parent_id as parentId, content, author, create_time as createTime FROM comment WHERE parent_id = #{parentId}")
    List<CommentDTO> findByParentId(Long parentId);
 
}

3.5 實(shí)體類CommentDTO.java

/**
 * 遞歸方式實(shí)體類
 * @author wuKeFan
 * @date 2023-02-20 17:26:48
 */
@Data
public class CommentDTO {
 
    private Long id;
    private Long parentId;
    private String content;
    private String author;
    private List<CommentDTO> children;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
 
}

3.6 使用Postman請求接口,查看返回數(shù)據(jù)

3.6.1 通過遞歸的方式以樹的數(shù)據(jù)結(jié)構(gòu)返回(本地url為:http://localhost:8081/two/comment/ ,GET請求),請求結(jié)果如圖

返回的json格式如圖:

[
    {
        "id": 1,
        "parentId": 0,
        "content": "這是評論1",
        "author": "吳名氏",
        "children": [
            {
                "id": 2,
                "parentId": 1,
                "content": "我回復(fù)了第一條評論",
                "author": "吳名氏",
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "content": "我回復(fù)了第一條評論的第一條回復(fù)",
                        "author": "吳名氏",
                        "children": [
                            {
                                "id": 6,
                                "parentId": 3,
                                "content": "我回復(fù)了第一條評論的第一條回復(fù)的第一條回復(fù)",
                                "author": "吳名氏",
                                "children": null,
                                "createTime": "2023-02-21 09:56:27"
                            }
                        ],
                        "createTime": "2023-02-20 17:12:13"
                    },
                    {
                        "id": 4,
                        "parentId": 2,
                        "content": "我回復(fù)了第一條評論的第二條回復(fù)",
                        "author": "吳名氏",
                        "children": null,
                        "createTime": "2023-02-21 09:23:14"
                    }
                ],
                "createTime": "2023-02-20 17:12:00"
            }
        ],
        "createTime": "2023-02-20 17:11:16"
    },
    {
        "id": 5,
        "parentId": 0,
        "content": "這是評論2",
        "author": "吳名氏",
        "children": null,
        "createTime": "2023-02-21 09:41:02"
    }
]

4 方案三

方案三是將所有數(shù)據(jù)用遞歸的SQL查出來,再把數(shù)據(jù)解析成樹,返回結(jié)果,適合數(shù)據(jù)較少的情況下,且MySQL版本需要在8.0以上

4.1 控制層CommentThreeController.java

/**
 * @author wuKeFan
 * @date 2023-02-20 17:30:45
 */
@Slf4j
@RestController
@RequestMapping("/three/comment")
public class CommentThreeController {
 
    @Resource
    private CommentService commentService;
 
    @GetMapping("/")
    public List<CommentDTO> getAllCommentsBySql() {
       return commentService.getAllCommentsBySql();
    }
 
    @PostMapping("/")
    public void addComment(@RequestBody Comment comment) {
        commentService.addComment(comment);
    }
}

4.2 service類CommentService.java

/**
 * service類
 * @author wuKeFan
 * @date 2023-02-20 16:55:23
 */
public interface CommentService {
 
    List<CommentDTO> getAllCommentsBySql();
 
}

4.3 service實(shí)現(xiàn)類CommentServiceImpl.java

/**
 * @author wuKeFan
 * @date 2023-02-20 16:56:00
 */
@Service
public class CommentServiceImpl implements CommentService{
 
    @Resource
    private CommentMapper baseMapper;
 
    /**
     * 遞歸獲取
     * @param commentDTO 參數(shù)
     */
    @Override
    public void setChildren(CommentDTO commentDTO){
        List<CommentDTO> children = baseMapper.findByParentId(commentDTO.getId());
        if (!children.isEmpty()) {
            commentDTO.setChildren(children);
            children.forEach(this::setChildren);
        }
    }
 
}

4.4 數(shù)據(jù)庫持久層類CommentMapper.java

/**
 * mapper類
 * @author wuKeFan
 * @date 2023-02-20 16:53:59
 */
@Repository
public interface CommentMapper extends BaseMapper<Comment> {
 
    @DS("localhost80")
    List<CommentDTO> getAllCommentsBySql();
 
}

4.5 實(shí)體類Comment.java

/**
 * 評論表實(shí)體類
 * @author wuKeFan
 * @date 2023-02-20 16:53:24
 */
@Data
@TableName("comment")
public class Comment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long parentId;
    private String content;
    private String author;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    private Integer level;
}

4.6 使用Postman請求接口,查看返回數(shù)據(jù)

4.6.1 通過遞歸的方式以樹的數(shù)據(jù)結(jié)構(gòu)返回(本地url為:http://localhost:8081/three/comment/ ,GET請求),請求結(jié)果如圖

返回的json格式如圖:

[
    {
        "id": 1,
        "parentId": 0,
        "content": "這是評論1",
        "author": "吳名氏",
        "children": [
            {
                "id": 2,
                "parentId": 1,
                "content": "我回復(fù)了第一條評論",
                "author": "吳名氏",
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "content": "我回復(fù)了第一條評論的第一條回復(fù)",
                        "author": "吳名氏",
                        "children": [
                            {
                                "id": 6,
                                "parentId": 3,
                                "content": "我回復(fù)了第一條評論的第一條回復(fù)的第一條回復(fù)",
                                "author": "吳名氏",
                                "children": [],
                                "createTime": "2023-02-21 09:56:27",
                                "level": 4
                            }
                        ],
                        "createTime": "2023-02-20 17:12:13",
                        "level": 3
                    },
                    {
                        "id": 4,
                        "parentId": 2,
                        "content": "我回復(fù)了第一條評論的第二條回復(fù)",
                        "author": "吳名氏",
                        "children": [],
                        "createTime": "2023-02-21 09:23:14",
                        "level": 3
                    }
                ],
                "createTime": "2023-02-20 17:12:00",
                "level": 2
            }
        ],
        "createTime": "2023-02-20 17:11:16",
        "level": 1
    },
    {
        "id": 5,
        "parentId": 0,
        "content": "這是評論2",
        "author": "吳名氏",
        "children": [],
        "createTime": "2023-02-21 09:41:02",
        "level": 1
    }
]

5 總結(jié)

以上三種方案各有優(yōu)缺點(diǎn),需要從不同場景中使用不同的方案,更多相關(guān)SpringBoot 無限級評論回復(fù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot初始化項目并完成登入注冊的全過程

    Springboot初始化項目并完成登入注冊的全過程

    工作之余,想要學(xué)習(xí)一下SpringBoot,通過網(wǎng)絡(luò)大量教程最終成功運(yùn)行SpringBoot項目,下面這篇文章主要給大家介紹了關(guān)于Springboot初始化項目并完成登入注冊的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 虛擬機(jī)linux中jdk安裝配置方法

    虛擬機(jī)linux中jdk安裝配置方法

    這篇文章主要為大家詳細(xì)介紹了虛擬機(jī)linux中jdk安裝配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java中for、while、do while三種循環(huán)語句的區(qū)別介紹

    Java中for、while、do while三種循環(huán)語句的區(qū)別介紹

    這篇文章主要介紹了Java中for、while、do while三種循環(huán)語句的區(qū)別介紹的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • SpringBoot中的404錯誤:原因、影響及解決策略

    SpringBoot中的404錯誤:原因、影響及解決策略

    本文詳細(xì)介紹了SpringBoot中404錯誤的出現(xiàn)原因、影響以及處理策略,404錯誤常見于URL路徑錯誤、控制器配置問題、靜態(tài)資源配置錯誤、依賴缺失或版本不兼容、配置錯誤和服務(wù)器配置問題,解決方法包括檢查URL路徑、審查控制器配置、配置靜態(tài)資源
    2025-02-02
  • Java簡單工廠和工廠方法模式詳細(xì)解析

    Java簡單工廠和工廠方法模式詳細(xì)解析

    這篇文章主要介紹了Java簡單工廠和工廠方法模式詳細(xì)解析,簡單工廠模式屬于類的創(chuàng)新型模式,又叫靜態(tài)工廠方法模式是通過專門定義一個類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類,需要的朋友可以參考下
    2023-12-12
  • Java GUI編程實(shí)現(xiàn)在線聊天室

    Java GUI編程實(shí)現(xiàn)在線聊天室

    這篇文章主要為大家詳細(xì)介紹了Java GUI編程實(shí)現(xiàn)在線聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序

    Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序

    這篇文章主要為大家詳細(xì)介紹了Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • java實(shí)現(xiàn)發(fā)送郵件的示例代碼

    java實(shí)現(xiàn)發(fā)送郵件的示例代碼

    這篇文章主要介紹了java如何實(shí)現(xiàn)發(fā)送郵件,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java使用Apache Tika從PDF文件中提取文本

    Java使用Apache Tika從PDF文件中提取文本

    Apache Tika 是一個內(nèi)容分析工具包,它能夠從各種類型的文檔中提取元數(shù)據(jù)和文本內(nèi)容,下面我們就來看看如何使用Apache Tika從PDF文件中提取文本吧
    2025-04-04
  • SpringBoot學(xué)習(xí)之全局異常處理設(shè)置(返回JSON)

    SpringBoot學(xué)習(xí)之全局異常處理設(shè)置(返回JSON)

    本篇文章主要介紹了SpringBoot學(xué)習(xí)之全局異常處理設(shè)置(返回JSON),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02

最新評論

商水县| 洞头县| 栾城县| 汕尾市| 霸州市| 霍山县| 奉节县| 纳雍县| 新津县| 乌兰县| 玛曲县| 大宁县| 张家口市| 新泰市| 平阴县| 含山县| 陵川县| 沽源县| 仲巴县| 沾益县| 沈丘县| 延庆县| 丹棱县| 富顺县| 漠河县| 沙雅县| 万安县| 北票市| 玉溪市| 哈尔滨市| 基隆市| 上饶县| 甘泉县| 得荣县| 大宁县| 田林县| 宜兰县| 尤溪县| 海原县| 南涧| 靖江市|