MyBatisPlus总结二

MybatisPlus总结一在这:

MybatisPlus总结1/2-CSDN博客

六、分页查询:

6.1.介绍:

        MybatisPlus内置了分页插件,所以我们只需要配置一个分页拦截器就可以了,由于不同的数据库的分页的方式不一样,例如mysql和oracle数据库的写法是完全不一样的,所以我们需要去指定一个数据库的类型。例如在mysql里面我们有一个limit参数,通过它来控制分页。

@Configuration
public class MPConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //这里可以添加n个拦截器,等下我们还要添加分页拦截器:
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

6.2.代码举例:

①、Page的泛型当中传的是参与分页的表对应的实体类;

②、分页功能已经帮我们过滤掉了逻辑已删除的数据;

@SpringBootTest
public class TestPlus {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void test01(){
        //两个参数——当前页页码,每页信息条数:
        Page<User> page = new Page<>(2,4); //long current,long size
        userMapper.selectPage(page,null);//第二个参数是wrapper 条件构造器
        System.out.println("逻辑未删除的总数据条数:----"+page.getTotal());
        System.out.println("总共有多少页数据:---"+page.getPages());
        System.out.println("每页最多展示多少条数据pageSize:---"+page.getSize());
        System.out.println("当前是第几页,页码从1开始:---"+page.getCurrent());
        //获取当前页数据:
        List<User> users = page.getRecords();
        users.forEach(user-> System.out.println(user));

        System.out.println("是否有下一页:---"+page.hasNext());
        System.out.println("否有上一页:---"+page.hasPrevious());
    }
}

        

==>  Preparing: SELECT COUNT(*) AS total FROM user WHERE deleted = 0
==> Parameters: 
<==    Columns: total
<==        Row: 12
<==      Total: 1
==>  Preparing: SELECT id,name,email,age,deleted,version,balance FROM user WHERE deleted=0 LIMIT ?,?
==> Parameters: 4(Long), 4(Long)
<==    Columns: id, name, email, age, deleted, version, balance
<==        Row: 1, 张三, qq.com, 23, 0, 3, 130
<==        Row: 2, 李四, lisi@qq.com, 18, 0, 1, 100
<==        Row: 3, 王五, wangwu@qq.com, 18, 0, 1, 100
<==        Row: 4, 赵六, zhaoliu@qq.com, 18, 0, 1, 100
<==      Total: 4
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5ed31735]
逻辑未删除的总数据条数:----12
总共有多少页数据:---3
每页最多展示多少条数据pageSize:---4
当前是第几页,页码从1开始:---2
User(id=1, name=张三, email=qq.com, age=23, status=null, deleted=0, version=3, balance=130)
User(id=2, name=李四, email=lisi@qq.com, age=18, status=null, deleted=0, version=1, balance=100)
User(id=3, name=王五, email=wangwu@qq.com, age=18, status=null, deleted=0, version=1, balance=100)
User(id=4, name=赵六, email=zhaoliu@qq.com, age=18, status=null, deleted=0, version=1, balance=100)
是否有下一页:---true
否有上一页:---true

 SELECT * FROM users LIMIT ?,? 

  • 第一个占位符代表的是从第几条数据开始,数据下标从0开始的,
  • 第N页: 从第(N-1)*pageSize 条数据开始查询。
  • 第二个占位符表示要取出多少条数据、也就是每页的大小pageSize ;

七、条件构造器:

7.1.条件构造器的作用:

        将写在where语句后面的那些条件封装成了条件构造器,目的是写出更复杂的查询条件

7.2.继承结构:

AbstractWrapper:用于条件查询封装,生成sql的where条件

  1. QueryWrapper:查询条件封装
  2. UpdateWrapper:Update条件封装
  3. AbstractLambdaWrapper:使用lambda语法

AbstractLambdaWrapper

  1. LambdaQueryWrapper:用于lambda语法使用的查询Wrapper
  2. LambdaUpdateWrapper:lambda更新封装Wrapper

八、QueryWrapper举例:

例1、查询所有用户:

        //通过条件构造器查询一个list集合,若没有条件则可以设置null(相当于查询所有)
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);

 例2、转义字符:

​​​​                                      

  • >:gt
  • <:lt
  • =:eq
  • >=:ge
  • <=:le
  • != :ne

​​​   

                ​​​​​​​ 

代码:

