MybatisPlus Wrapper构造器(查询篇)

笔记:* 依赖MybatisPlus 3.5.5* 自动映射:a) 表名和实体类的映射 -> t_stu 表 Student 实体类:1.当表名和实体类名不一样的时候再实体类类名上加上@TableName注解@TableName("t_stu")2.也可以在配置文件中配置数据库表名的前缀,配置之后只要类名称与表名一致就无需@TableName注解mybatis-plus.global-config.db-config.table-prefix: tb_b) 字段名和实体类属性名(不是变量名,属性名是get/set方法中的setStuName中的StuName)的映射c) 字段名下划线命名方式和实体类属性小驼峰命名方式映射:mybatis-plus.configuration.map-underscore-to-camel-case: trued) 字段映射:1.字段名称与实体类属性名称不一致时,使用@TableField注解指定字段的名称即可完成封装@TableField(value= "XXX")2.字段失效,不希望该属性被查询,隐藏这个字段@TableField(select= false)e) 视图属性:有些字段不需要数据库存储,但需要展示,实体类中有这个有这个属性但数据库中不存在,叫视图属性。@TableField(exist = false)* 查询:(条件构造器、等值查询、范围查询、判断为空、包含查询、分组查询、聚合查询、排序查询、func查询、逻辑查询、自定义条件查询、last查询、exists查询、字段查询)1.条件构造器介绍(自己看源码):Wrapper、AbstractWrapper、AbstractLambdaWrapper、QueryWrapper、LambdaQueryWrapper:a) Wrapper抽象类、子类是AbstractWrapperb) AbstractWrapper抽象类、子类是AbstractLambdaWrapper、QueryWrapperc) AbstractLambdaWrapper抽象类、子类是LambdaQueryWrapperd) QueryWrapper(重点掌握)继承于AbstractWrapper,非抽象类,字符串方式表示字段,创建该类对象。继承AbstractWrappere) LambdaQueryWrapper(重点掌握)继承于AbstractLambdaWrapper,非抽象类,方法引用方式表示字段,创建该类对象2.等值(eq)/不等值(ne)查询:a) 单个等值条件查询:QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("stu_name", "张三");LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();lambdaQueryWrapper.eq(Student::getStuName, "张三");* 如果传递参数的值为null,将不作为查询条件(当参数不为null的时候作为查询条件)lambdaQueryWrapper.eq("param" != null, Student::getStuName, null);b) 多个条件查询,再加一个eq(),或者使用allEq(Map)或者allEq(Map, false),后者设置false表示为null的字段舍弃,不进行查询。c) 范围查询:大于(gt): lambdaQueryWrapper.gt(Student::getStuAge, 18);大于等于(ge): lambdaQueryWrapper.ge(Student::getStuAge, 18);小于(lt): lambdaQueryWrapper.lt(Student::getStuAge, 18);小于等于(le): lambdaQueryWrapper.le(Student::getStuAge, 18);范围之间(between): lambdaQueryWrapper.between(Student::getStuAge, 18, 50);不在范围之间(notBetween): lambdaQueryWrapper.notBetween(Student::getStuAge, 18, 50);d) 模糊查询:like/notLike/likeLeft/likeRight/notLikeLeft/notLikeRight等lambdaQueryWrapper.like(Student::getStuName, "张");.......e) 判空查询:isNull/isNotNulllambdaQueryWrapper.isNull(Student::getStuName, "张");.....f) 包含查询: in/notIn/inSqlin/notIn:ArrayList<Integer> arrayList = new ArrayList<>();Collections.addAll(arrayList, 18,50,12);lambdaQueryWrapper.in(Student::getStuAge, arrayList);lambdaQueryWrapper.notIn(Student::getStuAge, arrayList);inSql: notInSql 反之ArrayList<Integer> arrayList = new ArrayList<>();Collections.addAll(arrayList, "18,50,13");demo1:lambdaQueryWrapper.inSql(Student::getStuAge, arrayList);demo2: 还可以传sql语句查询的结果lambdaQueryWrapper.inSql(Student::getStuAge, "select stu_age from t_stu where stu_age > 20");g) 分组查询:假设数据库的分组语句:select stu_sex,count(*) as sex_count from t_stu group by stu_sex;QueryWrapper queryWrapper = new QueryWrapper();// 指定分组的字段queryWrapper.groupBy("stu_sex");// 展示的字段queryWrapper.select("stu_sex,count(*) as sex_count");// 查询结果List<Map<String, Object>> list = studentMapper.selectMaps(queryWrapper);h) 聚合查询:假设数据库的分组语句(不能使用where):select stu_sex,count(*) as sex_count from t_stu group by stu_sex having sex_count > 3;QueryWrapper queryWrapper = new QueryWrapper();// 指定分组的字段queryWrapper.groupBy("stu_sex");// 展示的字段queryWrapper.select("stu_sex,count(*) as sex_count");// 聚合条件筛选queryWrapper.having("sex_count >3");// 查询结果List<Map<String, Object>> list = studentMapper.selectMaps(queryWrapper);i) 排序查询: asc/desc1.orderByAsc:LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();// 指定一个字段lambdaQueryWrapper.orderByAsc(Student::getStuAge);// 指定两个字段//lambdaQueryWrapper.orderByAsc(Student::getStuAge, Student::getId);studentMapper.selectList(lambdaQueryWrapper);2.orderByDesc ===> 同上 orderByAsc改为orderByDesc3.orderByorderBy(boolean condition, boolean isAsc, R column);a) condition – 执行条件,如果排序字段的值为null的时候, 是否还要作为排序字段b) isAsc – 是否是 ASC 排序c) column – 单个字段lambdaQueryWrapper.orderBy(true,true,Student::getStuAge);j) func查询:内嵌逻辑查询LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();// 拼接不同的查询条件lambdaQueryWrapper.func(studentLambdaQueryWrapper -> {// 根据自己实际情况来做判断if (true) {studentLambdaQueryWrapper.gt(Student::getStuAge, 30);} else {studentLambdaQueryWrapper.gt(Student::getStuAge, 10);}});studentMapper.selectList(lambdaQueryWrapper);k) 逻辑查询: and/ora) and逻辑查询,sql: select * from t_stu where stu_age > 10 and stu_age < 30;LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();lambdaQueryWrapper.gt(Student::getStuAge, 10).lt(Student::getStuAge, 30);studentMapper.selectList(lambdaQueryWrapper);b) and嵌套查询,sql: select * from t_stu where stu_sex = '女' and (stu_age> 18 or stu_age < 25);lambdaQueryWrapper.eq(Student::getStuSex, "女").and(studentLambdaQueryWrapper -> {studentLambdaQueryWrapper.gt(Student::getStuAge, 18).or().lt(Student::getStuAge, 25);});studentMapper.selectList(lambdaQueryWrapper);c) or逻辑查询:lambdaQueryWrapper.lt(Student::getStuAge, 30).or().gt(Student::getStuAge, 10);studentMapper.selectList(lambdaQueryWrapper);d) or内嵌套查询与and嵌套查询......e) nested逻辑查询: where后面拼接多个条件lambdaQueryWrapper.nested(i -> i.eq(Student::getStuName, "小舞").ne(Student::getStuAge, 40).eq(Student::getStuSex, "女"));拼接后的Sql: WHERE ((stu_name = ? AND stu_age <> ? AND stu_sex = ?))l) 自定义条件查询apply:直接写sql语句lambdaQueryWrapper.apply("id < 5");拼接后的Sql: WHERE (id < 5)m) last查询: 也是拼接字符串,拼接在SQL语句的最后面lambdaQueryWrapper.last("limit 0,3");拼接后的Sql: FROM t_stu limit 0,3n) exists查询:Sql: select * from t_stu where exists (select id from t_stu where stu_age = 1000);主查询: select * from t_stu子查询: (select id from t_stu where stu_age = 1000)当我们的子查询出的结果有值/结果集的时候,exists函数返回true,否者falseselect * from t_stu where true // 能讲所有数据查询出来select * from t_stu where false // 查询结果无数据1.exists函数返回的是boolean// 构建查询条件lambdaQueryWrapper.exists("select id from t_stu where stu_age = 18");拼接后的Sql: WHERE (EXISTS (select id from t_stu where stu_age = 18))2.notExists相反o) 字段查询:// select 查询要展示的字段lambdaQueryWrapper.select(Student::getId, Student::getStuAge,Student::getStuName);打印出的Sql: SELECT id,stu_age,stu_name FROM t_stu

