多表联合分页查询(二)---- springboot整合MybatisPlus分页代码

目录

  • 一、分页配置代码解读(使用MP自带分页)
  • 二、Controller层代码解读
  • 三、service层代码解读
  • 四、Mapper层代码解读
  • 五、结果展示

一、分页配置代码解读(使用MP自带分页)

package com.minster.yanapi.Config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}


  1. package com.minster.yanapi.Config;: 声明该Java类所属的包。

  2. import com.baomidou.mybatisplus.annotation.DbType;: 导入 DbType 类,该类是 MyBatis-Plus 中用于表示数据库类型的枚举类。

  3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;: 导入 MybatisPlusInterceptor 类,这是 MyBatis-Plus 提供的拦截器类,用于配置各种插件。

  4. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;: 导入 PaginationInnerInterceptor 类,这是 MyBatis-Plus 提供的分页插件。

  5. import org.springframework.context.annotation.Bean;: 导入 Spring 框架的 @Bean 注解,用于将方法返回的对象注册为 Spring 容器中的 Bean。

  6. import org.springframework.context.annotation.Configuration;: 导入 Spring 框架的 @Configuration 注解,表明这是一个配置类。

  7. @Configuration: 声明这是一个配置类,用于定义配置信息。

  8. public class MybatisPlusConfig {: 定义名为 MybatisPlusConfig 的类。

  9. @Bean: 注解在方法上,表示该方法返回的对象将被注册为一个 Bean。

  10. public MybatisPlusInterceptor mybatisPlusInterceptor() {: 定义一个名为 mybatisPlusInterceptor 的方法,返回一个 MybatisPlusInterceptor 对象。

  11. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();: 创建一个 MybatisPlusInterceptor 对象。

  12. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));: 向拦截器中添加一个内部拦截器,这里添加了一个用于支持MySQL数据库的分页插件。

  13. return interceptor;: 返回配置好的拦截器对象。

二、Controller层代码解读

 @GetMapping()
    public ApiResponse<Page<ArticleResp>> getArticleList(@RequestParam("current") Integer current,
                                                         @RequestParam("pageSize") Integer pageSize) {

        Page<Map<String, Object>> page = new Page<>(current, pageSize);
        return yanArticleService.getArticleList(page);

    }
  • @GetMapping() 注解表示这个方法处理 HTTP GET 请求,并且没有指定具体的路径,即映射到当前路径。这说明该方法应该处理类似于 http://example.com/your-controller-path 这样的请求。

  • public ApiResponse<Page<ArticleResp>> 是方法的返回类型。这个方法返回一个包含 ApiResponse 对象的泛型,而 ApiResponse 的泛型参数是 Page<ArticleResp>,表示返回的数据是分页的文章列表。

  • @RequestParam("current") Integer current@RequestParam("pageSize") Integer pageSize 是用来接收请求中的参数的。current 参数用于指定当前页码,pageSize 参数用于指定每页的条目数量。这两个参数会被Spring自动从请求中获取并传递给方法。

  • Page<Map<String, Object>> page = new Page<>(current, pageSize); 创建了一个 Page 对象,该对象用于表示分页信息,其中 current 是当前页码,pageSize 是每页的条目数量。这里使用了一个泛型为 Map<String, Object>Page 类型。

  • yanArticleService.getArticleList(page); 调用了一个名为 yanArticleService 的服务(Service)的 getArticleList 方法,并传递了前面创建的 Page 对象作为参数。这个方法似乎返回一个 ApiResponse 对象,其中包含了一个分页的文章列表。