查找出name为李四的所有用户:

  @Test
    public void test02(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name","李四");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

         ​​​​​​​

例3、模糊查询:​​​​​​​like、notLike

  • like:表示a左右都有%
  • likeleft:表示a左边有%
  • likeright:表示a右边有%

        不建议大家使用前后模糊。因为前后模糊的话,它的效率非常低,它用不上索引,你右模糊,还能用上索引。如果你是左模糊或者是前后都模糊,它的索引效率很低的,除非你的数据量特别特别的小。

        ​​​​​​​

​​​​​​​代码:

找出年龄大于15岁,姓李的用户,并且按照年龄大小升序:

   @Test
    public void test03(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age",15);
        queryWrapper.likeRight("name","李");
        queryWrapper.orderByAsc("age");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

例4、in查询:

        ​​​​​​​        

    @Test
    public void test04(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id","1","2","3","4");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

 例5、根据条件构造器查询多用户:

like、between、isNull、isNotNull:
@Test
    public void test04(){
        //user内的属性最终会以and形式拼接,对象形式: 找出年龄为18岁的用户
        User user = new User();
        user.setAge(18);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
         
    }
        //查询用户名包含a,年龄在20-30之间,邮箱信息不为null的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //queryWrapper可以实现链式加载
        queryWrapper.like("name", "a").between("age", 20, 30).isNotNull("email");
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);

        

例6、多种排序条件:

        //查询id>2的用户,按照年龄降序排序,若年两相同则按照id升序排序
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("id", 2).orderByDesc("age").orderByAsc("id");
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);

例7、查询多个字段:

        //查询用户名、年龄、邮箱信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // SELECT name,age,email FROM user WHERE deleted=0:
        queryWrapper.select("name","age","email");
        List<User> uesrs = userMapper.selectList(queryWrapper);
        System.out.println(uesrs );

  //查询出来一个以map为泛型的list集合
        //查询用户名、年龄、邮箱信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("name","age","email");
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        System.out.println(maps);

例8、 条件的优先级:

        将用户名中包含a并且(年龄大于20或邮箱为null)的用户信息进行修改:

        //将用户名中包含a并且(年龄大于20或邮箱为null)的用户信息进行修改
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //lambda中的条件优先执行(i就表示条件构造器)
        queryWrapper.like("name", "a").and(i-> i.gt("age", 20).or().isNull("email"));
        User user = new User();
        user.setName("red").setEmail("test@cj.com");
        int i = userMapper.update(user, queryWrapper);
        System.out.println(i);

这段代码使用了 MyBatis-Plus 的 QueryWrapper 对象来构建查询条件,并且嵌套了一个 lambda 表达式。让我来解释一下这段代码的含义:

  • .and():这个方法用于指定一个 "AND" 关系,它会将前后两个条件组合在一起,要求它们同时成立。

  • i -> i.gt("age", 20).or().isNull("email"):这是一个 Lambda 表达式,它定义了一个条件。这里的 i 是一个占位符,代表了内部条件的 QueryWrapper 对象。

    • i.gt("age", 20):这是一个条件,它表示年龄大于 20。
    • .or():这个方法用于指定一个 "OR" 关系,它会将前后两个条件组合在一起,要求它们之一成立。
    • .isNull("email"):这是一个条件,它表示邮箱为空。

综合起来,.and(i -> i.gt("age", 20).or().isNull("email")) 的含义是指定了一个条件,要求年龄大于 20,并且邮箱为空,它们之间的关系是 "AND",即同时成立。

 例9、组装子查询:

        //select * from user where id in(select id from user where id<=100)
        //查询id<=100的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("id", "select id from user where id<=100");
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);

例10、QueryWrapper实现修改操作&条件优先级: 

        将用户名中包含a并且(年龄大于20或邮箱为null)的用户:

        //将用户名中包含a并且(年龄大于20或邮箱为null)的用户信息进行修改
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //lambda中的条件优先执行(i就表示条件构造器)
        queryWrapper.like("name", "a").and(i-> i.gt("age", 20).or().isNull("email"));
        User user = new User();
        user.setName("red").setEmail("test@cj.com");
        int i = userMapper.update(user, queryWrapper);
        System.out.println(i);

        (年龄大于 20,并且用户名中包含字母 "a"),或者邮箱为空: 

        //将年龄>20并且用户名中包含a或邮箱为null的用户进行修改(默认情况下就是and连接)
        //修改条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 20).like("name", "a").or().isNull("email");
        User user = new User();
        user.setName("lei").setEmail("test@cj.com");
        int i = userMapper.update(user, queryWrapper);
        System.out.println(i);