分页

1.创建一个拦截器。给sql语句增加一个拦截器,然后把分页语句/参数拼接上去a) 创建mybatisPlus配置文件MybatisPlusConfig,在配置文件中添加分页插件// 官网 https://baomidou.com/pages/97710a/#%E6%94%AF%E6%8C%81%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}b) 测试:方式一LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper<>();// 指定一个分页对象,包含对象的分页信息 IPage// long current 当前页, long size 每页显示条数// Page 是 IPage的接口实现类IPage<Student> studentPage = new Page<>(1, 3);// 执行查询IPage<Student> iPage = studentMapper.selectPage(studentPage, lambdaQueryWrapper);// 获取分页查询的信息System.out.println("当前页: " + iPage.getCurrent());System.out.println("每页显示的条数: " + iPage.getSize());System.out.println("总条数: " + iPage.getTotal());System.out.println("总页数: " + iPage.getPages());// 接受查询的结果List<Student> records = iPage.getRecords();records.forEach(i -> System.out.println(i));c) 测试:方式二1. Mapper层:// 自定义Sql查询IPage<Student> selectByStuName(IPage<Student> page, String stuName);2. XML:<select id="selectByStudentName" resultType="Student">select * from t_stu where stu_name = #{stuName}</select>3.运行:@Testvoid test02() {IPage<Student> studentPage = new Page<>(1,5);IPage<Student> iPage = studentMapper.selectByStudentName(studentPage, "安妮");List<Student> students = iPage.getRecords();students.forEach(i -> System.out.println(i));}

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

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

