最终效果

image.png

数据库表设计

image.png

编写SQL查询

  1. SELECT
  2. ic.comment_level AS commentLevel,
  3. ic.content AS content,
  4. ic.sepc_name AS specName,
  5. ic.created_time AS createdTime,
  6. u.face AS userFace,
  7. u.nickname AS nickName
  8. FROM
  9. items_comments ic
  10. LEFT JOIN
  11. users u //商品评价表关联用户表,获取用户头像和名称
  12. ON
  13. ic.user_id = u.id
  14. WHERE
  15. ic.item_id = 'cake-1001'
  16. AND
  17. ic.comment_level = 1 # 商品评价类型:好、中、差

image.png

分析创建VO

创建分类ItemCommentVO

  1. package com.shiers.pojo.vo;
  2. import java.util.Date;
  3. /**
  4. * 用于展示商品评价的VO
  5. *
  6. * @author shierS
  7. * @date 2021/5/31
  8. */
  9. public class ItemCommentVO {
  10. private Integer commentLevel;
  11. private String content;
  12. private String specName;
  13. private Date createdTime;
  14. private String userFace;
  15. private String nickname;
  16. //省略get、set方法
  17. }

编写mapper

if判断是否根据评论等级查询

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.shiers.mapper.ItemsMapperCustom">
  4. <select id="queryItemComments" parameterType="Map" resultType="com.shiers.pojo.vo.ItemCommentVO">
  5. SELECT ic.comment_level AS commentLevel,
  6. ic.content AS content,
  7. ic.sepc_name AS specName,
  8. ic.created_time AS createdTime,
  9. u.face AS userFace,
  10. u.nickname AS nickname
  11. FROM items_comments ic
  12. LEFT JOIN
  13. users u
  14. ON
  15. ic.user_id = u.id
  16. WHERE ic.item_id = #{paramsMap.itemId}
  17. <if test="paramsMap.level != null and paramsMap.level != '' ">
  18. AND ic.comment_level = #{paramsMap.level}
  19. </if>
  20. </select>
  21. </mapper>

编写初步service

  1. @Transactional(propagation = Propagation.SUPPORTS)
  2. @Override
  3. public List<ItemCommentVO> queryPagedComments(String itemId,Integer level) {
  4. Map<String, Object> map = new HashMap<>();
  5. map.put("itemId", itemId);
  6. map.put("level", level);
  7. List<ItemCommentVO> list = itemsMapperCustom.queryItemComments(map);
  8. return list;
  9. }

这样我们已经可以实现获取商品评论信息了
接下来为了更好的体验需要实现分页功能

导入分页pagehelper依赖

  1. <!--pagehelper-->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.2.5</version>
  6. </dependency>

在application.yml添加分页配置

  1. # 分页插件配置
  2. pagehelper:
  3. helperDialect: mysql
  4. supportMethodsArguments: true

使用分页完成service

  1. @Transactional(propagation = Propagation.SUPPORTS)
  2. @Override
  3. public PagedGridResult queryPagedComments(String itemId,
  4. Integer level,
  5. Integer page,
  6. Integer pageSize) {
  7. Map<String, Object> map = new HashMap<>();
  8. map.put("itemId", itemId);
  9. map.put("level", level);
  10. /**
  11. * page:第几页
  12. * pageSize:每页显示条数
  13. */
  14. PageHelper.startPage(page, pageSize);
  15. List<ItemCommentVO> list = itemsMapperCustom.queryItemComments(map);
  16. return setterPagedGrid(list,page);
  17. }
  18. /**
  19. * 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
  20. * PageInfo是大佬已经写好的分页数据封装
  21. * 然而我们又自己写了一个PagedGridResult封装
  22. * 主要是因为在我们项目的前端,可能分页有多个不同的组件来完成,每一个组件需求的参数(名称、类型)
  23. * 可能会不同,所以我们多了一步自定义的封装,使得能够对应前端,在不同的需求下,只需要添加相
  24. * 应的封装类型即可
  25. * 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
  26. */
  27. private PagedGridResult setterPagedGrid(List<?> list,Integer page){
  28. PageInfo<?> pageList = new PageInfo<>(list);
  29. PagedGridResult grid = new PagedGridResult();
  30. grid.setPage(page);
  31. grid.setRows(list);
  32. grid.setTotal(pageList.getPages());
  33. grid.setRecords(pageList.getTotal());
  34. return grid;
  35. }

