【SpringBoot】MyBatis与MyBatis-Plus分页查询 & github中的PageHelper

这篇具有很好参考价值的文章主要介绍了【SpringBoot】MyBatis与MyBatis-Plus分页查询 & github中的PageHelper。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        笔者写这篇博客是因为近期遇到的关于两者之间的分页代码差距,其实之前也遇见过但是没有去整理这篇博客,但由于还是被困扰了小一会儿时间,所以还是需要加深记忆。其实会看前后端传参解决这个问题很快、不麻烦。关于这两个框架的分页代码问题主要就是在业务层和MyBatis的SQL问题。注意:这里我不展示前端接口,需要知道的是前端会传给后端当前页(page)以及每页条数(size)。后端根据两个参数去实现分页(limit)。这里最容易踩坑的一个点:在MyBatis的分页中,(当前页需要 - 1) * size传入#{page},而在MyBatis-Plus中的new Page(page,size),则不需要去做运算,在Plus已经做好了这一点。详情请看下面代码块。

MyBatis

        那么关于MyBatis这个半ORM框架来说,SQL还是需要自己去写在xml中的或者是在注解上实现。这里我就采用xml种实现的方式去实现啦。为了减少代码量(真实开发不能这样的哈),我就将所有业务代码都放到控制层中。

引入依赖

<!-- MyBatis框架 -->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.2.2</version>
</dependency>
<!-- JDBC驱动 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.31</version>
</dependency>
<!-- MyBatis的分页插件PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
</dependency>

修改yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/table?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml  # 对应xml的位置
  type-aliases-package: com.chf.entity  # 对应namespace的实体类包名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志类型
    map-underscore-to-camel-case: true  # 字段与属性的驼峰规则

