【什么是分页查询,项目实战中如何去用】MyBatis-Plus的用插件的简单分页查询的和多表自定义分页查询(mybatis的条件查询-动态sql)


前言

本文仅作为自己工作学习过程中的记录.
如有错误和纰漏欢迎指出.
       我先说说为什么会遇到这样的问题,需要学习MyBatis-Plus分页.
       这是本新手程序员写的第一篇文章,在写这篇文章的时候,我是大四,刚找到工作开始实习不久.是信息类专业突然转来做Java后端开发,所有相关的知识学的都比较短,比较着急,我原本其他语言的基础开可以,但是只学了一个星期的JAVA,然后过了下Springboot的项目,和相关的知识,例如mybatis,都是草草的过了一遍,了解了一下,包括sql数据库学的也不是很扎实.好歹底子还不错,学起来比较快,面试也准备的比较认真, 秋招前找到了一家公司,面试通过开始实习.
       在摸鱼了不到两天,很快,我的指导老师让我接触到了项目组正在做的项目.也可能是为了探探底,让我先写点东西.看看我能写到什么程度.
       让我写项目里一些边角料的活,就把已经做好了查询的部分,写一个分页,项目组的项目用的是mybatis-plus,指导老师问我会不会.其实我是看过的,过过一遍的,但是包括mybatis本身,我都不怎么熟练.我就只能先含糊一下.我说之前只学了mybatis,我也都只粗略了解过,可以试试,然后自己查查.
       然后发现网上其实很多讲分页查询的说的感觉都不是很清楚,或者说对于基础比较差的人来说,没那么容易看懂.
       那时候我自然也没写出来,因为是多表联查的,要手动写sql.在后来几天,我自己边工作边学习,也查了资料,跟着学习视频做项目,基础补的更扎实了一点.我在来回头看我刚来公司那几天遇到的问题.我觉得不行,我得记录一下,也算是一种经验.


一、从最基础的方面来说,什么是分页查询?

对于数据库基础不是很好的人来说,可能上来就对这个概念比较模糊.
说白了,对于mysql语言来说 就是 limit
举个例:

select * from emp limit 2 --列出前两条
select * from emp limit 1,2 --从第二条开始,展示2条记录
select * from emp limit 0,3 --从第一条开始,展示3条记录--前三条

这个是mysql里分页查询的简单操作,更详细可以去查查讲sql语句的文章,这里不细讲
而在项目实战中,例如用到mybtis连接数据库,我们去做分页查询,通常还是要传参,加上查询的条件,而用到mybtisPlus通常不需要我们写sql语句,也会有其他更便捷的写法。

二、在Mybatis-Plus里简单实现最基础的分页查询

1.简单的无查询条件的分页查询,使用mybatis-plus自带的分页插件

首先在一个springMVC项目中,如果我们要用的是mybatisPlus连接数据库的话。
要做分页查询的话,最简单最便捷的肯定是直接用分页插件,
在启动类中注入分页Bean

    /**
     * 分页插件
     * */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }

以我手上正在学习和参考的视频里的教学项目为例(后面会放地址连接):
简单介绍是一个对老师的表进行分页查询,具体里面的东西不详细列出来,请忽略掉我例子里面类对象的本身,我只是以这个接口进行细讲

    @ApiOperation(value = "讲师的分页查询")
    @GetMapping("pageTeacher/{current}/{limit}")
    public R pageListTeacher(@PathVariable long current,@PathVariable long limit){
        //创建一个page对象
        Page<EduTeacher> pageTeacher = new Page<>(current,limit);
        eduTeacherService.page(pageTeacher,null);
        //这个为null的参数是具体的查询条件,在这里没有,所以是null
        long total = pageTeacher.getTotal();//总记录数
        List<EduTeacher> records = pageTeacher.getRecords();//数据list集合
        return R.ok().data("total",total).data("rows",records);
    }

以这个接口为例,在Get请求里,传了2个参数,{current}和{limit},其实他们可以理解为,在sql里面用limit(上面有例子)

select * from emp limit 1,2 --从第二条开始,展示2条记录

这里面的(1,2) {current}=1,{limit}=2,就是这样的效果.
下面

        //创建一个page对象
        Page<EduTeacher> pageTeacher = new Page<>(current,limit);
        eduTeacherService.page(pageTeacher,null);
        //这个为null的参数是具体的查询条件,在这里没有,所以是null

