一、标准分页功能制作🍭
MyBatis-Plus提供了方便易用的标准分页功能,可以轻松实现分页查询。
1、实现分页功能🍉
在上篇我们简单介绍了 一些MybatisPlus带来的简单方法,现在来看看它所带来的分页功能是如何实现的。
可以看到这个函数需要一个page参数。
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
点进源码发现这是一个IPage(这是一个接口)的对象,我们就给它一个对应的对象。
@Test void testGetByPage(){ IPage page=new Page(1,1);//第一个参数表示第几页,第二个参数表示一页多少条 userDao.selectPage(page,null); System.out.println("当前页码值:"+page.getCurrent()); System.out.println("每页显示数:"+page.getSize()); System.out.println("一共多少页:"+page.getPages()); System.out.println("每页显示数:"+page.getTotal()); System.out.println("数据:"+page.getRecords()); }
运行测试代码:
我们可以发现这其中多少页、多少条并没有准确显示,而且看数据它将所有数据都查出来了,这就是简单的查询所有数据。为什么会这样?因为还没有设置完全,需要给分页功能添加拦截器才可以使用。
2、分页拦截器🍉
实现这个分页功能需要配置MybatisPlus分页拦截器,如果那个类需要使用这个分页功能则需要加入到拦截器中。那我们来实现一下:
package com.example.config; 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; @Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mpInterceptor(){ //1.定义Mp拦截器 MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); //2.添加具体的拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; } }
随便配置打印 MyBatis-plus 执行的 SQL
mybatis-plus: mapper-locations: classpath:mapper/*Mapper.xml configuration: # 配置打印 MyBatis-plus 执行的 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
然后再次运行代码
我们可以发现所有数据都正确显示了,查询的数据也只有一条,然后再看SQL语句,我们查询第二页再看一下:
可以发现查询第一页和第二页的SQL语句不太一样,有两个参数,MybatisPlus这也太智能了吧,这也让我们的分页操作十分简单了。
二、加快控制台运行速率🍭
1、不打印日志🍉
创建一个logback.xml,可以让控制台的日志打印消失。
"1.0" encoding="UTF-8"?> <configuration> configuration>
未添加xml前:
添加后:
2、不打印Spring图标和MyBatisPlus图标🍉
分别给mybatic-plus和Spring设置banner属性:
# 配置数据库的连接字符串 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/ku2022?characterEncoding=utf8 username: root password: "123456" driver-class-name: com.mysql.cj.jdbc.Driver main: banner-mode: off #不显示logo mybatis-plus: mapper-locations: classpath:mapper/*Mapper.xml configuration: # 配置打印 MyBatis-plus 执行的 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: banner: false #不显示logo
运行测试代码,发现只有SQL信息和打印信息:
三、条件查询的三种语句🍭
MyBatisPlus将书写复杂的SOL查询条件进行了封装,使用编程的形式完成查询条件的组合。
可以看到大部分select语句都有一个相同的Wrapper接口,这些Wrapper接口就是用来封装查询操作的。
1、按条件查询🍉
现在数据库中有三个用户,我们去查询出age小于18的用户。
测试代码:
@Test void textGetAll() { //方式一:按条件查询 QueryWrapper qw=new QueryWrapper<>();//这里的泛型指不指点都可以 qw.lt("age",18);//lt是表示小于 List list=userDao.selectList(qw); System.out.println(list); }
运行:
2、lambda格式表达式(推荐)🍉
Ⅰ、第一种🍓
我们现在使用lambda表达式的方式去查询age小于20的用户
@Test void textGetAll() { //方式二:lambda格式按条件查询 QueryWrapper qw = new QueryWrapper<>();//这里的泛型必须指点,不然下面User::getAge会报错 qw.lambda().lt(User::getAge, 20); List userList = userDao.selectList(qw); System.out.println(userList); }
运行:
Ⅱ、 第二种🍓
这是另一种lambda表达式的方式,这也是比较常用的一种方法了。
@Test void textGetAll() { //方式三:lambda格式按条件查询 LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.lt(User::getAge, 25); List userList = userDao.selectList(lqw); System.out.println(userList); }
3、查询大于10小于22的数据🍉
Ⅰ、正常查询🍓
@Test void textGetAll() { //方式三:lambda格式按条件查询 LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.gt(User::getAge,10); lqw.lt(User::getAge, 22); List userList = userDao.selectList(lqw); System.out.println(userList); }
Ⅱ、组合查询条件(链式编程格式)🍓
并且 (and)🍒
@Test void textGetAll() { //方式三:lambda格式按条件查询 LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.lt(User::getAge,23).ge(User::getAge,10); List userList = userDao.selectList(lqw); System.out.println(userList); }
或者 (or)🍒
@Test void textGetAll() { //方式三:lambda格式按条件查询 LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.lt(User::getAge,22).or().ge(User::getAge,10); List userList = userDao.selectList(lqw); System.out.println(userList); }
四、条件查询null判定🍭
当我们需要判断一个值是否为null时,我们一般使用if语句进行判断,而在MybatisPlus中有更好的方法。
UserQuery类
package com.example.domain; import lombok.Data; @Data public class UserQuery extends User{ private Integer age2; }
一般情况使用if:
@Test void textGetAll() { UserQuery uq=new UserQuery(); uq.setAge(18); uq.setAge2(20); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); if (null!=uq.getAge2()){ lqw.gt(User::getAge,uq.getAge2()); } if (null!=uq.getAge()){ lqw.lt(User::getAge,uq.getAge()); } List userList = userDao.selectList(lqw); System.out.println(userList); }
但这样十分麻烦,而MybatisPlus给我们提供了更好的方法。
@Test void textGetAll() { UserQuery uq=new UserQuery(); uq.setAge2(20); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); //判断是否为null lqw.gt(null!=uq.getAge2(),User::getAge,uq.getAge2()); lqw.lt(null!=uq.getAge(),User::getAge,uq.getAge()); List userList = userDao.selectList(lqw); System.out.println(userList); }
运行: