• 【Mybatis-Plus学习笔记(三)】分页查询


    本系列博客其他文章请点击下方链接查看
    【Mybatis-Plus学习笔记】目录

    Mybatis分页

    Mybatis的RowBounds就可以实现分页,但是这是一种内存分页,他的原理是把符合逻辑的内存全部查出,然后展示需要的数据。如果数据量小的时候,完全可以使用,但是当数据量大的时候,就是对内存的一种浪费。

    MP分页插件

    MP分页插件可以实现物理分页,不仅更方便,而且消耗的内存资源更少。

    如果需要新建一个配置类,如下:

    @Configuration
    public class MybatisConfig {
    
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
    

    之后就可以使用selectPage方法,传入Page和QueryWrapper进行查询。例子如下:

            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            //实例化的两个参数分别是当前页和每页数量
            Page<User> page = new Page<>(1, 2);
            IPage<User> ipage = userMapper.selectPage(page, queryWrapper);
            //页数
            System.out.println(ipage.getPages());
            //总数
            System.out.println(ipage.getTotal());
            //获得查询的记录
            List<User> records = ipage.getRecords();
            records.forEach(m-> System.out.println(m));
    

    相当于

    ''DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user LIMIT ?,? 
    ''DEBUG==> Parameters: 0(Long), 2(Long)
    

    还有一种分页查询,selectMapsPage(),与上述方法不同的是返回值是一个Map的集合,通过key-value的形式存储值。如何抉择取决于你的需求。

    实际上,如果你使用Page,MybatisPlus会默认使用SELECT COUNT(1) FROM user 语句来查找总数量,当你不需要总数量的时候,可以在构造page的时候多加一个Boolean参数,true为查找总数,false相反。如下

            Page<User> page = new Page<>(1, 2,false);
    

    多表分页查询

    如果是多表连接查询,上述两种方法,均不可行。但是如果你仍然不想在Sql语句中添加Limit,可以使用Xml文件结合MP分页插件来完成。

    首先,声明一个方法,这个方法需要两个参数Page和Wrapper。

     IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
    

    编写XML

        <select id="selectUserPage" resultType="com.fang.entity.User">
            select *
            from user ${ew.customSqlSegment};
            # 可以添加你想要的连表查询
        </select>
    

    最后,把selectPage换成你自定义的selectUserPage即可。

    但是多表查询还是建议自己写SQL,因为大家要知道无论是Mybatis还是MP,他们都只是一个工具,让我们的代码书写起来更加方便,更加优雅。而真正的SQL语句才是本质,如果盲目的追求工具的使用,就有些本末倒置了。所以在这些工具还是不够智能的情况下,建议多表查询的时候还是使用原生SQL比较好。

  • 相关阅读:
    博弈论(SG函数):HNOI 2007 分裂游戏
    博弈论(二分图匹配):NOI 2011 兔兔与蛋蛋游戏
    博弈论(男人八题):POJ 1740 A New Stone Game
    动态规划(树形DP):HDU 5834 Magic boy Bi Luo with his excited tree
    杂项(最小表示法):HZOI 2015 Glass Beads
    如何避免死锁
    死锁的四个必要条件
    线程安全和可重入函数之间的区别和联系
    信号量 sem_undo设置
    linux管道的容量和内部组织方式
  • 原文地址:https://www.cnblogs.com/zllk/p/14016782.html
Copyright © 2020-2023  润新知