到这一步,分页已经做完了,在例子中后面只是输出的部分,不用考虑.
一共就2行(2步).
首先,是new了一个page<>对象,然后把我们的参数传进去,达到sql里分页的效果
第二步
这个Service.page 这个page就是分页插件提供的方法,
前面一个参数是上面new的分页对象,后面一个参数是对他的查询条件,因为这里我们没有查询条件,所以直接是null.
想要详细理解它,我会在下面部分接着讲.
然后顺便看看它的源码.

2.如果我们的分页查询是有查询条件的

首先,看看上面提到的Service.page的方法,这个是分页插件提供的方法,我们看看源码

public IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper) {
        return this.baseMapper.selectPage(page, queryWrapper);
    }

可以看到,第一个参数是我们的分页对象page没有问题,第二个参数是个Wrapper queryWrapper
我们正常在用mybatis-plus写查询的时候,是不是就用过,是一样的东西,下面我举个例子.

@ApiOperation(value = "讲师的条件查询+分页")
    @PostMapping("pageTeacherCondition/{current}/{limit}")
    public R pageListTeacherCondition(@PathVariable long current, @PathVariable long limit,
                                      @RequestBody(required = false) TeacherQuery teacherQuery){
        Page<EduTeacher> pageTeacher = new Page<>(current,limit);

        //构建查询条件
        String name = teacherQuery.getName();
        Integer level = teacherQuery.getLevel();
        String begin = teacherQuery.getBegin();
        String end = teacherQuery.getEnd();
//        QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
//        if(!StringUtils.isNullOrEmpty(name)) {
//            //构建条件
//            wrapper.like("name",name);
//        }
//        if(!StringUtils.isNullOrEmpty(String.valueOf(level))) {
//            wrapper.eq("level",level);
//        }
//        if(!StringUtils.isNullOrEmpty(begin)) {
//            wrapper.ge("gmt_create",begin);
//        }
//        if(!StringUtils.isNullOrEmpty(end)) {
//            wrapper.le("gmt_create",end);
//        }
        LambdaQueryWrapper<EduTeacher> queryWrapper = new LambdaQueryWrapper<EduTeacher>()
                .like(!StringUtils.isNullOrEmpty(name),EduTeacher::getName,name)
                .eq(level != null,EduTeacher::getLevel,level)
                .ge(!StringUtils.isNullOrEmpty(begin),EduTeacher::getGmtCreate,begin)
                .le(!StringUtils.isNullOrEmpty(end),EduTeacher::getGmtCreate,end);
        //多条件组合查询
        //动态sql
        eduTeacherService.page(pageTeacher,queryWrapper);
        
        long total = pageTeacher.getTotal();//总记录数
        List<EduTeacher> records = pageTeacher.getRecords();//数据list集合
        return R.ok().data("total",total).data("rows",records);
    }

这是上面那个简单的分页查询稍微改了一下,在分页的基础上 加了个多条件组合查询.
写了一个TeacherQuery的类专门用来查询,queryWrapper也有很多种写法.
总结:

 eduTeacherService.page(pageTeacher,queryWrapper);

在这个service.page的方法,前一个参数是第一步new的page对象,第二个参数你具体的查询条件的一个
Wrapper queryWrapper对象.

像这种直接对一个表进行查询,因为mybatis-plus正是在这里优化了,不需要你写sql语句,就可以查询,所以这种情况下,无非是在查询里加了一个分页.而后面要讲的多表联查的分页查询,自定义分页查询,其实已经和分页没什么关系了,主要是查询方法本身的问题.分页仅仅只是2行代码,那2步而已.
其实到这里与其说是分页查询,其实是怎么写查询的问题

例子中参考的项目资料来源:
https://www.bilibili.com/video/BV1dQ4y1A75e


三、多表联查情况下的分页查询(mybatis的条件查询-动态sql)

因为在mybatis-plus里,如果要做多表联查,我们没法用里面的Wrapper queryWrapper对象,
要自己写sql语句,然后又要传递参数.
其实他就是一个mybatis的条件查询(动态sql),然后对查询结果进行分页.
所以我们也没法用mybatisPlus提供的service.page
我们需要自己写一个page方法.
直接上代码举例说明,

 @Test
    public void myPageQueryTest(){
        ArticleInfo articleInfo = new ArticleInfo();
        articleInfo.setCategoryId(1);
        articleInfo.setSummary("摘要1");
        Page<ArticleInfo> page = new Page<ArticleInfo>(1,10);
        //这就是另一个例子里的Page<EduTeacher> pageTeacher = new Page<>(current,limit);
        IPage<ArticleInfo> iPage = articleInfoMapper.selectPageWithCategory(page,articleInfo);
        //这里我们自己写一个名为selectPageWithCategory()的查询方法

		//下面是输出可以无视
        System.out.println(iPage.getRecords().size());
        List<ArticleInfo> lists = iPage.getRecords();
        lists.forEach(list ->{
            System.out.println(list.getCategory().getName());
        });
    }

