3.开发社区首页

news2024/9/25 7:26:15

数据库设计如下:

 

任务:开发社区首页,显示前十个帖子;开发分页组件,分页显示所有帖子。

开发流程:entity->dao->mapper.xml->service->controller

由于关注后端,所以未使用前后分离且记录过程关注后端

(1)创建DiscussPost实体类;

        即帖子实体类。

(2)创建DiscussPostMapper接口;

/**
     * 分页查询帖子
     *
     * @param userId
     * @param offset 每一页 起始行的行号
     * @param limit
     *  orderMode 如果传入1按照热度来排
     * @return
     */
    List<DiscussPost> selectDiscussPosts(
            @Param("userId") int userId,
            @Param("offset") int offset,
            @Param("limit") int limit);

    /**
     * 查询用户的帖子 @Param注解用于给定参数取别名
     * 如果需要动态拼接SQL:即 只有一个参数+在<if></if>里面使用,则必须加别名
     *
     * @param userId
     * @return
     */
    int selectDiscussPostRows(@Param("userId") int userId);

        selectDiscussPosts(int userId, int offset, int limit)方法的userId参数是为了方便按用户id查询该用户发的帖子,正常使用是用不到userId,所以后面写sql用动态sql选择性的添加userId,offset是每页起始行行号,limit是每页最多显示多少数据。
        int selectDiscussPostRows(@Param(“userId”) int userId)是查询一共多少行,这里的参数userId和前一个方法一样,写sql语句用动态sql,另外,如果方法只有一个参数,并且在动态sql的if里使用,则参数前必须加@Param起别名

(3)编写discusspost-mapper.xml

<sql  id="selectFields">
        id,user_id,title,content,type,status,create_time,comment_count,score
    </sql>

    <select id="selectDiscussPosts" resultType="DiscussPost">
        select<include refid="selectFields"></include>
        from discuss_post
        where status !=2
        <if test="userId!=0">
            and user_id = #{userId}
        </if>
        order by type desc,create_time desc
        limit #{offset},#{limit}
    </select>
    
    <select id="selectDiscussPostRows" resultType="int">
        select count(id)
        from discuss_post
        where status !=2
        <if test="userId!=0">
            and user_id = #{userId}
        </if>
    </select>

        当返回类型为List<自定义类型>时,requestType=“自定义类型”,list是java自带的可以解析出来,不用声明;

        order by type desc, create_time desc是优先按类型倒序排序,类型相同按照产生时间倒序排序;
        limit #{offset}, #{limit} 是分页,offset是每页起始行行号,limit是每页最多显示多少数据;

(4)编写DiscussPostService

@Service
public class DiscussPostService {

    @Autowired
    private DiscussPostMapper discussPostMapper;

    public  List<DiscussPost> findDiscussPosts(int userId,int offset,int limit){
        return discussPostMapper.selectDiscussPosts(userId,offset,limit);
    }

    public int findDiscussPostRows(int userId){
        return discussPostMapper.selectDiscussPostRows(userId);
    }
}

虽然能容基本重复,但不能COntroller 直接调用DAO 以防业务扩展、 跨层调用涉及到安全性问题。

(5)编写HomeController

public class HomeController {

    @Autowired
    private UserService userService;

    @Autowired
    private DiscussPostService discussPostService;

    @RequestMapping(path = "/index",method = RequestMethod.GET)
    public String getIndexPage(Model model, Page page){
        //方法调用前 SpringMVC 会自动实例化Model和Page 并将Page注入Model
        //所以在thyeleaf中可以直接访问page的数据
        page.setRows(discussPostService.findDiscussPostRows(0));
        page.setPath("/index");

        List<DiscussPost> list = discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit()) ;
        List<Map<String,Object>>  discussPosts = new ArrayList<>();
        if(list != null){
            for(DiscussPost eachPost :list){
                Map<String,Object> map = new HashMap<>();
                map.put("post",eachPost);
                User user = userService.findUserById(eachPost.getUserId());
                map.put("user",user);
                discussPosts.add(map);
            }
        }
        model.addAttribute("discussPosts",discussPosts);
        return "/index";
    }
}

        方法在调用前,springmvc会自动实例化model和page,同时会把page注入到model中,因此后面可以不用向model中使用addAttribute添加page。

        userid为外键,但查询到的帖子后要显示用户名,该如何操作?

  •  直接在在SQL关联查询用户表,获取username
  • 单独得到userid后 再去调用方法查询 username 而后组合在一起  

选择后者 :使用redis 性能会高  代码清晰 好修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Potplayer】如何用Potplayer实现对视频的局部缩放播放?如何用potplayer更舒心地播放竖屏视频?

一、问题背景 有时候我们从互联网上下载得到一个竖屏视频&#xff0c;用电脑播放时&#xff0c;左右两边都是黑的&#xff0c;电脑屏幕的高宽度没有得到良好应用。而如果恰好这个竖屏视频其实只有一小部分才是有效区域/重点内容&#xff0c;比如中央区域&#xff0c;上下区域都…

win10怎么玩经典扫雷?繁星软件园推荐大家试试Windows7Games吧,亲测好用的扫雷Win10电脑版下载!!!

扫雷Win10电脑版(Windows7Games)是专门为微软最新版本的Windows 10/11操作系统打造的一款非常不错的消除类PC休闲小游戏安装包&#xff0c; Windows7Games游戏安装包为中文版&#xff0c;包含经典扫雷、空当接龙、红心大战、国际象棋等微软低版本操作系统Windows自带的多款超级…

我的硕士前半生

