【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定

简介: 分页查询、多条件查询以及查询过程中解决null的空值判定

前言

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.如果只输入第一个框,说明要查询大于该价格的商品

<font color=green>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的条件下完成了查询:
在这里插入图片描述

相关文章
|
3月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
271 8
|
8天前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
32 5
|
27天前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
43 3
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
36 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL Java 数据库连接
mybatis如何实现分页查询?
【10月更文挑战第19天】mybatis如何实现分页查询?
150 3
|
2月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
91 1
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
5月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
67 7
|
7月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
172 2