草庐IT

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

懒羊羊.java 2023-04-20 原文

文章目录

前言

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】MP的分页查询、多条件查询以及查询过程中解决null的空值判定的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. "\0"null 的 Ruby 测试? - 2

    我在破坏脚本的字符串中出现了一些奇怪的字符。据我所知,通过putbadstring到控制台,它们是"\0\0\0\0"。我想对此进行测试,以便我可以忽略它们...但是如何呢?以为这就是blank?和empty?的用途?!?:>badstring="\0"=>"\u0000">badstring.blank?NoMethodError:undefinedmethod`blank?'for"\u0000":Stringfrom(irb):97from/Users/meltemi/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in`'>badstring.em

  9. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  10. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

随机推荐