三、service层代码解读

 public ApiResponse<Page<ArticleResp>> getArticleList(Page<Map<String, Object>> page) {
        Page<Map<String, Object>> result = yanArticleMapper.getArticleList(page);

        // 将查询结果转换为 Page<YanArticle>
        List<ArticleResp> yanArticles = result.getRecords().stream()
                .map(record -> {
                    ArticleResp articleResp = new ArticleResp();
                    articleResp.setId((Long) record.get("id"));
                    articleResp.setTitle((String) record.get("title"));
                    articleResp.setSummary((String) record.get("summary"));
                    articleResp.setCreateTime((Date) record.get("createTime"));
                    articleResp.setUsername((String) record.get("username"));
                    articleResp.setAvatar((String) record.get("avatar"));
                    articleResp.setLikeCount((Long) record.get("likeCount"));
                    articleResp.setCommentCount((Long) record.get("commentCount"));
                    return articleResp;
                })
                .collect(Collectors.toList());

        Page<ArticleResp> yanArticlePage = new Page<>();
        yanArticlePage.setRecords(yanArticles);
        yanArticlePage.setCurrent(result.getCurrent());
        yanArticlePage.setSize(result.getSize());
        yanArticlePage.setTotal(result.getTotal());
        yanArticlePage.setPages(result.getPages());
        return ApiResponse.success(yanArticlePage);
    }

  • 方法声明了一个返回类型为 ApiResponse<Page<ArticleResp>> 的公共方法,方法名为 getArticleList。方法接收一个 Page<Map<String, Object>> 类型的参数 page,该参数用于表示分页信息。

  • 调用了 yanArticleMappergetArticleList 方法,传递了上面接收的 page 对象作为参数。getArticleList 方法返回一个 Page<Map<String, Object>> 类型的分页结果,其中包含了从数据库中查询到的原始数据。

  • 使用Java 8+的流式处理,对从数据库中查询到的原始数据进行转换。通过 stream() 对结果集进行流式处理,使用 map 将每个原始记录转换为一个 ArticleResp 对象,最后通过 collect(Collectors.toList()) 将转换后的对象集合收集成一个列表。

  • 创建一个新的 Page<ArticleResp> 对象 yanArticlePage,并将上面转换后的文章列表设置为新对象的记录(setRecords),同时将原始分页结果中的页码、每页条目数、总条目数、总页数等信息也设置到新对象中。

  • 最后,使用 ApiResponse.success() 方法将新创建的分页结果对象 yanArticlePage 包装为成功的 ApiResponse 对象,并将其返回。这个方法的最终返回结果是一个带有文章分页信息的成功响应对象。

四、Mapper层代码解读

@Select("SELECT\n" +
            "    a.id,\n" +
            "    a.title ,\n" +
            "    a.summary ,\n" +
            "    a.create_time AS createTime,\n" +
            "    u.username ,\n" +
            "    d.avatar, \n" +
            "    COUNT(DISTINCT c.id) AS likeCount ,\n" +
            "    COUNT(DISTINCT l.id) AS commentCount\n" +
            "FROM\n" +
            "    yan_article a\n" +
            "JOIN\n" +
            "    yan_user u ON a.author_id = u.id\n" +
            "LEFT JOIN\n" +
            "    yan_details d ON u.detail_id = d.id\n" +
            "LEFT JOIN\n" +
            "    yan_comment c ON a.id = c.article_id\n" +
            "LEFT JOIN\n" +
            "    yan_like l ON a.id = l.article_id\n" +
            "GROUP BY\n" +
            "    a.id, a.title, a.summary, a.create_time, u.username, d.avatar")
    Page<Map<String, Object>> getArticleList(Page<Map<String, Object>> page);

SQL语句

SELECT
    a.id,
    a.title ,
    a.summary ,
    a.create_time AS createTime,
    u.username ,
    d.avatar,  -- 不使用前缀
    COUNT(DISTINCT c.id) AS likeCount ,
    COUNT(DISTINCT l.id) AS commentCount
FROM
    yan_article a
JOIN
    yan_user u ON a.author_id = u.id
LEFT JOIN
    yan_details d ON u.detail_id = d.id
LEFT JOIN
    yan_comment c ON a.id = c.article_id
LEFT JOIN
    yan_like l ON a.id = l.article_id