本篇文章属于随笔类&#xff0c;它可能无法对你起到直接帮助&#xff0c;它只是我这个普通学生一年半以来的一些足迹与思考。本文首发于我的个人博客 Forever Young 我的本科像硕士&#xff0c;有实验室有工位&#xff0c;桌子超级大&#xff0c;有老师带有学长可以问。 我的硕…

分享122个ASP源码,总有一款适合您

ASP源码 分享122个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 122个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1-hwBdIxuv1NvpapRJsGAcQ?pwdgs1l 提取码&#x…

设计模式_行为型模式 -《迭代器模式》

设计模式_行为型模式 -《迭代器模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 定义 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 结构 迭代器…

手撕Pytorch源码#3.Dataset类 part3

写在前面手撕Pytorch源码系列目的&#xff1a;通过手撕源码复习了解高级python语法熟悉对pytorch框架的掌握在每一类完成源码分析后&#xff0c;会与常规深度学习训练脚本进行对照本系列预计先手撕python层源码&#xff0c;再进一步手撕c源码版本信息python&#xff1a;3.6.13p…

Couplet | 用Python写一副对联送给诸位科研汪!~

1写在前面 小伙伴们大家新年好啊&#xff01;&#xff01;&#xff01;&#x1f970; 又是一年新春到&#xff0c;玉兔祝福要记牢&#xff1a;蹦蹦跳跳身体棒&#xff0c;平平淡淡精神爽&#xff0c;红红火火财运旺&#xff0c;和和气气朋友广&#xff0c;简简单单幸福长。&…

Windows SDK编程 初学笔记

#include "windows.h"int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) {MessageBox(NULL, TEXT("来见见世面"), TEXT("Say Hi"), MB_OK);return 0; } MessageBox第一个参数为句柄&#xff0c;第…

Socket通信

什么是Socket?

Java基础——运算符与表达式

目录 Eclipse下载 安装 使用 运算符 键盘录入 Eclipse下载 安装 使用 Eclipse的概述(磨刀不误砍柴工)——是一个IDE(集成开发环境)Eclipse的特点描述&#xff08;1&#xff09;免费 &#xff08;2&#xff09;纯Java语言编写 &#xff08;3&#xff09;免安装 &#xff08…

【手把手教你学51单片机】

注&#xff1a;本文章转载自《手把手教你学习51单片机》&#xff01;因转载需要原文链接&#xff0c;故无法选择转载&#xff01; 如若侵权&#xff0c;请联系我进行删除&#xff01;上传至网络博客目的为了记录自己学习的过程的同时&#xff0c;同时能够帮助其他一同学习的小伙…

AJAX Axios 总结

AJAX & Axios1. AJAX1.1 作用①与服务器进行数据交换②异步交互异步和同步1.2 基本使用1.3 案例SelectUserServlet&#xff1a;register.html&#xff1a;register.html中的<script2. Axios异步框架2.1 基本使用2.2 案例axiosServlet&#xff1a;axios-demo.html&#x…

Elasticsearch7.8.0版本高级查询—— 聚合查询文档

目录一、初始化文档数据二、聚合查询文档2.1、概述2.2、对某个字段取最大值 max 示例2.3、对某个字段取最小值 min 示例2.4、对某个字段求和sum 示例2.5、对某个字段取平均值 avg 示例2.6、对某个字段的值进行去重之后再取总数 示例三、State 聚合查询文档3.1、概述3.2、示例一…

目标检测论文解读复现【NO.24】改进 YOLOv5s 的轨道障碍物检测模型轻量化研究

前言此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;…

Cadence PCB仿真使用Allegro PCB SI生成反射仿真报告及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 本文简单介绍使用Allegro PCB SI生成网络的反射性能评估的报告的方法,及反射报告要点导读。 2,生成报告 第1步,选择需要生成报告的网络,然后单击右…

(侯捷C++)1.2面向对象高级编程(上)

1.整体结构 2.三大函数&#xff1a;拷贝构造&#xff0c;拷贝赋值&#xff0c;析构 拷贝构造&#xff1a;第一次出现对象&#xff0c;使用拷贝构造进行创建&#xff0c;例如&#xff1a;String s3(s1)。拷贝赋值&#xff1a;对象已经构造&#xff0c;重新赋值&#xff0c;例如…

人工智能辅助药物发现(4)药物重定位

目录药物重定位概述药物重定位数据库表示学习基于序列的表示学习基于图的表示学习药物重定位深度学习以靶点为中心以疾病为中心药物重定位的应用药物重定位概述 新药物的研发投资巨大&#xff0c;周期漫长。从获批准的临床药物中有效识别新的适应药物在药物发现中起到重要作用…

cc123 靶场测试笔记

1.cc123 靶场介绍本靶场存在四个 flag 把下载到的虚拟机环境导入到虚拟机&#xff0c;本靶场需要把网络环境配置好。1.1.网络示意图2. 信息收集2.1.主机发现sudo netdiscover -i eth0 -r 192.168.0.0/242.2.masscan 端口扫描sudo masscan -p 1-65535 192.168.1.102 --rate10002…

Elasticsearch7.8.0版本高级查询—— 高亮查询文档

目录一、初始化文档数据二、高亮查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; { "name":"zhangsan", "ag…

<Python的文件>——《Python》

目录 1.文件 1.1 文件是什么 1.2 文件路径 1.3 文件操作 1.3.1 打开文件 1.3.2 关闭文件 1.3.3 写文件 1.3.4 读文件 1.3.5 关于中文的处理 1.4 使用上下文管理器 1.文件 1.1 文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失.…