前言

MP这样一款强大的持久层框架处理起来复杂的SQL来也是得心应手,效率极高,快快与我一同领略Plus的独特魅力吧

一.分页处理

1.调用方法传入参数获取返回值

创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数,执行分页查询并获取其结果

@SpringBootTest
class Mybatisplus{
    @Autowired
    private UserDao userDao;    
    //分页查询
    @Test
    void testSelectPage(){      
        IPage<User> page=new Page<>(1,3);
        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.设置分页拦截器

将MP提供的分页拦截器配置成Spring管理的bean对象

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1 创建MybatisPlusInterceptor拦截器对象
        MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
        //2 添加分页拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

查询结果如下:

MP有多智能,他给我们提供的方法和功能太强大,以至于我们只需传入两个对象即可自动完成分页查询

二.条件查询

2.1通过QueryWrapper对象来执行分页查询

@SpringBootTest
class Mybatisplus{
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        QueryWrapper qw = new QueryWrapper();
        qw.lt("age",18);
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }
}

注:lt()方法为小于(<) ,对应的SQL为:

SELECT id,name,password,age,tel FROM user WHERE (age < ?)

很容易发现,以字符串形式输出作为查询条件可能会出现字符串拼写错误,针对此种情况,可以进行一下小改进!

2.2在QueryWrapper对象的基础上使用lambda表达式

为了解决以字符串形式作为输出而造成拼写错误的问题,通过lambda来实现实体与属性对应进行查询,就极大地提高了查询的准确性

@SpringBootTest
class Mybatisplus{
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        QueryWrapper<User> qw = new QueryWrapper<User>();
        qw.lambda().lt(User::getAge, 10);//添加条件
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }
}

与之对应的SQL语句同样也是:

SELECT id,name,password,age,tel FROM user WHERE (age < ?)

注:构建LambdaQueryWrapper的时候泛型不能省

当不使用泛型时会提示默认的Object类不是函数接口

而我们的lambda()的底层又需要传进去一个实体,传进去Object显然不能与后面的查询条件相联系!

此时我们再次编写条件的时候,就不会存在写错名称的情况,但是qw后面多了一层lambda()调用

2.3直接通过LambdaQueryWrapper对象

这也是方式二的另一种写法,原理相同都是利用LambdaQueryWrapper

@SpringBootTest
class Mybatisplus{
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(User::getAge, 10);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

三.多条件查询

对于多条件的情景,MP依然可以简单化解,并且构建多条件的时候,可以支持链式编程

3.1且的情况

场景一:查询数据库表中,年龄在3岁到8岁之间的用户信息

@SpringBootTest
class Mybatisplus{
    @Autowired
    private UserDao userDao;
  @Test
    /**
     * 多条件查询
     */
    void testGetAll04() {   //方式四  (常用!)
        LambdaQueryWrapper<Users> qw4 = new LambdaQueryWrapper<>();
        qw4.lt(Users::getAge, 8);  //上限
        qw4.gt(Users::getAge, 3);  //下限
//      qw4.lt(Users::getAge, 8).gt(Users::getAge, 3);  链式编程!
        List<Users> users = userDao.selectList(qw4);
        System.out.println(users);
    }
}

注:gt(),大于(>),最终的SQL语句为

SELECT id,name,password,age,tel FROM user WHERE (age < ? AND age > ?)

也是迅速查出来了结果

3.2或的情况

场景二:查询数据库表中,年龄小于3或年龄大于8的数据

@SpringBootTest
class Mybatisplus{
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(User::getAge, 3).or().gt(User::getAge, 8);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }
}

这里的or()就相当于sql语句中的or关键字,不加默认是and,最终的sql语句为:

SELECT id,name,password,age,tel FROM user WHERE (age < ? OR age > ?)

也是顺利的查了出来

四.null判定

以TB为例,我们购物时进行条件筛选时,可以选择单条件,也可以选择多条件,如上,我的条件就变成price>3000,price<null,这种情况按照以上介绍的查询的方式就会出现问题,如图:

显然,这种情况在开发过程中时不被允许的。所以要求我们针对null的情况要解决如下问题:

用户在输入值的时候:

1.如果只输入第一个框,说明要查询大于该价格的商品

2.如果只输入第二个框,说明要查询小于该价格的商品 ​

3.如果两个框都输入了,说明要查询价格在两个范围之间的商品

于是,我们可以

新建一个模型类,让其继承Brand类,并在其中添加price2属性,Brand02 在拥有Brand属性后同时添加了price2属性

@Data
public class Brand {
    private Long id;
    private String name;
    private Double price;
}
@Data
public class Brand02 extends Brand {
    private Integer price2;
}

解决了实体的问题,再来解决条件的问题

@SpringBootTest
class Mybatisplus02{
    @Autowired
    private BrandDao brandDao;
    @Test
    void testGetAll(){
     BrandQuery bq = new BrandQuery();
        LambdaQueryWrapper<Brand> lqw = new LambdaQueryWrapper<Brand>();
        lqw.lt(null!=bq.getPrice2(),User::getPrice, bq.getPrice2());
        lqw.gt(null!=bq.getPrice(),User::getPrice, bq.getPrice());
        List<Brand> brands = brandDao.selectList(lqw);
        System.out.println(brands);
    }
}

解读:

如果两个属性不为空,则查询price,price2区间范围内

如果有一个属性为空,则查询不为空的区间

实现的核心在于lt()、gt()方法,condition为boolean类型上述的null!=bq.getPrice2()与之对应,返回true,则添加条件,返回false则不添加条件,条件的生效与否就是靠的这个设计!

最后,也是在null的条件下完成了查询:

到此这篇关于MybatisPlus分页查询与多条件查询介绍及查询过程中空值问题的解决的文章就介绍到这了,更多相关MybatisPlus分页查询内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

MybatisPlus分页查询与多条件查询介绍及查询过程中空值问题的解决的更多相关文章

  1. ios检查是否nsarray == null

    我收到了JSON的一些响应,并且工作正常,但是我需要检查一些空值,我找到不同的答案,但似乎不工作,我试过了那么发生了什么呢?如何解决这个问题并在我的数组中检查null?

  2. ios – TabBarController返回null

    我在故事板中有一个tabbarcontroller作为初始视图控制器这是如何返回null的本来就是我想要做的为什么我会变空?

  3. Swift解析Json返回值为null的问题

    nil用来给对象赋值,NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值,而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。

  4. MybatisPlus中的多表条件排序查询

    这篇文章主要介绍了MybatisPlus中的多表条件排序查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. MybatisPlus如何处理Mysql的json类型

    这篇文章主要介绍了MybatisPlus如何处理Mysql的json类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. PHP组合查询多条件查询实例代码第1/2页

    今天想向大家介绍PHP页面间如何进行多条件组合查询。在很多其它网站也有很多相关介绍,但都不够详尽,在这里,我将详细地为大家说明这一比较实用但又相当关键的技术。

  7. Java的ConcurrentHashMap中不能存储null的原因解析

    众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?今天通过源码分析给大家详细解读,感兴趣的朋友一起看看吧

  8. 使用JSON.toJSONString格式化成json字符串时保留null属性

    这篇文章主要介绍了使用JSON.toJSONString格式化成json字符串时保留null属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. jsp+mysql实现网页的分页查询

    这篇文章主要为大家详细介绍了jsp+mysql实现网页的分页查询,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. 一文让你彻底弄懂js中undefined和null的区别

    JavaScript是一门动态类型语言,元素除了表示存在的空值外,还有可能根本就不存在,这就是undefined存在的原因,这篇文章主要给大家介绍了关于undefined和null区别的相关资料,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部