GROUP BY
    a.id, a.title, a.summary, a.create_time, u.username, d.avatar
	

  • @Select 注解表示这是一个查询语句。该语句使用了类似 SQL 的语法,用于从数据库中获取文章列表的相关信息。

  • 查询语句中使用了表别名(如 audcl)来简化表的引用。

  • 查询语句主要涉及以下表:

    • yan_article a: 文章表,用别名 a 引用。
    • yan_user u: 用户表,用别名 u 引用。
    • yan_details d: 用户详情表,用别名 d 引用。
    • yan_comment c: 评论表,用别名 c 引用。
    • yan_like l: 点赞表,用别名 l 引用。
  • 在查询语句中,使用了左连接 (LEFT JOIN) 将文章表与用户表、用户详情表、评论表、点赞表进行关联。

  • 使用 COUNT(DISTINCT c.id) 计算每篇文章的点赞数量,使用 COUNT(DISTINCT l.id) 计算每篇文章的评论数量。

  • 最后,使用 GROUP BY 对文章的相关字段进行分组,包括文章的 idtitlesummarycreate_time、作者的 username 以及作者的头像 avatar

  • 查询结果的字段包括文章的基本信息(idtitlesummarycreateTime)、作者的用户名 (username)、作者的头像 (avatar)、点赞数量 (likeCount) 以及评论数量 (commentCount)。

  • 查询结果以 Page<Map<String, Object>> 的形式返回,其中 Map<String, Object> 表示每一行数据,Page 则表示分页信息。

五、结果展示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 读取txt中的汉字报错

Python读取txt中的汉字报错&#xff1a;UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xa7 in position 4: illegal multibyte sequence 举例&#xff1a; fileE:/0_MyWork/python_programm/children_name/strich7.txtwith open(file, "r") as file_7str…

LeetCode 1637.两点之间不包含任何点的最宽垂直区域

给你 n 个二维平面上的点 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度&#xff0c;而 y 轴上无限延伸的一块区域&#xff08;也就是高度为无穷大&#xff09;。 最宽垂直区…

基于jmeter的性能全流程测试

01、做性能测试的步骤 1、服务器性能监控 首先要在对应服务器上面安装性能监控工具&#xff0c;比如linux系统下的服务器&#xff0c;可以选择nmon或者其他的监控工具&#xff0c;然后在jmeter模拟场景跑脚本的时候&#xff0c;同时启动监控工具&#xff0c;这样就可以获得jm…

抖音视频下载工具|视频内容提取软件

引言部分&#xff1a; 针对抖音视频下载需求&#xff0c;我们团队自豪推出一款功能强大的工具&#xff0c;旨在解决用户获取抖音视频繁琐问题的困扰。我们通过基于C#开发的工具&#xff0c;让用户能够轻松通过关键词搜索实现自动批量抓取视频&#xff0c;并根据需求进行选择性批…

Linux——缓冲区封装系统文件操作

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、FILE二、封装系统接口实现文件操作1、text.c2、mystdio.c3、mystdio.h 一、FILE 因为IO相…

谷歌收购域名花费了100万美元的确让大家眼红

谷歌斥资100万美元购买了该域名。 卖个好价钱确实让大家眼红&#xff0c;但能不能卖到高价就是另一回事了。 首先&#xff0c;据统计&#xff0c;截至2008年底&#xff0c;我国域名总数达到1680万多个&#xff0c;可用的域名资源几乎无法统计&#xff0c;因为英文的组合太多了…

2024.2.25 在centos8.0安装docker

2024.2.25 在centos8.0安装docker 安装过程比较简单&#xff0c;按顺序安装即可&#xff0c;简要步骤&#xff1a; 一、更新已安装的软件包&#xff1a; sudo yum update二、安装所需的软件包&#xff0c;允许 yum 通过 HTTPS 使用存储库&#xff1a; sudo yum install -y …

经典枚举算法

解析&#xff1a; 首先答案肯定是字符串的某个前缀&#xff0c;然后简单直观的想法就是枚举所有的前缀来判断&#xff0c;我们设这个前缀串长度为 lenx &#xff0c;str1 的长度为 len1&#xff0c;str2 的长度为 len2&#xff0c;则我们知道前缀串的长度必然要是两个字符串长…

