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

这篇具有很好参考价值的文章主要介绍了【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

MP这样一款强大的持久层框架处理起来复杂的SQL来也是得心应手,效率极高,快快与我一同领略Plus的独特魅力吧
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis

一.分页处理

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;
    }
}

查询结果如下:
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis
MP有多智能,他给我们提供的方法功能太强大,以至于我们只需传入两个对象即可自动完成分页查询
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis

二.条件查询

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的时候泛型不能省
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis
当不使用泛型时会提示默认的Object类不是函数接口

lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis
而我们的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 > ?)

也是迅速查出来了结果
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis

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 > ?)

也是顺利的查了出来lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis

四.null判定

lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis
以TB为例,我们购物时进行条件筛选时,可以选择单条件,也可以选择多条件,如上,我的条件就变成price>3000,price<null,这种情况按照以上介绍的查询的方式就会出现问题,如图:
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis
显然,这种情况在开发过程中时不被允许的。所以要求我们针对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则不添加条件,条件的生效与否就是靠的这个设计!
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis
最后,也是在null的条件下完成了查询:
lambdaquerywrapper 不为空,MyBatis/MyBatisPlus,数据库,java,spring,mybatis文章来源地址https://www.toymoban.com/news/detail-797701.html

到了这里,关于【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot-mybatis的分页查询的接口

    直接查询所有数据即可,剩下的交给分页器 PageHelper.startPage(page, pageSize) ; 是 MyBatis 的一个分页插件(PageHelper)提供的方法调用,用于在数据库查询中实现分页功能。这个方法的作用是告诉 PageHelper 开始对接下来的查询进行分页处理。 具体来说,这个方法做了以下几件事情:

    2024年02月14日
    浏览(28)
  • SpringBoot ElasticSearch 实现订单的分页查询 【SpringBoot系列17】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海

    2024年02月09日
    浏览(40)
  • 【若依】关于对象查询list返回,进行业务处理以后的分页问题

    1、查询对象Jglkq返回 list,对 list 进行业务处理后返回,但分页出现问题。  2、最终解决方案,改造 TableDataInfo getDataTable(List listVo,List list)方法 返回list中修改: 

    2024年01月25日
    浏览(41)
  • 重构优化第三方查询接口返回大数据量的分页问题

    # 问题描述      用户线上查询其上网流量详单数据加载慢,且有时候数据没有响应全~      1、经排除是调用第三方数据量达10w条响应会超时,数据没正常返回      2、现有线上缓存分页也是加载慢数据不能正常展示      3、第三方接口返回类似报文jsonj:           4、我

    2024年02月09日
    浏览(44)
  • MyBatis与MyBatis-Plus的分页以及转换

    MyBatis和MyBatis-Plus都是Java持久化框架,用于简化数据库访问和操作。它们提供了面向对象的方式来管理关系型数据库中的数据。 MyBatis 是一个轻量级的持久化框架,通过XML或注解配置,将SQL语句与Java对象进行映射,使开发者可以使用简单的API来执行数据库操作。MyBatis支持动态

    2024年02月11日
    浏览(52)
  • MybatisPlus的分页插件自动优化LeftJoin语句导致参数不匹配 java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

    首先会去检查自己传了哪些参数?是否都用上了?反复检查,发现并没有多余的参数: controller里处理条件并传参:  SQL语句  小伙伴说可能是我这sql语句太混乱,甚至还 mybatis和mybatisplus同时使用了!!!  遇事不决,查网友经验:(9条消息) MyBatis-Plus使用分页插件报错,或数

    2024年02月11日
    浏览(84)
  • MyBatisPlus入门篇2 - 条件查询、查询投影、查询条件、id生成策略、多记录操作、逻辑删除

    目录 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合。 封装User模型的查询条件,这里age是具有上下限的,User类里面的age作为下限,这里的age2作为上限。 domain.query.UserQuery.java ①if语句控制 ②条件参数控制 查询结果包含模型类中的部分属性

    2024年02月09日
    浏览(39)
  • springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

    mybatisplus实际上只对单表查询做了增强(速度会更快),从传统的手写sql语句,自己做映射,变为封装好的QueryWrapper。 本篇文章的内容是有两张表,分别是用户表和订单表,在不直接在数据库做表连接的情况下,通过后台代码完成①查询订单的同时查到该订单所属的用户,②

    2024年02月07日
    浏览(48)
  • SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

    1.MybatisPlus常用注解:         1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时:         @TableName指定库名         @TableId指定表名         @TableField指定字段名         1.2 自增主键:         @TableId(type=IdType.AUTO)         private Long id;        

    2024年04月26日
    浏览(40)
  • SpringDataJpa的使用 -- 条件查询、排序查询、分页查询

    本文以 Article.java 为数据存放类,操作接口为 ArticleRepository.java @Data lombok 的注解,用来生成 Getter、Setter、toString、hashCode 方法,当添加该注解的同时在添加 相应方法(如 toString())时,添加的方法不会被覆盖。 @NoArgsConstructor lombok 的注解,用来生成 无参构造函数。 @AllArgsCo

    2024年02月01日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包