相关文章

由vscode自动升级导致的“终端可以ssh服务器,但是vscode无法连接服务器”

问题描述 简单来说就是&#xff0c;ssh配置没动&#xff0c;前两天还可以用vscode连接服务器&#xff0c;今天突然就连不上了&#xff0c;但是用本地终端ssh可以顺利连接。 连接情况 我的ssh配置如下&#xff1a; Host gpu3HostName aaaUser zwx现在直接在终端中进行ssh&am…

ElastAlert 错误日志告警

文章目录 前言一、ElastAlert 概览1.1 简介1.2 ElastAlert 特性 二、ElastAlert 下载部署2.1 安装 Python3 环境2.2 下载 ElastAlert2.3 部署 ElastAlert 三、接入平台3.1 对外接口层3.2 服务层 前言 ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件&#xff0c;…

Stata学习(1)

一、五大窗口 Command窗口&#xff1a;实现人机交互 来导入一个自带数据&#xff1a; sysuse是导入系统自带的数据&#xff0c;auto导入该数据的名称&#xff0c;后面的clear是清除之前的数据 结果窗口&#xff1a;展示计算结果、查找功能 在Edit的find可以实现查找功能&#…

(30)数组元素和与数字和的绝对差

文章目录 每日一言题目解题思路代码结语 每日一言 书籍便是这种改造灵魂的工具。人类所需要的&#xff0c;是富有启发性的养料。而阅读&#xff0c;则正是这种养料。——雨果 题目 题目链接&#xff1a;数组元素和与数字和的绝对差 给你一个正整数数组 nums 。 元素和 是 n…

Nacos安装,服务注册,负载均衡配置,权重配置以及环境隔离

1. 安装 首先从官网下载 nacos 安装包&#xff0c;注意是下载 nacos-server Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 下载完毕后&#xff0c;解压找到文件夹bin&#xff0c;文本打开startup.cmd 修改配置如下 然后双击 startup.cmd 启动 nacos服务&#xff0c;默认…

帕金森病的主要原因是什么?

帕金森病的主要原因目前尚不完全清楚&#xff0c;但多种因素可能与其发病有关。 首先&#xff0c;遗传因素是一个重要的影响因素。临床研究和统计数据显示&#xff0c;约有10%的帕金森病患者存在家族史&#xff0c;这表明遗传因素在帕金森病发病中起着重要作用。一些家族研究显…

【经验分享】如何高效管理Jmeter的接口测试用例?

Test Fragment 测试片段元素是控制器上的一个种特殊的线程组&#xff0c;它在测试树上与线程组处于一个层级。它与线程组有所不同&#xff0c;它不被执行&#xff0c;当它是一个模块控制器或者是被控制器所引用时才会被执行 添加Test Fragment的步骤&#xff1a; 目前接口的组…

深入理解C#中的事件驱动编程

