SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

说明:

(1)本篇博客任务:在首页,点击某个图书后,进入该图书的详情页;然后,本篇博客要完成的是,显示下面的短评部分;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

(2)本篇博客:一个新知识:Mybatis-Plus的【@TableField(exist = false)所谓关联查询时,给对象附加对象的策略:这可以让如Evaluation对象去承载evaluation表中没有对应字段的属性;

目录

零:前置分析和说明;

1.图书的评论信息在evaluation表中;

一:正式开发;

1.开发实体类,与底层数据表对应;

2.开发【Mapper接口】;

3.开发mapper接口,对应的【xml】;

4.开发service,调用Dao层代码,完成图书短评的查询工作;

(1)EvaluationService接口; 

(2)EvaluationServiceImpl实现类; 

5.开发Controller,调用Service层的代码;渲染数据,跳转到detail.ftl详情页;

6.1.detail.ftl前端文件,获取短评数据:其实是,获取短评数据的大部分内容;(这儿前端在获取数据的时候,有一个关于业务场景的分析和比对,比较重要!!!)

6.2.detail.ftl前端文件,获取短评数据:其实是,获取短评数据的会员昵称;(遇到了Mybatis-Plus的【@TableField(exist = false),这可以让如Evaluation对象去承载evaluation表中没有对应字段的属性;:新知识,比较重要!!!)

(1)需求说明;

(2)开发查询member会员表的Dao层;

(3)利用Mybatis-Plus的【@TableField(exist = false),在Evaluation中添加Member属性;

(4) 在EvaluationServiceImpl中,调用member的Dao层代码,以给Evaluation的Member属性赋值;

(5)在detail.ftl中,就可以获取Member信息,即获取会员昵称了;

(6)此时的效果;


零:前置分析和说明;

1.图书的评论信息在evaluation表中;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)


一:正式开发;

1.开发实体类,与底层数据表对应;

因为我们要操作evaluation表,所以需要创建一个实体类以应对该表;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

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接口】;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

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】;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

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)设置好对应关系就行了;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

4.开发service,调用Dao层代码,完成图书短评的查询工作;

(1)EvaluationService接口; 

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

在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)其中用到的东西,在前面多次遇到过,这儿再啰嗦一下;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

5.开发Controller,调用Service层的代码;渲染数据,跳转到detail.ftl详情页;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

6.1.detail.ftl前端文件,获取短评数据:其实是,获取短评数据的大部分内容;(这儿前端在获取数据的时候,有一个关于业务场景的分析和比对,比较重要!!!)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

这些写死的<div>,都一样,只是里面写死的信息不一样,我们删的只剩一个;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

说明:

(1)我们修改的内容:

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

其中,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)需求说明;

【如何在获取评论数据时,一起获取该条评论对应的会员昵称信息】,是这儿要解决的问题;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

这种类似的场景,似乎在前面介绍Mybatis对象关联查询时,遇到过类似的需求场景;但是,看下 【MyBatis进阶四:Mybatis对象关联查询;】这篇博客后,就能快速了解Mybatis的关联对象查询到底是什么;

然后, Mybatis的【MyBatis进阶四:Mybatis对象关联查询;】的对象关联查询,和这儿使用Mybatis-Plus的解决策略,是不同的;

……………………………………………………

(2)开发查询member会员表的Dao层;

因为会员信息存储在member表中,所以我们要创建操作member表的一套内容,如下:

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

至此,我们有了可以获取到member表信息的,Dao层的内容;

……………………………………………………

(3)利用Mybatis-Plus的【@TableField(exist = false),在Evaluation中添加Member属性;

这是关键一步:(先别纠结为什么这么做,先看着;;;一会就能明白)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

…………………………………………………… 

(4) 在EvaluationServiceImpl中,调用member的Dao层代码,以给Evaluation的Member属性赋值;

然后,我们就能在EvaluationServiceImpl类中,分别调用【操作book表的Dao】和【操作member表的Dao】,以获取【Book对象】和【Member对象】,然后把这两个对象在赋值为Evaluation对象;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

这样以后,每一条短评Evaluation对象,其Book属性和Member属性就有了正确的值,我们在detail.ftl中就能获取到该条短评的对应的会员的昵称了;

…………………………………………………… 

(5)在detail.ftl中,就可以获取Member信息,即获取会员昵称了;

(下图很容易理解,我就不啰嗦了)

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】)

…………………………………………………… 

(6)此时的效果;

 启动Tomcat,观察效果:OK没问题;

SSM开发书评网18:图书详情页开发二:显示评论列表;(遇到了Mybatis-Plus的【@TableField(exist = false):其可以让对象去承载【数据表没有对应字段的,属性】) 


至此,我们就完成了显示某本图书短评的功能;不过这儿仅仅是显示短评;至于给短评点赞、写短评这些内容在后面介绍;

而且想要点赞短评或写短评,需要用户登录;所以,后面会先介绍会员的注册和登录功能;

上一篇:数论笔记1——整除、带余除法、素数合数


下一篇:@Conditional注解