返回顶部
首页 > 资讯 > 精选 >SpringBoot MP简单的分页查询测试怎么实现
  • 103
分享到

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

2023-07-05 20:07:14 103人浏览 薄情痞子
摘要

这篇文章主要讲解了“SpringBoot MP简单的分页查询测试怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springBoot MP简单的分页查询测试怎么实现

这篇文章主要讲解了“SpringBoot MP简单的分页查询测试怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springBoot MP简单的分页查询测试怎么实现”吧!

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

        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-boot-starter</artifactId>            <version>3.5.2</version>        </dependency>

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

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

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

我们可以发现它有一个私有的属性列表 List<InnerInterceptor> 而这个链表中的元素类型是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<SelectItem> COUNT_SELECT_ITEM = Collections.singletonList((new SelectExpressionItem((new Column()).withColumnName("COUNT(*)"))).withAlias(new Alias("total")));    protected static final Map<String, MappedStatement> 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<Object> 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;@Configurationpublic class MpConfig {        @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {                MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();                PaginationInnerInterceptor pagInterceptor = new PaginationInnerInterceptor();                pagInterceptor.setOverflow(false);                pagInterceptor.setMaxLimit(500L);                pagInterceptor.setDbType(DbType.MYSQL);                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;@Mapperpublic interface ProductMapper extends BaseMapper<Product> {}

为接口创建一个服务类(一定按照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<ProductMapper, Product>        implements IService<Product> {    @Autowired    ProductMapper productMapper;        public Page<Product> page(Long current) {                Page<Product> productPage = new Page<>(current, 1);                QueryWrapper<Product> queryWrapper = new QueryWrapper<>();        queryWrapper.eq("status", 0);        productMapper.selectPage(productPage, queryWrapper);        return productPage;    }}

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

测试类:

    @Test    public void testPage(){        IPage<Product> 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如果对应页码就说明分页成功。

感谢各位的阅读,以上就是“SpringBoot MP简单的分页查询测试怎么实现”的内容了,经过本文的学习后,相信大家对SpringBoot MP简单的分页查询测试怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: SpringBoot MP简单的分页查询测试怎么实现

本文链接: https://lsjlt.com/news/355102.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot MP简单的分页查询测试怎么实现
    这篇文章主要讲解了“SpringBoot MP简单的分页查询测试怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot MP简单的分页查询测试怎么实现...
    99+
    2023-07-05
  • SpringBoot MP简单的分页查询测试实现步骤分解
    导入最新的mp依赖是第一步不然太低的版本什么都做不了,3,1以下的好像连分页插件都没有加进去,所以我们用最新的3.5的,保证啥都有: <dependency&g...
    99+
    2023-05-14
    SpringBoot MP分页查询测试 SpringBoot分页查询测试
  • SpringBoot中怎么实现分页查询
    在Spring Boot中,可以使用Spring Data JPA来实现分页查询。具体步骤如下: 在Repository接口中定义...
    99+
    2024-03-08
    SpringBoot
  • oracle+mybatis-plus+springboot怎么实现分页查询
    本篇内容主要讲解“oracle+mybatis-plus+springboot怎么实现分页查询”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“oracle+mybatis-plus+springb...
    99+
    2023-06-20
  • SpringBoot+TestNG单元测试怎么实现
    这篇“SpringBoot+TestNG单元测试怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot+...
    99+
    2023-06-08
  • mybatis-plus多表分页查询最佳实现(简单)
    1.简介 在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对...
    99+
    2023-08-23
    mybatis java mysql
  • SpringBoot+TestNG单元测试的实现
    目录背景接口测试用例,针对入参进行设计:言归正传!背景 由于开发任务进度紧张,接口及基础数据提供不全,即使设计全面的接口测试用例也无法全面有效的进行覆盖测试;且又因为单接口测试用例...
    99+
    2024-04-02
  • SpringBoot分页查询功能的实现方法
    目录前言:首先是手动实现分页查询:接下来是关联前端分页和后台数据:总结前言: 学习了SpringBoot分页查询的两种写法,一种是手动实现,另一种是使用框架实现。现在我将具体的实现流...
    99+
    2024-04-02
  • oracle+mybatis-plus+springboot实现分页查询的实例
    今天蠢了一上午才弄出这玩意,话不多说上代码! 1、建一个配置类 package com.sie.demo.config; import com.baomidou.mybati...
    99+
    2024-04-02
  • Ajax怎么实现分页查询
    这篇文章给大家分享的是有关Ajax怎么实现分页查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。要求:获取数据库中大量的信息显示在页面上,必然要使用到分页查询;若不使用Ajax,...
    99+
    2024-04-02
  • Mybatis分页查询怎么实现
    小编给大家分享一下Mybatis分页查询怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们实现查询除了@org.junit.Test  ...
    99+
    2023-06-28
  • Vue分页查询怎么实现
    我编写了一个简单的前端页面用来查询数据,页面一共有几个逻辑 具体的效果可以看下面的演示 下面就来看一下具体的实现步骤。 首先看一下vue的代码 <script type="...
    99+
    2023-05-15
    Vue分页查询实现 Vue分页功能
  • oracle怎么实现分页查询
    在Oracle中,可以通过使用ROWNUM和子查询来实现分页查询。以下是一个示例:```sqlSELECT * FROM (SELECT column1, column2, ..., ROWNUM AS rnFROM y...
    99+
    2023-08-11
    oracle
  • sql分页查询怎么实现
    sql 分页查询的实现 什么是分页查询? 分页查询是指将大型数据集分割成较小的、易于管理的部分,这些部分称为 "页面"。 如何实现 SQL 分页查询 在 SQL 中实现分页查询通常使用以...
    99+
    2024-05-30
  • mysql分页查询怎么实现
    mysql 分页查询可将查询结果划分为页面,一次只加载一页,实现步骤包括:确定每页记录数。计算偏移量:偏移量 = (页码 - 1) * 每页记录数。使用 limit 和 offset 子...
    99+
    2024-08-01
    mysql
  • Springboot+Mybatis怎么实现分页加条件查询功能
    本篇内容介绍了“Springboot+Mybatis怎么实现分页加条件查询功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!User.xml...
    99+
    2023-06-30
  • php怎么实现简单的查询功能
    要实现简单的查询功能,可以使用PHP和MySQL数据库进行操作。以下是一个简单的例子:1. 首先,连接到MySQL数据库:```ph...
    99+
    2023-09-07
    php
  • sql中怎么实现分页查询
    本篇文章为大家展示了sql中怎么实现分页查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.创建测试环境,(插入100万条数据大概耗时5分钟)。create&nb...
    99+
    2024-04-02
  • SQLSERVER中怎么实现分页查询
    SQLSERVER中怎么实现分页查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一种方案、最简单、普通的方法:复制代码 代...
    99+
    2024-04-02
  • MSSQLServer中怎么实现查询分页
    本篇文章给大家分享的是有关MSSQLServer中怎么实现查询分页,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。select top...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作