mac拼图软件有哪些?推荐5款拼图软件

mac拼图软件有哪些&#xff1f;在数字图像处理中&#xff0c;拼图软件扮演着至关重要的角色。对于Mac用户来说&#xff0c;选择一款功能强大、操作简便的拼图软件是提升工作效率和创作体验的关键。本文将为你介绍五款优秀的Mac拼图软件&#xff0c;帮助你轻松完成图片拼接、制作…

代码随想录算法训练营day27|39. 组合总和、40.组合总和II

39. 组合总和 如下树形结构如下&#xff1a; 选取第二个数字5之后&#xff0c;剩下的数字要从5、3中取数了&#xff0c;不能再取2了&#xff0c;负责组合就重复了&#xff0c;注意这一点&#xff0c;自己做的时候没想明白这一点 如果是一个集合来求组合的话&#xff0c;就需…

计算机网络-无线通信网

1.各种移动通信标准 1G&#xff1a;第一代模拟蜂窝&#xff1a;频分双工FDD。2G&#xff1a;第二代数字蜂窝 I.GDM&#xff08;全球移动通信&#xff09;采用TDMA。II.CDMA&#xff08;码分多址通信&#xff09;。2.5G&#xff1a;第2.5代通用分组无线业务GPRS。2.75G&#xf…

Linux--串口屏显示控制实验

一、 实验简介 实验目标&#xff1a;在Linux下通过串口屏显示并控制功能模块的状态和参数 操作系统&#xff1a;Ubuntu 20.04.6 LTS 串口屏&#xff1a;迪文串口屏 DMG48270C043_03W 二、实现代码-- C语言 代码功能就是在Linux下使用串口和TCP&#xff0c;重点在于如何处理好…

linux 文本编辑命令【重点】

目录 vi&vim介绍 vim安装 vim使用 查找命令 find grep 文本编辑的命令&#xff0c;主要包含两个: vi 和 vim vi&vim介绍 作用: vi命令是Linux系统提供的一个文本编辑工具&#xff0c;可以对文件内容进行编辑&#xff0c;类似于Windows中的记事本 语法: vi file…

MySQL锁三部曲:临键、间隙与记录的奇妙旅程

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MySQL锁三部曲&#xff1a;临键、间隙与记录的奇妙旅程 前言临键锁的奥秘间隙锁记录锁 前言 在数据库世界中&#xff0c;锁是维护数据完整性的一种关键机制。而MySQL中的临键锁、间隙锁和记录锁则是锁…

Git笔记——4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、操作标签 二、推送标签 三、多人协作一 完成准备工作 协作开发 将内容合并进master 四、多人协作二 协作开发 将内容合并进master 五、解决 git branch -a…

37、IO进程线程/使用消息队列完成进程间通信20240225

一、使用消息队列完成两个进程间相互通信。 代码&#xff1a; 进程1代码&#xff1a; #include<myhead.h> struct msgbuf {long mtype;//消息类型char mtext[1024];//消息正文 }; //宏定义结构体消息正文大小 #define MSGSIZE (sizeof(struct msgbuf)-sizeof(long)) i…

大学生多媒体课程学习网站thinkphp+vue

开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等开发背景 &#xff08;一&#xff09; 研究课程的提出 &#xff08;二&#xff09;学习网站的分类与界定…

Three.js 基础属性

三维坐标系 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸。 // AxesHelper&#xff1a;辅助观察的坐标系 const axesHelper new THREE.AxesHelper(150); scene.add(axesHelper);材质半透明设置 设置材质半透明…

Vulnhub靶机:Hacker_Kid

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;Hacker_Kid&#xff08;10.0.2.42&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/hac…

Python和Jupyter简介

在本notebook中&#xff0c;你将&#xff1a; 1、学习如何使用一个Jupyter notebook 2、快速学习Python语法和科学库 3、学习一些IPython特性&#xff0c;我们将在之后教程中使用。 这是什么&#xff1f; 这是只为你运行在一个个人"容器"中的一个Jupyter noteboo…