🔥添加util类PagedGridResult.java🔥

  1. package com.shiers.utils;
  2. import java.util.List;
  3. /**
  4. * PagedGridResult.java
  5. * 用来显示分页返回的Grid数据
  6. *
  7. * @author shierS
  8. * @date 2021/5/31
  9. */
  10. public class PagedGridResult {
  11. private int page; //当前页数
  12. private int total; //总页数
  13. private long records; //总记录数
  14. private List<?> rows; //每行显示的内容
  15. //省略get、set方法
  16. }

编写Controller

  1. @ApiOperation(value = "查询商品评论", notes = "查询商品评论", httpMethod = "GET")
  2. @GetMapping("/comments")
  3. public MyJSONResult comments(
  4. @ApiParam(name = "itemId", value = "商品id", required = true)
  5. @RequestParam String itemId,
  6. @ApiParam(name = "level", value = "评价等级", required = false)
  7. @RequestParam Integer level,
  8. @ApiParam(name = "page", value = "查询下一页的第几页", required = false)
  9. @RequestParam Integer page,
  10. @ApiParam(name = "pageSize", value = "分页的每一页显示的条数", required = false)
  11. @RequestParam Integer pageSize) {
  12. //除了itemID其他都是非必传参数
  13. if (StringUtils.isBlank(itemId)) {
  14. return MyJSONResult.errorMsg(null);
  15. }
  16. if (page == null) {
  17. page = 1; //没有page可默认为1
  18. }
  19. if (pageSize == null) {
  20. pageSize = 10; //默认为10条
  21. }
  22. PagedGridResult grid = itemService.queryPagedComments(itemId, level, page, pageSize);
  23. return MyJSONResult.ok(grid);
  24. }

pagehelper实现简析

PageHelper首先将前端传递的参数保存到page这个对象中,接着将page的副本存放入ThreadLoacl中,这样可以保证分页的时候,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,重新拼装分页SQL,完成分页。

通过最终功能实现
我们在控制台打印的数据库查询语句
该商品下有23条评论

当查询第一页时

  1. ==> Preparing:
  2. SELECT
  3. ic.comment_level AS commentLevel,
  4. ic.content AS content,
  5. ic.sepc_name AS specName,
  6. ic.created_time AS createdTime,
  7. u.face AS userFace,
  8. u.nickname AS nickName
  9. FROM
  10. items_comments ic
  11. LEFT JOIN
  12. users u
  13. ON
  14. ic.user_id = u.id
  15. WHERE
  16. ic.item_id = ?
  17. LIMIT ? # 🔥SQL后面拼接了LIMIT,限制了返回条数
  18. ==> Parameters:
  19. cake-1001(String), 10(Integer)

当查询第二页时

  1. ==> Preparing:
  2. SELECT
  3. ic.comment_level AS commentLevel,
  4. ic.content AS content,
  5. ic.sepc_name AS specName,
  6. ic.created_time AS createdTime,
  7. u.face AS userFace,
  8. u.nickname AS nickName
  9. FROM
  10. items_comments ic
  11. LEFT JOIN
  12. users u
  13. ON
  14. ic.user_id = u.id
  15. WHERE
  16. ic.item_id = ?
  17. LIMIT ?, ? # 🔥SQL后面拼接了LIMIT,实现分页
  18. ==> Parameters:
  19. cake-1001(String), 10(Integer), 10(Integer)