说明:
(1)本篇博客任务:在首页,点击某个图书后,进入该图书的详情页;然后,本篇博客要完成的是,显示下面的短评部分;
(2)本篇博客:一个新知识:Mybatis-Plus的【@TableField(exist = false)所谓关联查询时,给对象附加对象的策略:这可以让如Evaluation对象去承载evaluation表中没有对应字段的属性;
目录
4.开发service,调用Dao层代码,完成图书短评的查询工作;
5.开发Controller,调用Service层的代码;渲染数据,跳转到detail.ftl详情页;
6.1.detail.ftl前端文件,获取短评数据:其实是,获取短评数据的大部分内容;(这儿前端在获取数据的时候,有一个关于业务场景的分析和比对,比较重要!!!)
(3)利用Mybatis-Plus的【@TableField(exist = false),在Evaluation中添加Member属性;
(4) 在EvaluationServiceImpl中,调用member的Dao层代码,以给Evaluation的Member属性赋值;
(5)在detail.ftl中,就可以获取Member信息,即获取会员昵称了;
零:前置分析和说明;
1.图书的评论信息在evaluation表中;
一:正式开发;
1.开发实体类,与底层数据表对应;
因为我们要操作evaluation表,所以需要创建一个实体类以应对该表;
Evaluation实体类:
package com.imooc.reader.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.util.Date; @TableName("evaluation") public class evaluation { @TableId(type = IdType.AUTO) private Long evaluationId; private Long bookId; private String content; private Integer score; private Long memberId; private Date createTime; private Integer enjoy; private String state; private String disableReason; private Date disableTime; public Long getEvaluationId() { return evaluationId; } public void setEvaluationId(Long evaluationId) { this.evaluationId = evaluationId; } public Long getBookId() { return bookId; } public void setBookId(Long bookId) { this.bookId = bookId; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public Long getMemberId() { return memberId; } public void setMemberId(Long memberId) { this.memberId = memberId; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Integer getEnjoy() { return enjoy; } public void setEnjoy(Integer enjoy) { this.enjoy = enjoy; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getDisableReason() { return disableReason; } public void setDisableReason(String disableReason) { this.disableReason = disableReason; } public Date getDisableTime() { return disableTime; } public void setDisableTime(Date disableTime) { this.disableTime = disableTime; } }
说明:
(1)这个没什么好说的,前面介绍过好多次了,保证属性和evaluation表的表字段名一致,别写错就行了;
(2)Date类型的属性,其类型是【java.util.Date】,别弄错了;
2.开发【Mapper接口】;
EvaluationMapper接口:
package com.imooc.reader.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.imooc.reader.entity.Evaluation; public interface EvaluationMapper extends BaseMapper<Evaluation>{ }
说明:
(1)千万别忘记书写泛型;
3.开发mapper接口,对应的【xml】;
evaluation.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.imooc.reader.mapper.EvaluationMapper"> </mapper>
说明:
(1)设置好对应关系就行了;
4.开发service,调用Dao层代码,完成图书短评的查询工作;
(1)EvaluationService接口;
在EvaluationService接口中,定义一个根据图书编号,查询图书短评的方法;
package com.imooc.reader.service; import com.imooc.reader.entity.Evaluation; import java.util.List; public interface EvaluationService { /** * 按图书编号查询图书的有效短评 * @param bookId 图书编号 * @return 短评的List */ public List<Evaluation> selectByBookId(Long bookId); }
(2)EvaluationServiceImpl实现类;
package com.imooc.reader.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.imooc.reader.entity.Evaluation; import com.imooc.reader.mapper.EvaluationMapper; import com.imooc.reader.service.EvaluationService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; @Service @Transactional(propagation = Propagation.NOT_SUPPORTED,readOnly = true) public class EvaluationServiceImpl implements EvaluationService { @Resource EvaluationMapper evaluationMapper; /** * 按图书编号查询图书的有效短评 * * @param bookId 图书编号 * @return 短评的List */ public List<Evaluation> selectByBookId(Long bookId) { QueryWrapper<Evaluation> queryWrapper = new QueryWrapper<Evaluation>(); queryWrapper.eq("bookId", bookId); queryWrapper.eq("state", "enable"); queryWrapper.orderByDesc("create_time"); List<Evaluation> evaluationList = evaluationMapper.selectList(queryWrapper); return evaluationList; } }
说明:
(1)前面说过,【Alt+Enter】可以快速生成接口的实现类;
(2)其中用到的东西,在前面多次遇到过,这儿再啰嗦一下;
5.开发Controller,调用Service层的代码;渲染数据,跳转到detail.ftl详情页;
6.1.detail.ftl前端文件,获取短评数据:其实是,获取短评数据的大部分内容;(这儿前端在获取数据的时候,有一个关于业务场景的分析和比对,比较重要!!!)
这些写死的<div>,都一样,只是里面写死的信息不一样,我们删的只剩一个;
说明:
(1)我们修改的内容:
其中,FreeMarker设置日期格式可以快速参考【FreeMarker三:FreeMarker基本语法:取值】;
(2)一个疑问:(比较重要)
● 问题: 在【SSM开发书评网14:图书列表分页及查询四:图书分页查询(3);(JS模板引擎Art-Template入门;星型评分插件raty入门)】中,我们开发首页时,首页的图书信息,我们是这样做的:【前提,我们首先设置一个<div>容器,把这个容器作为盛放图书信息的容器】→【首先,当后端的图书数据过来后,这些数据是List】→【遍历这些List,每获取一条图书数据,就通过Art-Template定义模板,把这条数据渲成HTML片段】→【然后,把这端HTML,追加到那个容器中】;:为什么在前面显示图书信息这篇博客中,我们这样做;而,在这儿,我们显示短评信息时,我们直接<#list>遍历显示就行了?
● 个人理解:
首先,在前面显示图书信息的那篇博客中,首页上我们每次点击【点击加载更多…】按钮,就在首页上多显示一点数据;即显示图书信息时,图书信息不是一次就显示完的,,所以,我们定义了一个Art-Template模板,每次新图书数据来的时候,就通过这个模板生成一段HTML,然后把这段HTML追加到显示图书的容器中;
然后,本篇博客的显示短评信息,就是一锤子买卖,一次就能把某本图书的所有短评信息全部加载过来;自然,为了解决这个需求,完全不需要定义Art-Template模板,只要<#list>遍历数据,显示就行了;
● 总结:通过,这个不同业务情况下的不同的处理策略;应该能够帮助自己提升业务开发和业务决策能力;
6.2.detail.ftl前端文件,获取短评数据:其实是,获取短评数据的会员昵称;(遇到了Mybatis-Plus的【@TableField(exist = false),这可以让如Evaluation对象去承载evaluation表中没有对应字段的属性;:新知识,比较重要!!!)
(1)需求说明;
【如何在获取评论数据时,一起获取该条评论对应的会员昵称信息】,是这儿要解决的问题;
这种类似的场景,似乎在前面介绍Mybatis对象关联查询时,遇到过类似的需求场景;但是,看下 【MyBatis进阶四:Mybatis对象关联查询;】这篇博客后,就能快速了解Mybatis的关联对象查询到底是什么;
然后, Mybatis的【MyBatis进阶四:Mybatis对象关联查询;】的对象关联查询,和这儿使用Mybatis-Plus的解决策略,是不同的;
……………………………………………………
(2)开发查询member会员表的Dao层;
因为会员信息存储在member表中,所以我们要创建操作member表的一套内容,如下:
至此,我们有了可以获取到member表信息的,Dao层的内容;
……………………………………………………
(3)利用Mybatis-Plus的【@TableField(exist = false),在Evaluation中添加Member属性;
这是关键一步:(先别纠结为什么这么做,先看着;;;一会就能明白)
……………………………………………………
(4) 在EvaluationServiceImpl中,调用member的Dao层代码,以给Evaluation的Member属性赋值;
然后,我们就能在EvaluationServiceImpl类中,分别调用【操作book表的Dao】和【操作member表的Dao】,以获取【Book对象】和【Member对象】,然后把这两个对象在赋值为Evaluation对象;
这样以后,每一条短评Evaluation对象,其Book属性和Member属性就有了正确的值,我们在detail.ftl中就能获取到该条短评的对应的会员的昵称了;
……………………………………………………
(5)在detail.ftl中,就可以获取Member信息,即获取会员昵称了;
(下图很容易理解,我就不啰嗦了)
……………………………………………………
(6)此时的效果;
启动Tomcat,观察效果:OK没问题;
至此,我们就完成了显示某本图书短评的功能;不过这儿仅仅是显示短评;至于给短评点赞、写短评这些内容在后面介绍;
而且想要点赞短评或写短评,需要用户登录;所以,后面会先介绍会员的注册和登录功能;