MyBatisPlus总结二

MybatisPlus总结一在这:

MybatisPlus总结1/2-CSDN博客

六、分页查询:

6.1.介绍:

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

@Configuration
public class MPConfig {@Beanpublic 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 {@Autowiredprivate UserMapper userMapper;@Testpublic void test01(){//两个参数——当前页页码,每页信息条数:Page<User> page = new Page<>(2,4); //long current,long sizeuserMapper.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为李四的所有用户:

  @Testpublic 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岁,姓李的用户,并且按照年龄大小升序:

   @Testpublic 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查询:

        ​​​​​​​        

    @Testpublic 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:
@Testpublic 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,不为返回trueboolean 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.mzph.cn/pingmian/25005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻松连接远程服务器SecureCRT for Mac/Windows

SecureCRT是一款功能强大的终端仿真器和文件传输工具&#xff0c;专为网络管理员、开发人员和系统工程师设计。它支持SSH、Telnet、RDP和串口等多种协议&#xff0c;提供安全、高效的远程访问和管理体验。SecureCRT具有多窗口/多标签管理、自定义终端仿真、颜色方案优化等高级功…

Linux内核下网卡硬件 MAC 和PHY分析笔记

1 简介 通常CPU自带的以太网接口是MAC控制器&#xff0c;为了实现完整的功能&#xff0c;外围硬件还需要增加一个PHY芯片。 PHY芯片在建立网络连接时负责协商确定网速、全双工 或者 半双工等。在正常通讯时负责在MAC控制器的MII信号 与 网线中的信号之间做转换。 本文的内核代…

最快的开源UDP传输工具:Kcptun

Kcptun&#xff1a;极速网络隧道&#xff0c;让数据传输飞起来&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 kcptun 是一个轻量级、高性能的TCP/UDP网络加速工具&#xff0c;由xtaci开发并托管在GitHub上。它通过使用kcp协议&#xff0c;为网络数据传输提供了一个快…

[linux] makefilegdb理解

目录 Linux项目自动化构建工具-make/Makefile 背景 理解 依赖关系 依赖方法 原理 Linux调试器-gdb使用 背景 开始使用 Linux项目自动化构建工具-make/Makefile 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 一个工…

推荐一款AI音乐生成工具和一款浏览器

大家好&#xff0c;今天给大家带来2款软件&#xff0c;一款是移动浏览器&#xff0c;一款是AI音乐生成软件。 Alook Alook是一款移动端浏览器&#xff0c;它以其独特的无广告、无推送、无新闻的"三无"特性&#xff0c;为用户提供了一个清爽的上网环境。Alook不仅界…

【算法小记】深度学习——时间序列数据分析 Time series Data Analysis

在本篇博客中将简单介绍常见的几种循环神经网络和一维卷积神经网络&#xff0c;并使用一些简答的数据进行拟合分析。本文相对适合刚入门的同学&#xff0c;同时也作为自己过去一段时间学习的总结和记录&#xff0c;现在神经网络框架已经非常完善的支持了很多常见和有效的深度学…

【优选算法】BFS解决FloodFill算法

一、经验总结 什么是FloodFill算法&#xff1f; FloodFill算法是一种用于填充连通区域的算法&#xff0c;通常用于图像处理和计算机图形学中。它从给定的起始点开始&#xff0c;向周围相邻的像素进行扩散填充&#xff0c;直到遇到边界或者其他指定条件停止。 FloodFill算法还…

新买的移动硬盘无法识别

文章目录 背景解决方案 背景 同事新买的移动硬盘&#xff0c;插在电脑上识别不出来盘符&#xff0c;检查了一下&#xff0c;硬盘没问题应该&#xff0c;是ssk的硬盘盒M.2的SSD&#xff0c;硬盘驱动也是正常的&#xff0c;插拔了几次&#xff0c;都不识别&#xff0c;换了太电脑…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中&#xff0c;我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明&#xff0c;不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…

【云岚到家】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址&#xff1a;https://arxiv.org/pdf/1506.02640 训练集博客链接&#xff1a;目标检测实战篇1——数据集介绍(PASCAL VOC&#xff0c;MS COCO)-CSDN博客 代码文件&#xff1a;在我资源里&#xff0c;但是好像还在审核&#xff0c;大家可以先可以&#xff0c;如果没有的…

从 Android 恢复已删除的备份录

本文介绍了几种在 Android 上恢复丢失和删除的短信的方法。这些方法都不能保证一定成功&#xff0c;但您可能能够恢复一些短信或其中存储的文件。 首先要尝试什么 首先&#xff0c;尝试保留数据。如果你刚刚删除了信息&#xff0c;请立即将手机置于飞行模式&#xff0c;方法是…

【Linux】信号(二)

上一章节我们进行了信号产生的讲解。 本节将围绕信号保存展开&#xff0c;并会将处理部分开一个头。 目录 信号保存&#xff1a;信号的一些概念&#xff1a;关于信号保存的接口&#xff1a;sigset_t的解释&#xff1a;对应的操作接口&#xff1a;sigprocmask&#xff1a;sigp…

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中&#xff0c;Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态&#xff0c;而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件&#xff0c;其中子视图需要向父…

Eslint配置指南

1. Eslint配置指南 1.1. 安装 ESLint1.2. 生成配置文件1.3. 修改配置文件1.4. 创建 .eslintignore 文件1.5. 运行 ESLint1.6. 整合到编辑器/IDE1.7. 自动修复 2. 配置prettier 2.1. 安装依赖包2.2. .prettierrc.json添加规则2.3. .prettierignore忽略文件2.4. 保存自动格式化 3…

实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)

背景介绍 SegFormer&#xff1a;实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说&#xff0c;车道检测都是必不可少的。车道是道路上的标记&#xff0c;有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种&#xff0c;每…

vue2实现将el-table表格数据导出为长图片

方法一、 el-table数据导出为长图片 将el-table数据导出为图片不是一个直接的功能&#xff0c;但可以通过以下步骤实现&#xff1a; 使用html2canvas库将表格区域转换为画布(canvas)。 使用canvas的toDataURL方法将画布导出为图片格式&#xff08;例如PNG&#xff09;。 创建…

数据结构--实验

话不多说&#xff0c;直接启动&#xff01;&#x1f44c;&#x1f923; 目录 一、线性表&#x1f60e; 1、建立链表 2、插入元素 3、删除特定位置的元素 4、输出特定元素值的位置 5、输出特定位置的元素值 6、输出整个链表 实现 二、栈和队列&#x1f618; 栈 顺序栈 …

将web项目打包成electron桌面端教程(一)vue3+vite+js

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3的打包方式各不同&#xff0c;如果你的项目不是vue3vitejs&#xff0…