ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-06 19:58:18  阅读:216  来源: 互联网

标签:短评 false Evaluation 数据表 exist import com public 图书


说明:

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

(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表中;


一:正式开发;

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没问题;

 


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

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

标签:短评,false,Evaluation,数据表,exist,import,com,public,图书
来源: https://blog.csdn.net/csucsgoat/article/details/122265692

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有