深入理解C#中的事件驱动编程 在现代软件开发中&#xff0c;事件驱动编程是一种常见且强大的范式&#xff0c;它允许不同的系统组件以松耦合的方式进行交互。特别是在C#中&#xff0c;事件是实现这种编程范式的核心机制之一。本文将深入探讨C#中的事件&#xff0c;包括它们的定…

微信小程序的图片色彩分析,窃取主色调,调色板

1、在微信小程序中创建包管理器 package.json npm init -y 2、安装 Mini App Color Thief 包 npm i --save miniapp-color-thief 3、构建 npm 4、wxml <canvas canvas-id"myCanvas"></canvas> <button bindtap"chooseImage">chooseIm…

MATLAB语音去噪系统

目录 一、背景 二、GUI页面 三、程序 3.1 LMS滤波程序 3.2 GUI程序 四、附录 一、背景 本文介绍了一种最佳的自适应滤波器结构&#xff0c;该结构采用最小均方差&#xff08;LMS&#xff09;作为判据&#xff0c;通过不断迭代自适应结构来调整得到最佳滤波器…

如何使用 Python 3 中的 Requests 和 Beautiful Soup 处理 Web 数据

简介 网络为我们提供了比我们能阅读和理解的更多数据&#xff0c;因此我们经常希望以编程方式处理这些信息&#xff0c;以便理解它。有时&#xff0c;网站创建者通过 .csv 或逗号分隔值文件或通过 API&#xff08;应用程序编程接口&#xff09;向我们提供这些数据。其他时候&a…

.net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken

在VB.NET中&#xff0c;您可以使用Newtonsoft.Json程序包来处理JSON数据。为了方便获取多级JSON数据&#xff0c;您可以使用JObject类的SelectToken方法。以下是一个示例代码&#xff1a; Imports Newtonsoft.Json Imports Newtonsoft.Json.LinqPublic Sub Main()Dim jsonStrin…

前端常用代码整理(不断更新中)— js,jquery篇

1.随机函数代码 function getRandom(min, max) {return Math.floor(Math.random() * (max - min 1)) min}2.倒计时代码 let now new Date()// 2. 得到指定时间的时间戳let last new Date(这里写想要达到的时间)// 3. &#xff08;计算剩余的毫秒数&#xff09; / 1000 剩余…

【Linux】缓冲区与缓冲区的刷新策略

目录 1.缓冲区基础 1.1缓冲区的刷新策略 1.1.1三种刷新策略 1.1.2.两种强制刷新策略 2.用户级语言层缓冲区 2.1.默认在显示器输出 2.2.重定向到文件输出 2.3.write调用没有显示两份的原因 3.模拟实现文件缓冲区 3.1 myFileBuffer.h 3.2 myFileBuffer.c 4.系统内核缓…

Linux操作系统运维-Docker的基础知识梳理总结

Linux操作系统运维-Docker的基础知识梳理总结 docker用来解决不同开发人员软件调试时环境不统一的问题&#xff0c;保证了程序调试时运行环境的一致性。docker的设计理念便是一处镜像&#xff0c;处处运行&#xff0c;即通过产生用户软件&#xff0c;运行环境及其运行配置的统一…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

[C++] sqlite3_get_table 的使用

不知道为啥 sqlite3 里面使用 “UPDATE” 更新数据&#xff0c;更新失败也不报错&#xff0c;所以就想绕过去。先查一下字段存在不存在&#xff0c;然后再update std::string selectsql "SELECT COUNT(*) FROM table_name WHERE some_condition"; char** dbResult;…

Linux下centos操作系统安装Mysql8.0过程及踩坑填补

我自己有一台服务器&#xff0c;之前安装的是MySQL5.5&#xff0c;现在我想升级为MySQL8.0&#xff0c;于是我干了以下操作,既有踩坑又有干货&#xff1a; 1.先卸载MySQL&#xff1b; 2.删除跟MySQL相关文件&#xff1b; 3.安装新的MySQL8.0版本&#xff08;这里踩了一个坑&…

Spring- FactoryBean接口中的getObject()方法

目录 一、Spring框架介绍 二、FactoryBean接口是什么 三、getObject()方法如何使用 一、Spring框架介绍 Spring框架是一个轻量级的、非侵入式的Java企业级应用开发框架&#xff0c;以IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为核心思…

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…