例11、使用updateWrapper实现修改功能:

        //查询用户名中包含a(年龄>20或邮箱为null)的员工信息
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        //修改条件
        updateWrapper.like("name", "a").and(i->i.gt("age", 20).isNull("email"));
        //修改内容
        updateWrapper.set("name", "lala").set("email", "www@cjc.com");
        int i = userMapper.update(null, updateWrapper);
        System.out.println(i);

例12、动态sql查询:

        String name=null;
        String  age="21";
        //判断字符串是否为null或空串若为返回false,不为返回true
        boolean pn = StringUtils.hasLength(name);
        boolean pa = StringUtils.hasLength(age);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //判断属性是否为true,为true则执行该条件,不为则忽略该条件
        queryWrapper.eq(pn,"name",name).eq(pa, "age", age);
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);

注意:queryWrapper.clear();为清除多余的条件,清除后queryWrapper可以继续使用  

例13、条件构造器实现删除操作:

        //删除邮箱地址为null的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("email");
        int i = userMapper.delete(queryWrapper);
        System.out.println(i);

 九、LambdaQueryWrapper:

        作用:为了防止我们将字段名写错进而提供了一个函数式接口来访问我们实体类中的某一个属性,当我们把属性访问之后,那么他就可以自动的获取属性所对应的字段名,来当作作为条件的哪个字段。

        String name="a";
        Integer ageBegin=null;
        Integer ageEnd=30;
        //主要避免了名称写错进而提供了直接访问表达式::
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(StringUtils.isNotBlank(name), User::getName,name)
                          .ge(ageBegin!=null, User::getAge,ageBegin)
                          .le(ageEnd!=null, User::getAge,ageEnd);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);

LambdaUpdateWrapper:

        //查询用户名中包含a(年龄>20或邮箱为null)的员工信息
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        //修改条件
        updateWrapper.like(User::getName, "a").and(i->i.gt(User::getAge, 20).isNull(User::getEmail));
        //修改内容
        updateWrapper.set(User::getName, "lala").set(User::getEmail, "www@cjc.com");
        int i = userMapper.update(null, updateWrapper);
        System.out.println(i);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/692386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运维实用小脚本,登录即自动显示系统信息

今天给大家安利一个超级实用的Linux小技巧&#xff0c;让你每次登录终端时都能感受到满满的科技感和效率爆棚&#xff01; 你是否厌倦了每次手动检查系统状态&#xff0c;像内存使用、CPU负载这些繁琐操作&#xff1f;别担心&#xff0c;一个小调整&#xff0c;让这一切自动化…

HC-05蓝牙模块配置连接和使用

文章目录 1. 前期准备 2. 进入AT模式 3. 电脑串口配置 4. 配置过程 5. 主从机蓝牙连接 6. 蓝牙模块HC-05和电脑连接 1. 前期准备 首先需要准备一个USB转TTL连接器&#xff0c;电脑安装一个串口助手&#xff0c;然后按照下面的连接方式将其相连。 VCCVCCGNDGNDRXDTXDTXD…

LeetCode ---400周赛

题目列表 3168. 候诊室中的最少椅子数 3169. 无需开会的工作日 3170. 删除星号以后字典序最小的字符串 3171. 找到按位与最接近 K 的子数组 一、候诊室中的最少椅子数 简单的模拟题&#xff0c;我们可以这样来模拟&#xff1a;当有顾客来时&#xff0c;我们加一把椅子&…

如何使用GPT-4o函数调用构建一个实时应用程序?

本教程介绍了如何使用OpenAI最新的LLM GPT-4o通过函数调用将实时数据引入LLM。 我们在LLM函数调用指南(详见https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/)中讨论了如何将实时数据引入聊天机器人和代理。现在&#xff0c;我们将通过将来自Fligh…

React + SpringBoot实现图片预览和视频在线播放,其中视频实现切片保存和分段播放

图片预览和视频在线播放 需求描述 实现播放视频的需求时&#xff0c;往往是前端直接加载一个mp4文件&#xff0c;这样做法在遇到视频文件较大时&#xff0c;容易造成卡顿&#xff0c;不能及时加载出来。我们可以将视频进行切片&#xff0c;然后分段加载。播放一点加载一点&am…

【稳定检索/投稿优惠】2024年材料科学与能源工程国际会议(MSEE 2024)

2024 International Conference on Materials Science and Energy Engineering 2024年材料科学与能源工程国际会议 【会议信息】 会议简称&#xff1a;MSEE 2024大会地点&#xff1a;中国苏州会议官网&#xff1a;www.iacmsee.com会议邮箱&#xff1a;mseesub-paper.com审稿结…

