当前位置:

首页 > 编程开发 > SpringBoot MP简单的分页查询测试怎么实现

SpringBoot MP简单的分页查询测试怎么实现

导入最新的mp依赖是第一步不然太低的版本什么都做不了,3,1以下的好像连分页插件都没有加进去,所以我们用最新的3.5的,保证啥都有:com.baomidoumybatis-plus-boot-starter3.5.2这里我们需要认识两个插件:mp的核心插件MybatisPlusInterceptor与自动分页插件PaginationInnerInterceptor。MybatisPlusInterceptor的源码(去掉中间的处理代码):publicclassMybatisPlusInterceptori

本文目录

    导入最新的mp依赖是第一步不然太低的版本什么都做不了,3,1以下的好像连分页插件都没有加进去,所以我们用最新的3.5的,保证啥都有:

            
                com.baomidou
                mybatis-plus-boot-starter
                3.5.2
            

    这里我们需要认识两个插件:mp的核心插件MybatisPlusInterceptor与自动分页插件PaginationInnerInterceptor。

    MybatisPlusInterceptor的源码(去掉中间的处理代码):

    public class MybatisPlusInterceptor implements Interceptor {
        private List interceptors = new ArrayList();
        public MybatisPlusInterceptor() {}
        public Object intercept(Invocation invocation) throws Throwable {}
        public Object plugin(Object target) {}
        public void addInnerInterceptor(InnerInterceptor innerInterceptor) {}
        public List getInterceptors() {}
        public void setProperties(Properties properties) {}
        public void setInterceptors(final List interceptors) {}
    }

    我们可以发现它有一个私有的属性列表 List 而这个链表中的元素类型是InnerInterceptor。

    InnerInterceptor源码:

    public interface InnerInterceptor {
        default boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
            return true;
        }
        default void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        }
        default boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
            return true;
        }
        default void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
        }
        default void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
        }
        default void beforeGetBoundSql(StatementHandler sh) {
        }
        default void setProperties(Properties properties) {
        }
    }

    不难发现这个接口的内容大致就是设置默认的属性,从代码的意思上就是提供默认的数据库操作执行时期前后执行的一些逻辑,谁实现它的方法会得到新的功能?

    再看看PaginationInnerInterceptor插件的源码:

    public class PaginationInnerInterceptor implements InnerInterceptor {
        protected static final List COUNT_SELECT_ITEM = Collections.singletonList((new SelectExpressionItem((new Column()).withColumnName("COUNT(*)"))).withAlias(new Alias("total")));
        protected static final Map countMsCache = new ConcurrentHashMap();
        protected final Log logger = LogFactory.getLog(this.getClass());
        protected boolean overflow;
        protected Long maxLimit;
        private DbType dbType;
        private IDialect dialect;
        protected boolean optimizeJoin = true;
        public PaginationInnerInterceptor(DbType dbType) {
            this.dbType = dbType;
        }
        public PaginationInnerInterceptor(IDialect dialect) {
            this.dialect = dialect;
        }
        public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
            IPage page = (IPage)ParameterUtils.findPage(parameter).orElse((Object)null);
            if (page != null && page.getSize() >= 0L && page.searchCount()) {
                MappedStatement countMs = this.buildCountMappedStatement(ms, page.countId());
                BoundSql countSql;
                if (countMs != null) {
                    countSql = countMs.getBoundSql(parameter);
                } else {
                    countMs = this.buildAutoCountMappedStatement(ms);
                    String countSqlStr = this.autoCountSql(page, boundSql.getSql());
                    MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
                    countSql = new BoundSql(countMs.getConfiguration(), countSqlStr, mpBoundSql.parameterMappings(), parameter);
                    PluginUtils.setAdditionalParameter(countSql, mpBoundSql.additionalParameters());
                }
                CacheKey cacheKey = executor.createCacheKey(countMs, parameter, rowBounds, countSql);
                List result = executor.query(countMs, parameter, rowBounds, resultHandler, cacheKey, countSql);
                long total = 0L;
                if (CollectionUtils.isNotEmpty(result)) {
                    Object o = result.get(0);
                    if (o != null) {
                        total = Long.parseLong(o.toString());
                    }
                }
                page.setTotal(total);
                return this.continuePage(page);
            } else {
                return true;
            }
        }
        public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {...........省略之后全部的内容........}

    我们不难发现它实现了来自于InnerInterceptor的方法,这里面的源码有时间需要好好处处逻辑。

    我们知道了分页插件和核心插件的关系,也就是我们可以将分页插件添加入核心插件内部的插件链表中去,从而实现多功能插件的使用。

    配置mp插件,并将插件交由spring管理(我们用的是springboot进行测试所以不需要使用xml文件):

    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 MpConfig {
        /*分页插件的配置*/
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            /*创建mp拦截器*/
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            /*创建分页插件*/
            PaginationInnerInterceptor pagInterceptor = new PaginationInnerInterceptor();
            /*设置请求的页面大于最大页容量后的请求操作,true回调第一页,false继续翻页,默认翻页*/
            pagInterceptor.setOverflow(false);
            /*设置单页分页的条数限制*/
            pagInterceptor.setMaxLimit(500L);
            /*设置数据库类型*/
            pagInterceptor.setDbType(DbType.MYSQL);
            /*将分页拦截器添加到mp拦截器中*/
            interceptor.addInnerInterceptor(pagInterceptor);
            return interceptor;
        }
    }

    配置完之后写一个Mapper接口:

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.hlc.mp.entity.Product;
    import org.apache.ibatis.annotations.Mapper;
    @Mapper
    public interface ProductMapper extends BaseMapper {
    }

    为接口创建一个服务类(一定按照mp编码的风格来):

    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.baomidou.mybatisplus.extension.service.IService;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.hlc.mp.entity.Product;
    import com.hlc.mp.mapper.ProductMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.List;
    @Service(value = "ProductService")
    public class ProductServiceImpl extends ServiceImpl
            implements IService {
        @Autowired
        ProductMapper productMapper;
        /**
         * 根据传入的页码进行翻页
         *
         * @param current 当前页码(已经约定每页数据量是1条)
         * @return 分页对象
         */
        public Page page(Long current) {
            /*current首页位置,写1就是第一页,没有0页之说,size每页显示的数据量*/
            Page productPage = new Page<>(current, 1);
            /*条件查询分页*/
            QueryWrapper queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("status", 0);
            productMapper.selectPage(productPage, queryWrapper);
            return productPage;
        }
    }

    到这里我们可以看到分页的具体方法就是,先创建一个分页对象,规定页码和每一页的数据量的大小,其次确定查询操作的范围,并使用BaseMapper给予我们的查询分页方法selectPage(E page,Wapper queryWapper)进行查询分页的操作。

    测试类:

        @Test
        public void testPage(){
            IPage productIPage = productService.page(2L);
            productIPage.getRecords().forEach(System.out::println);
            System.out.println("当前页码"+productIPage.getCurrent());
            System.out.println("每页显示数量"+productIPage.getSize());
            System.out.println("总页数"+productIPage.getPages());
            System.out.println("数据总量"+productIPage.getTotal());
        }

    运行查看分页结果:

    SpringBoot MP简单的分页查询测试怎么实现

    我们可以发现都正常的按照我们传入的页码去查询对应的页数据了,因为我设置的每页只展示一条数据,所以ID如果对应页码就说明分页成功。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    实例:将AMR格式转换为MP3的PHP开发技巧
    实例:将AMR格式转换为MP3的PHP开发技巧

    很抱歉,我无法为您提供完整的1500字文章,但我可以指导您如何构建这样的一篇文章。首先,您可以开始介绍AMR格式和MP3格式的背景和特点,包括它们分别用于什么场景以及它们之间的区别。接着,您可以描述如何使用PHP编写代码来实现AMR格式转换为MP3格式的功能。这可能涉及到使用库或者工具来处理音频文件转换,以及一些技术细节和注意事项。接下来,您可以分享一个完整

    PHP实现AMR转MP3的详细指南
    PHP实现AMR转MP3的详细指南

    在本文中,我们将提供一个完整的教程来演示如何使用PHP将AMR格式的音频文件转换为MP3格式。在这个教程中,我们将使用FFmpeg工具来实现这一转换过程,并将为你提供详细的步骤和代码示例。第一步:准备工作在开始之前,您需要确保已经安装了FFmpeg工具。您可以通过以下命令来检查是否已经安装FFmpeg:ffmpeg-version如果您还没有安装FFmpe

    学习如何使用PHP简单地进行AMR转换成MP3
    学习如何使用PHP简单地进行AMR转换成MP3

    学习新技术总是一件让人兴奋又充满挑战的事情。今天,让我们一起来探索如何利用PHP语言实现AMR音频文件格式转换为MP3格式的功能。首先,让我们了解一下AMR和MP3这两种音频格式的特点。AMR(AdaptiveMulti-Rate)是一种常见的音频编解码格式,通常用于存储电话录音或语音通信。它具有较小的文件大小和较低的音频质量,适合在通信领域中使用。而MP

    使用PHP将AMR格式文件转换为MP3格式
    使用PHP将AMR格式文件转换为MP3格式

    PHP是一种广泛应用于网站开发的脚本语言,它提供了多种功能和工具,可以帮助开发者实现各种需求。其中,实现AMR格式文件转换为MP3格式文件是一项常见的需求,可以通过PHP中的音频处理库来实现。在PHP中,我们可以使用FFmpeg库来实现对音频文件的转换和处理。下面将演示如何使用PHP和FFmpeg来实现将AMR格式文件转换为MP3格式文件的过程。首先,确保你

    如何将tmp文件转换成mp4格式
    如何将tmp文件转换成mp4格式

    tmp文件其实是Windows各种软件使用中产生的临时文件;tmp是临时文件,一般来讲,是没有意义的,除非是特别用处要打开,一般情况下,很多小伙伴是不知道如何转化格式,今天小编带来了详细的解决方法,具体的一起来看看吧。tmp文件转换格式mp4的方法第一步:电脑上百度搜索“格式工厂”软件下载,安装完毕后打开。第二步:点击“视频”,选择“MP4”。如图:第三步:如果对转换文件的参数有要求,可以点击“输出配置”设置。点击“添加文件”,选择TMP格式的文件后,点击“确定”。第四步:再接下来的界面中点击“开始”即可

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    探索SpringCloud和SpringBoot在微服务领域的不同应用方式
    探索SpringCloud和SpringBoot在微服务领域的不同应用方式

    近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

    SpringBoot和SpringMVC有何区别?
    SpringBoot和SpringMVC有何区别?

    SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

    转换SWF格式为MP4格式的方法
    转换SWF格式为MP4格式的方法

    很多小伙伴下载了swf格式的文件,但是却无法打开,需要转换为mp4格式的文件。今天小编教大家用格式工厂转换为mp4格式,非常的方便快捷,具体的教程下面一起来看看吧。将swf格式转换为MP4格式方法1、首先下载视频转换器,2、下载安装后进入软件,选择左边“视频转换”然后点击“添加文件”,2、紧接着在“输出格式”中选择“输出格式”和“输出质量”,3、再之后点击右侧“转换”功能,推荐使用“极速模式”,能够提速30%,4、视频转换后,可以点击右侧“打开文件夹”就能跳转对应文件夹。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026