黑莲技术资源论坛

作者: 顺势而为47
查看: 110|回复: 0

MybatisPlus︰MP的分頁和多條件查詢的過程中解決null的空值判定

MybatisPlus︰MP的分頁和多條件查詢的過程中解決null的空值判定

[复制链接]
顺势而为47 | 显示全部楼层 发表于: 2022-9-22 18:08:29
顺势而为47 发表于: 2022-9-22 18:08:29 | 显示全部楼层 |阅读模式
查看: 110|回复: 0
文章目錄

MP這樣一款強大的持久層框架處理起來復雜的SQL來也是得心應手,效率極高,快快與我一同領略Plus的獨特魅力吧


一.分頁處理

1.調用方法傳入參數獲取返回值

創建IPage分頁對象,設置分頁參數,1為當前頁碼,3為每頁顯示的記錄數,執行分頁查詢並獲取其結果
@SpringBootTestclass 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對象
@Configurationpublic class MybatisPlusConfig {         @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor(){         //1 創建MybatisPlusInterceptor攔截器對象        MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();        //2 添加分頁攔截器        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());        return mpInterceptor;    }}查詢結果如下︰


二.條件查詢

2.1通過QueryWrapper對象來執行分頁查詢

@SpringBootTestclass 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來實現實體與屬性對應進行查詢,就極大地提高了查詢的準確性
@SpringBootTestclass 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
@SpringBootTestclass 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歲之間的用戶信息

@SpringBootTestclass 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的數據

@SpringBootTestclass 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屬性
@Datapublic class Brand {     private Long id;    private String name;    private Double price;}@Datapublic class Brand02 extends Brand {     private Integer price2;}解決了實體的問題,再來解決條件的問題
@SpringBootTestclass 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的條件下完成了查詢︰




參考原文︰ https://blog.csdn.net/weixin_57535055/article/details/126842879

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|黑莲技术资源论坛 ( 闽ICP备18016623号-7 )|网站地图

GMT+8, 2022-10-7 19:52 , Processed in 0.392586 second(s), 26 queries .

Powered by BBS.HL1.NET X3.4 © 2020-2022

本站IT社区(bbs.hl1.net)所有的资源教程均来自网友分享及互联网收集

快速回复 返回顶部 返回列表