【基于C++与OpenCV实现魔方图像识别和还原算法】施工总览图

文章目录 主要效果展示思维导图魔方还原算法 本系列博客长期更新&#xff0c;分为两大部分 OpenCV实现魔方六面识别 C编写科先巴二阶段还原算法实现三阶魔方的还原 主要效果展示 摄像头识别六面 3D图像构建&#xff0c;提供还原公式 动画演示还原过程 思维导图 魔方还原算法 参…

Java Web学习笔记26——Element常用组件

常见组件&#xff1a; 就是一个复制和粘贴的过程。 Table表格&#xff1a;用于展示多条结构类的数据&#xff0c;可对数据进行排序、筛选、对比或其他自定义操作。 常见组件-分页主键&#xff1a; Pagination&#xff1a;分页&#xff1a;当数据量比较多时&#xff0c;使用分…

sqlmap直接嗦 dnslog注入 sqllibs第8关

dnslog注入是解决注入的时候没有回显的情况&#xff0c;通过dns外带来进行得到我们想要的数据。 我们是用了dns解析的时候会留下记录&#xff0c;这时候就可以看见我们想要的内容。 这个时候我们还要了解unc路径以及一个函数load_file()以及concat来进行注入。看看我的笔记 unc…

atmel studio 无法通过printf打印浮点数到串口

择右侧的项目,右键,选择properties 系统把它优化了&#xff0c;所以删除&#xff0c;即可 然后&#xff0c;选择相应波特率&#xff0c;效验位&#xff0c;数据位是否正确&#xff0c;即可

Transformer 动画讲解:多层感知机

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

Golang | Leetcode Golang题解之第138题随机链表的复制

题目&#xff1a; 题解&#xff1a; func copyRandomList(head *Node) *Node {if head nil {return nil}for node : head; node ! nil; node node.Next.Next {node.Next &Node{Val: node.Val, Next: node.Next}}for node : head; node ! nil; node node.Next.Next {if…

项目bug1

大项目测bug的时候让输入数字&#xff0c;如果不是则捕获异常&#xff0c;提示错误&#xff0c;几段很简单的代码&#xff1a; System.out.println("请输入要存入的金额"); Scanner sc new Scanner(System.in); while(true) {try {money sc.nextInt();break;} cat…

ctfshow-web入门-命令执行(web41_exp与分析)

过滤不严&#xff0c;命令执行 preg_match(/[0-9]|[a-z]|\^|\|\~|\$|\[|\]|\{|\}|\&|\-/i, $c) 过滤掉了数字、字母以及一些符号&#xff0c;之前接触过的无字母 rce 是取反编码再取反&#xff0c;采用不可见字符去绕过正则&#xff0c;但是这里取反符号被过滤掉了&#x…

mysql (事物)

一.什么是事物 事物是一组操作的集合&#xff0c;不可分割的工作单位&#xff0c;事物会把所有的操作当作一个整体一起向系统提交或撤销操作请求&#xff0c;就是这些操作要么一起成功要么一起失败。 二.事物操作 &#xff08;这个就是一个理解&#xff09; 1.事务特性 原子性…

java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序&#xff0c;在程序发生异常时就可以执行预先设定好的处理程序&#xff0c;处理程序执行完之后&#xff0c;可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…

信息安全与密码技术概述

1. 信息安全的法律法规 2016年11月7日&#xff0c;中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过《中华人民共和国网络安全法》&#xff0c;自2017年6月1日起施行。 2019年10月26日&#xff0c;中华人民共和国第十三届全国人民代表大会常务委员会第十四…

C++ | Leetcode C++题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {auto wordDictSet unordered_set <string> ();for (auto word: wordDict) {wordDictSet.insert(word);}auto dp vector <bool> (s.…

高质量 HarmonyOS 权限管控流程

高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中&#xff0c;往往会涉及到敏感数据和硬件资源的调动和访问&#xff0c;而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解&#xff0c;才可以在应用开发中提高效率和避免踩坑。 权限管控了…

Django 表里做删除

先看效果图 点击 删除 按钮之后&#xff0c;就可以下面的效果 操作步骤&#xff1a; 1. 在 urls.py 文件里&#xff0c;添加路劲&#xff1a; urlpatterns [path(asset/<int:aid>/delete/, am_views.asset_delete),]2. 在 views.py 文件里&#xff0c;实现一个新的函…