# MyBatis的分页插件 这是最重要的
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countsql

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    //@Autowired
    //private EmpService empService; 
    // 为了博客简化代码量 所以直接调用Dao层接口
    @Autowired
    private EmpMapper empMapper;

    /**
     * 分页查询
     * @param pageNum 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer pageNum, @PathVariable("size") Integer pageSize){
        Integer page = (pageNum - 1) * pageSize;
        List<Emp> empList = empMapper.selectByPage(page, pageSize);
        PageInfo<Emp> pageInfo = new PageInfo<>(empList);
        pageInfo.setTotal(empMapper.selectCount());
        return R.ok(pageInfo);
    }
}
@Mapper
public class EmpMapper{

    List<Emp> selectByPage(@Param("page") Integer pageNum,
                           @Param("size") Integer pageSize);

    Integer selectCount();
}

SQL

<!--返回前端的分页信息 这里的数据表字段名有点不规范-->
<select id="selectByPage" resultType="Emp">
    SELECT
        id,name,sex,idcard,phonenum,depart
    FROM
        emp
    LIMIT
        #{page},#{size}
</select>

<!--返回前端的总记录条数-->
<select id="selectCount" resultType="java.lang.Integer">
    SELECT
        count(*)
    FROM
        emp
</select>

测试返回数据

        返回的分页信息是在data中的list

mybatisplus分页插件和pagehelper,框架及实战,mybatis,spring boot,java

MyBatis-Plus

引入依赖

<!--整合MyBatis
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.3</version>
</dependency>
-->
<!--
	这里需要注意哈:如果使用了MyBatis-Plus的话就不能引入MyBatis依赖 否则会报错
    可能也不是因为两个不能互存 只是版本之间产生了依赖 报错原因如下图所示
-->
<!--数据源配置-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>
<!--MyBatis-Plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<!--JDBC-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

mybatisplus分页插件和pagehelper,框架及实战,mybatis,spring boot,java

修改yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/table?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml  # 对应xml的位置
  type-aliases-package: com.chf.entity  # 对应namespace的实体类包名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志类型
    map-underscore-to-camel-case: true  # 字段与属性的驼峰规则

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    @Autowired
    private EmpService empService; 

    /**
     * 分页查询
     * @param pageNum 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer pageNum, @PathVariable("size") Integer pageSize){
        Page<Emp> page = new Page<>(pageNum, pageSize);
        // 此方法还可以传入第二个参数:QueryWrapper条件构造器
        // 用于增添一些查询条件用的 这里就不做展示了
        empService.page(page);
        // 如果是调用数据访问层的就是selectPage()方法即以下语句
        // mapper.selectPage(page, QueryWrapper);
        return R.ok(page);
    }
}
public interface EmpService extends IService<Emp> {
}
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {
}
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}

测试返回数据

        可以看到在MyBatis-Plus返回前端的参数中使用records封装分页信息。看到这里以为结束了吗?仔细看total(总条数)会发现怎么会是0?还有pages(总页数)也是0,学过MyBatis-Plus应该都知道为了完成分页所以还需要配置分页插件才可以实现真正的分页。所以需要再添加一个配置类,代码如下:

mybatisplus分页插件和pagehelper,框架及实战,mybatis,spring boot,java

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

         添加好分页插件再次查询接口就会看到总条数和总页数都是真实的数值了。

mybatisplus分页插件和pagehelper,框架及实战,mybatis,spring boot,java

PageHelper

        其实MyBatis底层就是调用Github的PageHelper插件工具。但是如果直接使用Github的分页的话会更加简便,但是有一个坑。只需要将上面MyBatis的业务代码改为以下代码块。相比而言,代码行数一致。多了一句PageMethod.startPage()、少了一句设置总条数的语句。

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    //@Autowired
    //private EmpService empService; 
    // 为了博客简化代码量 所以直接调用Dao层接口
    @Autowired
    private EmpMapper empMapper;

    /**
     * 分页查询
     * @param pageNum 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer pageNum, @PathVariable("size") Integer pageSize){
        // 由于PageHelper继承PageMethod但未重写方法 所以写成下面的语句
        Page<Object> page = PageMethod.startPage(pageNum, pageSize);

        // 获取查询出的列表
        List<Emp> empList = empMapper.selectByPage(page, pageSize);
        PageInfo<Emp> pageInfo = new PageInfo<>(empList);
        // pageInfo.setTotal(empMapper.selectCount());

        // 此时page已经有列表信息、与总条数了 无需再一条SQL查询总条数
        return R.ok(page);
    }
}
​

踩坑

        这里的踩坑处就是Page对象一定要在想要查询的列表前先初始出来,否则过滤无效。这样子Paga中的列表信息才是我们想要的查询出来的信息。比如说:业务中我需要查询A、B列表进行拼接啥的。主要是为了返回A列表的数据,所以只有以下两种组合方式(大于号表示业务代码中靠前出现):

        Page > AList > BList。BList > Page > AList。

        关于这个问题。我很好奇的追入源码中阅读。在PageMethod的startPage()中对Page对象进行设置。并且多了一步判断当前线程(ThreadLocal)是否存在Page对象。不存在则创建,存在则直接分页。至于源码追踪请参考这篇文章:Mybatis第三方PageHelper插件分页原理-腾讯云开发者社区-腾讯云文章来源地址https://www.toymoban.com/news/detail-769017.html

public abstract class PageMethod {

    protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();

    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);

        // 判断当前线程中是否存在Page对象(执行排序Order by之后) 
        Page<E> oldPage = getLocalPage(); // (Page)LOCAL_PAGE.get()
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
        }

        setLocalPage(page); // LOCAL_PAGE.set(page);
        return page;
    }

}

到了这里,关于【SpringBoot】MyBatis与MyBatis-Plus分页查询 & github中的PageHelper的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis-Plus分页查询(快速上手运用)

    Mybatis-Plus知识点[MyBatis+MyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客   Mybatis-Plus+SpringBoot结合运用_心态还需努力呀的博客-CSDN博客 MyBaits-Plus中@TableField和@TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作(通过id更新和条件更新)_心态还需努力呀的博

    2024年02月16日
    浏览(53)
  • mybatis-plus分页查询三种方法

    说明: 1、mybatis-plus中分页接口需要包含一个IPage类型的参数。 2、多个实体参数,需要添加@Param参数注解,方便在xml中配置sql时获取参数值。 注意这里我虽然加了@Param但是我并没有使用 这是控制台打印的查询语句,大家发现最后的LIMIT 函数没,正常来说mybatis-plus里是没有写

    2024年01月25日
    浏览(69)
  • mybatis-plus 多表关联条件分页查询

    此处以一对多,条件分页查询为例: 主表 明细表 0.请求dto 1.Controller 层: 注:我的项目中进行了service 读写分类配置,实际使用中,直接使用mybatis-plus中的 IUserService 对应的接口就行。 2.service 层 service impl实现层: 3.mapper 层 4.mapper.xml层 5.测试: 结果body: Q:todo page 分页会把

    2024年02月12日
    浏览(48)
  • Mybatis-Plus分页插件查询慢解决方案

    需求反馈前端界面查询速度很慢。 f12查看接口响应时间达到了5.47s。 查看后端代码逻辑,就是传了些参数,分页查询了一个列表的数据。分页插件使用的是mybatis-plus的分页插件,PaginationInterceptor。 把后端调用的sql单独拿出来在navicat中进行执行,才0.54s左右,其实很快了,数

    2024年02月11日
    浏览(51)
  • 窥探系列之Mybatis-plus XML分页查询

    Page类在mybatisPlus中用于分页查询,继承Pagination类,Pagination类的searchCount字段控制是否查询总记录数 顺着看哪里用到了searchCount: com.baomidou.mybatisplus.plugins.PaginationInterceptor 是mybatisPlus的一个插件,也就是说mybatis是通过插件的方式在分页的时候查询总数; 红圈中使用sql解析包

    2024年02月13日
    浏览(45)
  • springboot使用Mybatis-plus分页插件

    在  pom.xml   文件中添加 MyBatis Plus 和分页插件的依赖: 注意替换  {mybatis-plus-version}  为对应的版本号。 在 Spring Boot 的配置文件  application.yml   中添加分页插件的配置参数: 注意代码中的注释,其中   PaginationInterceptor  表示使用 MyBatis Plus 提供的分页插件。 在接口层使用

    2024年02月07日
    浏览(44)
  • spring boot集成mybatis-plus——Mybatis Plus 多表联查(包含分页关联查询,图文讲解)...

     更新时间 2023-01-03 21:41:38 大家好,我是小哈。 本小节中,我们将学习如何通过 Mybatis Plus 实现 多表关联查询 ,以及 分页关联查询 。 本文以 查询用户所下订单 ,来演示 Mybatis Plus 的关联查询,数据库表除了前面小节中已经定义好的用户表外,再额外创建一张订单表,然后

    2024年02月01日
    浏览(92)
  • SpringBoot 结合 mybatis-plus 实现分页功能

            要实现分页功能方法有很多,但最基本的实现原理都差不多,所以在实现功能之前要先把原理搞明白。正如删除有 “逻辑删除”  和 “物理删除\\\" 之分,分页也有 “逻辑分页” 和 “物理分页”; 1、逻辑分页:逻辑分页依赖于代码。(Mybatis自带的分页插件就是逻

    2024年02月06日
    浏览(44)
  • mybatis-plus技巧--动态表名-多语句-拼接sql--关于mybatis的mysql分页查询总数的优化思考

    传入tableName参数就可以了,不过只能用$不能用# 因为#会发生预编译,然后会在表名上加引号’\\\'。 新建一个表名拦截类实现TableNameHandler mybatisPlus添加插件 实例: 每天按统计 如果表名为count则加上今天的时间 每次设置 直接设置名字,然后就会改变的。 需要在配置文件中的

    2024年01月16日
    浏览(48)
  • Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

    MyBatis-Plus(opens new window) (简称MP) 是一个MyBatis(opens new window)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。想查看官网相关内容的化我这里提供了官网地址:https://baomidou.com/ 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包