精华内容
下载资源
问答
  • MyBatis-Plus 分页查询以及自定义sql分页

    万次阅读 多人点赞 2019-06-12 17:53:46
    分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。 物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性...

    一、引言

    分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。

    物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。

    逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。

    那么MP中的物理分页怎么实现呢? 往下看往下看

    二、配置

    创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。

    /**
     * @Auther: IT贱男
     * @Date: 2019/6/12 15:06
     * @Description: MybatisPlus配置类
     */
    @Configuration
    public class MyBatisPlusConfig {
    
        /**
         * 分页插件
         * @return
         */
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }

    三、具体分页实现

    MP的Wrapper提供了两种分页查询的方式,源码如下

        /**
         * 根据 entity 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件
         * @param queryWrapper 实体对象封装操作类
         */
        IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。

        /**
         * 分页查询
         */
        @Test
        public void selectByPage() {
            QueryWrapper<User> wrapper = new QueryWrapper();
            wrapper.like("name", "雨").lt("age", 40);
    
            Page<User> page = new Page<>(1,2);
    
            //IPage<User> userIPage = userMapper.selectPage(page, wrapper);
    
            IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);
    
    
            System.out.println("总页数"+mapIPage.getPages());
            System.out.println("总记录数"+mapIPage.getTotal());
            List<Map<String, Object>> records = mapIPage.getRecords();
            records.forEach(System.out::println);
        }

    以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。

    DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ? 
    DEBUG==> Parameters: %雨%(String), 40(Integer)
    TRACE<==    Columns: COUNT(1)
    TRACE<==        Row: 2
    DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,? 
    DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
    TRACE<==    Columns: id, name, age, email, manager_id, create_time
    TRACE<==        Row: 2, 张雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
    TRACE<==        Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
    DEBUG<==      Total: 2
    总页数1
    总记录数2

    现在我们有需求只要查询数据即可, 不关心总记录数等,如果使用默认的方式就消耗不必要的性能。那么解决办法也是很简单的,只需要在创建page对象时传入第三个参数为false即可

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

    四、自定义sql分页查询

    有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,

    先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。

    步骤一:在mapper文件中,编写对应的分页查询接口。

    步骤二:在xml中编写对应的sql语句,小编这里演示的 “${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。 

        /**
         * 自定义sql分页
         * @param page
         * @param queryWrapper 看这里看这里,如果自定义的方法中需要用到wrapper查询条件,需要这样写
         * @return
         */
        IPage<User> selectMyPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.demo.mapper.UserMapper">
    
        <select id="selectMyPage" resultType="com.example.demo.model.User">
            SELECT * FROM user ${ew.customSqlSegment}
        </select>
    
    </mapper>
       /**
         * 自定义sql分页查询
         */
        @Test
        public void selectByMyPage() {
            QueryWrapper<User> wrapper = new QueryWrapper();
            wrapper.like("name", "雨").lt("age", 40);
            Page<User> page = new Page<>(1,2);
            IPage<User> mapIPage = userMapper.selectMyPage(page, wrapper);
    
            System.out.println("总页数"+mapIPage.getPages());
            System.out.println("总记录数"+mapIPage.getTotal());
            List<User> records = mapIPage.getRecords();
            records.forEach(System.out::println);
        }

    五、多表sql分页查询

    看评论有小伙伴反馈多表连接查询怎么分页,其实道理都是一样的。

    小编以简单的为主,sql如下: his_ipd_encounter、his_user 两张表

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.demo.mapper.UserMapper">
    
        <select id="selectByHisName" resultType="java.lang.String">
            select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
        </select>
        
    
    </mapper>

    mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象

    
    /**
     * <p>
     * 用户 Mapper 接口
     * </p>
     *
     * @author IT贱男
     * @since 2019-06-14
     */
    public interface UserMapper extends MyMapper<User> {
    
    
        /**
         * 多表查询分页
         * @param page
         * @return
         */
        IPage<String> selectByHisName(IPage<User> page);
    }
    

    测试如下:通过查看日志,执行的sql加了分页条件的。

       @Test
        public void select(){
            // 创建分页参数
            Page<User> page = new Page<>(1,2);
            IPage<String> result = userMapper.selectByHisName(page);
            // 获取数据
            List<String> records = result.getRecords();
            records.forEach(System.out::println);
            System.out.println("总页数 = "+ result.getPages());
        }
    
    ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.
    INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)
    select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
    DEBUG==>  Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid 
    DEBUG==> Parameters: 
    TRACE<==    Columns: COUNT(1)
    TRACE<==        Row: 117
    DEBUG==>  Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,? 
    DEBUG==> Parameters: 0(Long), 2(Long)
    TRACE<==    Columns: realname
    TRACE<==        Row: 胡伯云
    TRACE<==        Row: 安元慧
    DEBUG<==      Total: 2
     Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisName
    Execute SQL:
        com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce
    
    胡伯云
    安元慧
    总页数 = 59
    

     

    展开全文
  • MyBatis-Plus 分页查询

    2021-04-08 11:30:57
    创建MybatisPlusConfig配置类,需要配置的分页插件 @Configuration public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } ...

    MyBatis-Plus 分页查询

    1.配置
    创建MybatisPlusConfig配置类,需要配置的分页插件

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

    2.实现代码
    i. 由Service层实现

        /**
         *
         * @param page 当前页
         * @param size 数量/页
         * @return
         */
     @RequestMapping("/test")
        public Object test(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer size){
            QueryWrapper<Student> objectQueryWrapper = new QueryWrapper<>();
            Page<Student> studentPage = new Page<>(page,size);
            IPage<Student> studentIPage = studentMapper.selectPage(studentPage, null);
            return studentIPage;
        }
    

    ii. controller层实现

     @RequestMapping("/getSome")
        public Object getSome(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer size){
            Page<Student> studentPage = new Page<>(page, size);
            return studentService.page(studentPage);
    
        }
    

    3.sql
    执行Sql
    在这里插入图片描述

    展开全文
  • mybatis-plus分页查询

    千次阅读 2020-12-19 11:35:29
    --引入mybatis-plus依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </...

    依赖

    <!--引入mybatis-plus依赖-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.2</version>
    </dependency>
    

    使用

    • 添加分页配置

    @EnableTransactionManagement
    @Configuration
    @MapperScan("com.hash.dao")
    public class MybatisPlusConfig {
    
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
            // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
            // paginationInterceptor.setOverflow(false);
            // 设置最大单页限制数量,默认 500 条,-1 不受限制
            // paginationInterceptor.setLimit(500);
            return paginationInterceptor;
        }
        
    }
    
    • dao层

    public interface UserDao extends BaseMapper<User> {
    
        IPage<User> selectPageText(Page<User> page);
    
    }
    
    
    • service层imp实现类

    @Service
    @Transactional
    public class UserImp extends ServiceImpl<UserDao, User> implements IUserService {
    
        /**
         * 分页查询测试
         *
         * @param page
         * @return
         */
        @Override
        public IPage<User> selectPageText(Page<User> page) {
            return baseMapper.selectPageText(page);
        }
    }
    
    • xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.hash.dao.UserDao">
        <select id="selectPageText" resultType="com.hash.entity.User">
            select *
            from user
            order by created_at desc
        </select>
    </mapper>
    
    • 测试

    @Test
    public void textPage() {
        // 参数一是当前页,参数二是每页个数
        Page<User> userPage = new Page<>(1, 2);
        IPage<User> iPage = userService.selectPageText(userPage);
        System.out.println("总页数:" + iPage.getPages());
        System.out.println("总记录数:" + iPage.getTotal());
        if (iPage.getRecords().size() != 0) {
            List<User> mpUserList1 = iPage.getRecords();
            mpUserList1.forEach(System.out::println);
        } else {
            System.out.println("数据已经加载完成");
        }
    }
    
    展开全文
  • Mybatis-plus分页查询

    2021-06-11 10:43:06
    如果对mybatis-plus基本使用不清楚的可以查看作者文章简单了解下mybatis-plus:https://blog.csdn.net/m0_37298602/article/details/117788047

    如果对mybatis-plus基本使用不清楚的可以查看作者文章简单了解下mybatis-plus:https://blog.csdn.net/m0_37298602/article/details/117788047

    分页配置

    package com.kwin.test.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    
    /**
     * @author : Kwin
     * @version V1.0
     * @Package com.kwin.test.config
     * @Description:
     * @date 2021年06月11日 10:33
     **/
    
    @EnableTransactionManagement(proxyTargetClass = true)
    @Configuration
    public class MybatisPlusConfig {
        
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            return mybatisPlusInterceptor;
        }
        @Bean
        public PaginationInnerInterceptor paginationInterceptor(MybatisPlusInterceptor mybatisPlusInterceptor) {
            // 分页拦截器
            PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
            
            // 请求页面大于最大页后操作,true调回首页,false继续请求 默认false
            paginationInnerInterceptor.setOverflow(false);
            // 单页最大数量限制,默认500, -1不限制
            paginationInnerInterceptor.setMaxLimit(500L);
            mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
            
            return paginationInnerInterceptor;
        }
    }

    测试代码

    package com.kwin.test;
    
    import java.util.List;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.kwin.test.entity.User;
    import com.kwin.test.mapper.UserMapper;
    
    @SpringBootTest
    class TestApplicationTests {
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void test5() {
            IPage<User> userPage = new Page<>(2, 4);//参数一是当前页,参数二是每页个数
    
            userPage = userMapper.selectPage(userPage, null);
            System.out.println("total is " + userPage.getTotal());
            System.out.println("size is " + userPage.getSize());
            System.out.println("current is " + userPage.getCurrent());
            System.out.println("pages is " + userPage.getPages());
            List<User> list = userPage.getRecords();
            for(User user : list){
                System.out.println(user);
            }
        }
    }
    

    结果

     

    展开全文
  • 主要介绍了mybatis-plus分页查询的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了MyBatis-Plus 分页查询以及自定义sql分页的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • MyBatis-Plus分页查询

    千次阅读 2020-03-09 21:59:52
    MyBatis自身提供逻辑分页查询出所有符合条件的数据然后返回需要的部分)浪费内存,速度慢。所以MyBatis-Plus提供物理分页插件。 创建配置类并添加@Configuration注解 创建PaginationInterceptor方法,返回new ...
  • public class MybatisPlusConfig { // 旧版 @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置...
  • mybatis-plus 分页查询

    2021-04-02 11:32:27
    第一步创建 MybatisPlusConfig 分页插件 @Configuration public class MybatisPlusConfig { /** * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false ...
  • mybatis-plus分页查询报错:com.fasterxml.jackson.databind.JsonMappingException: Class cn.cunniao.modules.budgetPlan.entity.BudgetPlan not subtype of [map type; class java.util.Map, [simple type, class ...
  • Mybatis-Plus分页查询+排序分页查询 分页查询MybatisPlusConfig里配置Bean //注册一个页面 @Bean public PaginationInterceptor paginationInterceptor() { // 设置请求的页面大于最大页后操作, true调回到...
  • Mybatis-plus 分页查询

    2020-04-17 09:13:03
    首先需要配置一个组件到容器中: ... public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } 进行分页查询:...
  • 直播app源码,mybatis-plus分页查询实现的相关代码 依赖 <!--引入mybatis-plus依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</...
  • SpringBoot之Mybatis-plus分页查询 1. 添加配置类 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; ...
  • 我们搜索mybatis-plus分页查询,很多都是让我们在配置类里写一个这个东西: @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } 这个东西虽然有用,但是写在...
  • 使用mybatis-plus分页查询,失效,报错Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 36</p>
  • 文章目录一、MyBatis-Plus二、使用步骤1....使用分页查询 一、MyBatis-Plus MyBatis-Plus官网:https://mp.baomidou.com/ MyBatis-Plus (简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBa
  • mybatis-plus分页查询的mapper中的方法 其实非常简单,几行代码的事,话不多说上图
  • 说明:我用的是 Mybatis,只有分页使用的是 mybatis-plus: 1.添加依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> ...
  • MyBatis-Plus is an powerful enhanced toolkit of MyBatis for simplify development. This toolkit provides some efficient, useful, out-of-the-box features for MyBatis, use it can effectively save your ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,561
精华内容 4,624
关键字:

mybatis-plus分页查询