其实和二中的分页查询并没有很大区别,同样是两步,第一步还是
Page page = new Page(current,limit),在这次例子中他因为是个@Test,不传参所以直接写了(1,10).
第二步 对这个new的分页对象进行条件查询,因为是多表联查,用不了自带的service.Page()的方法,所以,我们要自己写一个多表联查的方法.
重点在这里

IPage<ArticleInfo> iPage = articleInfoMapper.selectPageWithCategory(page,articleInfo);

在Mapper里面:

IPage<ArticleInfo> selectPageWithCategory(Page<ArticleInfo>page,@Param("art")ArticleInfo articleInfo)

Mapper.xml里面具体实现(到这里就是sql语句了)

<select id="selectPageWithCategory" resultMap="AllArticleInfoWithCategory">
        SELECT a.*,
        c.id AS cid,
        c.name AS cname
        FROM article_info a,
        category c
        Where a.category_id = c.id
        <if test="art.title != null and art.title != ''">
            and a.title like concat('%',#{art.title},'%')
        </if>
        <if test="art.summary != null and art.summary != ''">
            and a.summary like concat('%',#{art.summary},'%')
        </if>
        <if test="art.categoryId != null and art.categoryId != ''">
            and a.category_id = #{art.categoryId}
        </if>
        order by a.id desc
    </select>

首先,我们文章是面向没有什么基础的小白,这段代码看不懂没关系,我们来分析一下,简单讲解.
这是一个mybatis的条件查询,动态sql的写法.
在头里面,我们能看到一个@Param(“art”)
@Param注解的使用和解析
作用:用注解来简化xml配置的时候(比如Mybatis的Mapper.xml中的sql参数引入),@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)
是给后面的)ArticleInfo articleInfo对象,取了个为"art"名字.方便传递进入在后面sql里,这里用ArticleInfo articleInfo是为了方便,同样也可以传Stirng类对象,或者别的查询用的类,实际上只是为了拼接进sql里,进行动态编写.

<if test="art.title != null and art.title != ''">
            and a.title like concat('%',#{art.title},'%')
        </if>
        <if test="art.summary != null and art.summary != ''">
            and a.summary like concat('%',#{art.summary},'%')
        </if>
        <if test="art.categoryId != null and art.categoryId != ''">
            and a.category_id = #{art.categoryId}

在这里,因为@Param注解把articleInfo取名成了art, 直接这样取它的成员变量里的参数 拼接进sql语句进行动态的查询.

mybatis的条件查询-动态sql的学习参考资料:
https://www.cnblogs.com/xyfer1018/p/10238779.html

总结

      其实这些东西都是非常基础的,而本人由于基础比较差,所以刚开始查资料的时候,学的挺吃力的.所以我在进行讲解的时候也是逐行扣代码分析,这篇文章也是面向自己做个记录,和给同样基础比较薄弱的小白方便理解.
      如有其他问题,欢迎在评论区一起讨论学习,一起进步.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 是一个 MyBatis 的增强工具包,提供了很多方便的功能和特性,其包括分页查询插件。使用 MyBatis-Plus分页查询插件可以简化分页查询的操作。 在 MyBatis-Plus 分页查询可以通过 `Page` 对象和 `PageHelper` 工具类来实现。下面是使用 MyBatis-Plus 进行分页查询的示例代码: 1. 首先,添加 MyBatis-Plus 和分页插件的依赖到你的项目。你可以在项目的 pom.xml 文件添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` 2. 创建一个 `Page` 对象,并设置分页参数: ```java // 创建一个 Page 对象 Page<User> page = new Page<>(current, size); // 设置分页参数 page.setPages(current); // 当前页码 page.setSize(size); // 每页显示的记录数 ``` 3. 在 MyBatis 的 Mapper 接口使用 `@Param` 注解传递 `Page` 对象,并在 SQL 使用 MyBatis-Plus 提供的分页查询方法: ```java @Mapper public interface UserMapper extends BaseMapper<User> { List<User> selectUserPage(@Param("page") Page<User> page, @Param("name") String name); } ``` 4. 在 Service 层调用分页查询方法: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public IPage<User> getUserPage(long current, long size, String name) { Page<User> page = new Page<>(current, size); return userMapper.selectUserPage(page, name); } } ``` 这样,你就可以使用 MyBatis-Plus分页查询插件进行分页查询了。记得在你的 SQL 语句使用 MyBatis-Plus 提供的分页查询方法,而不是传统的 LIMIT 语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值