📚 实战篇 02. 达人探店 - 查看探店笔记学习文档
一、 业务场景与核心痛点
当用户在 App 前端点击某一条探店笔记时,页面不仅要展示笔记的标题、图片、文字内容,还必须要在顶部展示作者的头像和昵称。
核心痛点:数据库表结构的设计与前端需求的不匹配
- 在我们的数据库中,探店笔记表(
tb_blog)为了遵循数据库设计范式,只保存了作者的user_id,而没有直接保存作者的name(昵称)和icon(头像)。 - 如果后端只单纯地
blogService.getById(id)然后返回给前端,前端根本无法渲染出作者的信息。
解决方案:
后端在查出 Blog 数据后,必须拿着里面的 user_id,再去查一次用户表(tb_user),然后把查到的头像和昵称“塞”进 Blog 对象中,最后再统一返回给前端。
二、 实体类改造 (MyBatisPlus 的小技巧)
为了能把用户的昵称和头像装进 Blog 对象里,我们需要在 Blog 实体类中增加这两个字段。
但是!这两个字段在 tb_blog 数据库表中是不存在的。如果不加特殊注解,MyBatisPlus 在执行 SQL 时会因为找不到这两个列而直接报错。
解决方案:使用 @TableField(exist = false) 注解。
Java
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_blog")
public class Blog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
// ... 其他原生字段省略 (shopId, title, images, content, userId 等) ...
/**
* 用户图标 (数据库 tb_blog 表中不存在此字段!)
*/
@TableField(exist = false)
private String icon;
/**
* 用户姓名 (数据库 tb_blog 表中不存在此字段!)
*/
@TableField(exist = false)
private String name;
}
这个注解非常关键,它明确告诉 MyBatisPlus:“这两个字段只是为了我写 Java 代码传数据方便用的,你在生成 SELECT 或 INSERT 语句时,请自动忽略它们。”
三、 核心业务代码落地
在 BlogServiceImpl 中,我们需要重写一下根据 ID 查询笔记的逻辑:
Java
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {
@Resource
private IUserService userService;
@Override
public Result queryBlogById(Long id) {
// 1. 查询探店笔记
Blog blog = getById(id);
if (blog == null) {
return Result.fail("笔记不存在!");
}
// 2. 核心补全逻辑:查询并封装发布这篇笔记的用户信息
queryBlogUser(blog);
// 3. 返回完整的笔记对象
return Result.ok(blog);
}
/**
* 封装的私有方法:根据 blog 中的 userId 查询用户信息,并塞回 blog 中
*/
private void queryBlogUser(Blog blog) {
Long userId = blog.getUserId();
User user = userService.getById(userId);
if (user != null) {
blog.setName(user.getNickName());
blog.setIcon(user.getIcon());
}
}
}
四、 学习总结与伏笔
这一节的业务逻辑非常简单,主要考察的是你对 Spring Boot 和 MyBatisPlus 关联查询的处理能力。在不使用复杂 SQL JOIN 连表查询的情况下,通过 Java 代码分步查询并拼装数据,是微服务架构中非常推荐的做法(因为连表查询在分库分表后很难操作)。
⚠️ 留给下一节的巨大悬念:
现在笔记是能正常展示了,但是页面下方还有一个**“点赞”按钮。 如果只是单纯地给点赞数 +1 很容易(直接 Update 数据库即可)。但是,如何保证“一个用户对同一篇笔记只能点赞一次” ?如果用户已经点过赞了,再次打开这个页面时,如何让前端把大拇指图标高亮显示**?
这就意味着,我们在查询笔记详情时,不仅要查作者信息,还要判断当前登录用户有没有点过赞!这就需要 Redis 的强势介入了。