MyBatisPlus总结二

news2024/11/27 0:36:38

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.coloradmin.cn/o/1805418.html

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

相关文章

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

【全开源】安心护送非急救救护车转运平台小程序(FastAdmin+ThinkPHP+Uniap

&#x1f691;安心护送非急救救护车转运平台小程序——您的健康守护者&#x1f496; 安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统&#xff0c;可以根据运营者的业务提供类似短途接送救护服务&#xff0c;重症病人转运服…

一文学会Spring 实现事务,事务的隔离级别以及事务的传播机制

目录 一.Spring (Spring Boot) 实现事务 1.通过代码的方式手动实现事务 (手动档的车) 2.通过注解的方式实现声明式事务 (自动挡的车) 二.事务的4大特性(ACID) 三.事务的隔离级别 ①Mysql的事务隔离级别: ②Spring的事务隔离级别: 四.事务的传播机制 ①事务传播机制的概…

Git配置 安装及使用

团队开发的神 找工作必备 环境变量 配置好环境后 打开终端环境 winr cmd 我习惯在桌面打开&#xff0c;然后进入相应的文件夹 &#xff08;文件夹结构&#xff09; &#xff08;个人感觉能用cmd不用git&#xff0c;cmd更好用一些&#xff09; 进入对应的文件夹 填写自己对…

Valgo,类型安全,表达能⼒强的go验证器

valgo 是一个为 Go 语言设计的类型安全、表达性强且可扩展的验证库。该库的特点包括&#xff1a; github.com/cohesivestack/valgo 类型安全&#xff1a;利用 Go 语言的泛型特性&#xff08;从 Go 1.18 版本开始支持&#xff09;&#xff0c;确保验证逻辑的类型安全。表达性&a…

Docker高级篇之Docker微服务实战

文章目录 1. 构建一个简单的微服务项目2. 编写Dockerfile发布微服务部署到docker容器 1. 构建一个简单的微服务项目 创建一个SpringBoot项目 创建一个Controller RestController public class OrderController {Value("${server.port")private String port;Reques…

深入分析 Android BroadcastReceiver (二)

文章目录 深入分析 Android BroadcastReceiver (二)1. 深入理解 BroadcastReceiver 的高级使用和优化2. 有序广播&#xff08;Ordered Broadcasts&#xff09;2.1 实现有序广播 3. 粘性广播&#xff08;Sticky Broadcasts&#xff09;3.1 使用粘性广播 4. 本地广播&#xff08;…

阿里云 MQTT 服务器搭建与测试(上传和下发数据finish)

一、 MQTT 概念 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于 TCP/IP协议上,由 IBM 在 1999 年发布。MQTT 最大优点在于,可以以极少的代码和有限的带宽,…

CNCF项目全景图介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 云原生计算基金会&#xff08;CNCF&#xff09;介绍 CNCF(Cloud Native Computing Foundation)官网链接&#xff1a;https://www.cncf.io/ 官方的介绍如下&#xff1a; 云原生技术有利于各组织在公有云、私有云和混合…

Mysql(一):深入理解Mysql索引底层数据结构与算法

众所众知&#xff0c;MySql的查询效率以及查询方式&#xff0c;基本上和索引息息相关&#xff0c;所以&#xff0c;我们一定要对MySql的索引有一个具体到数据底层上的认知。 这一次也是借着整理的机会&#xff0c;和大家一起重新复习一下MySql的索引底层。 本节也主要有一下的…

【马琴绿绮】马维衡古琴之马氏汉风 明代杉木制;周身髹朱红色漆

【马琴绿绮式】马维衡古琴之马氏汉风 明代杉木制&#xff1b;琴体周身髹朱红色漆&#xff0c;鹿角霜灰胎&#xff1b;形体壮硕、风格高古&#xff1b;音色松透、浑厚&#xff0c;音质纯净&#xff0c;按弹舒适&#xff0c;手感丝滑。

【vue实战项目】通用管理系统:图表功能

目录 前言 1.概述 2.数据概览页 2.1.柱状图 2.2.折线图 2.3.地图 前言 本文是博主前端Vue实战系列中的一篇文章&#xff0c;本系列将会带大家一起从0开始一步步完整的做完一个小项目&#xff0c;让你找到Vue实战的技巧和感觉。 专栏地址&#xff1a; https://blog.csd…

Vue3【十三】watch监视

Vue3【十三】watch监视 Vue3 中的watch祝你能监视以下四种数据 ref 定义的数据reactive定义的数据函数返回一个值一个包含上述内容的数组 案例截图 目录结构 案例代码 Person.vue <template><div class"person"><!-- <h1>Watch情况1&#xff…

遗址博物馆ar互动展示软件提供丰富的趣味化体验

在自然博物馆的每一个角落&#xff0c;都隐藏着大自然的奥秘与魅力。为了让每一位参观者都能深入体验、探索这些奥秘&#xff0c;我们引入了前沿的AR技术&#xff0c;为您带来一场前所未有的沉浸式自然之旅。 步入博物馆&#xff0c;您手中的AR相机将成为您的更佳向导。自然博物…

如何合并pdf文件?告别软件,教你用python轻松解决

首先安装相关库文件&#xff1a; pip install PyPDF2, tkinter 接着&#xff0c;定义合并pdf函数&#xff0c;使用了PdfMerger构建对象&#xff0c;输入pdf文件路径列表&#xff0c;以及输出文件夹路径 from PyPDF2 import PdfMergerdef merge_pdf(file_paths, output_dir…

【leetcode--30.串联所有单词的子串】

有没有一样喜欢看示例的&#xff0c;&#xff0c;看题目就觉得很难懂。大致就是words要进行排列组合&#xff0c;返回s中所有包含这个排列组合的首标。 顺完逻辑蛮好懂的&#xff0c;应该不算困难题&#xff0c;只是不知道用什么模块实现。 class Solution:def findSubstring…

python数据分析-连云港石化基地2023年用电量分析

接下来对连云港石化基地2023年用电量进行分析&#xff0c;首先导入数据分析基本的包&#xff1a; import pandas as pd import matplotlib.pyplot as plt# Load the data from the provided Excel files file_path1 data1.xlsx file_path2 data2.xlsxdata1 pd.read_excel(f…

网络学了点socket,写个聊天室,还得改进

目录 第一版: common 服务端: 客户端 第一版问题总结: 第二版 服务端: 客户端: 改进: Windows客户端 一些小问题 还可以进行的改进 这篇文章我就先不讲网络基础的东西了,我讲讲在我进行制作我这个拉跨聊天室中遇到的问题,并写了三版代码. 第一版: common #pragm…

使用 Keras 的 Stable Diffusion 实现高性能文生图

前言 在本文中&#xff0c;我们将使用基于 KerasCV 实现的 [Stable Diffusion] 模型进行图像生成&#xff0c;这是由 stable.ai 开发的文本生成图像的多模态模型。 Stable Diffusion 是一种功能强大的开源的文本到图像生成模型。虽然市场上存在多种开源实现可以让用户根据文本…

Linux磁盘分区使用情况查询

一、磁盘分区使用情况查询 1. 查询磁盘整体使用情况使用 df -h进行查询 如图我们可以了解到磁盘的一些大致的使用情况&#xff0c;注意当已用部分有超过80%使用的分区就意味着你需要进行磁盘的清理了。 2.查询指定的磁盘使用情况 使用指令 du -h 当不指定目录时&#xff0c;默…