MyBatis Plus之wrapper用法

一、条件构造器关系

在这里插入图片描述

条件构造器关系介绍:

绿色框:抽象类 abstract
蓝色框:正常 class 类,可 new 对象
黄色箭头:父子类关系,箭头指向为父类

wrapper介绍:

Wrapper :条件构造抽象类,最顶端父类

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

QueryWrapper :Entity 对象封装操作类,不是用lambda语法

UpdateWrapper : Update 条件封装,用于Entity对象更新操作

AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。

LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper

LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、项目实例

函数名说明举例
eq等于 =例:eq ( " name ", " 老叶 " ) —> name = ’ 老叶 ’
ne不等于 <>例:ne ( " name ", " 老叶 " ) —> name <> ’ 老叶 ’
gt大于 >例:gt ( " age ", 18 ) —> name > 18
ge大于等于 >=例:ge ( " age ", 18 ) —> name >= 18
lt小于 <例:lt ( " age ", 18 ) —> name < 18
le小于等于 <=例:le ( " age ", 18 ) —> name <= 18
betweenBetween 值1 and 值2例:between ( " age ", 18, 30 ) —> age between 18 and 30
notBetweenNOT Between 值1 and 值2例:notBetween ( " age ", 18, 30 ) —> age not between 18 and 30
likeLIKE ’ %值% ’例:like ( " name ", " 王 " ) —> name like ’ %王% ’
notLikeNOT LIKE ’ %值% ’例:notLike ( " name ", " 王 " ) —> name not like ’ %王% ’
likeLeftLIKE ’ %值 ’例:likeLeft ( " name ", " 王 " ) —> name like ’ %王 ’
likeRightLIKE ’ 值% ’例:likeRight ( " name ", " 王 " ) —> name like ’ 王% ’
isNull字段 IS NULL例:isNull ( " name " ) —> name is null
isNotNull字段 IS NOT NULL例:isNotNull ( " name " ) —> name is not null
in字段 IN (v0, v1, …)例:in ( " age ", {1, 2, …} ) —> age in (1, 2, …)
notIn字段 NOT IN (v0, v1, …)例:notIn ( " age ", {1, 2, …} ) —> age not in (1, 2, …)
inSql字段 IN ( sql语句 )inSql ( " id ", " select id from table where id < 3 " )
—> id in ( select id from table where id < 3 )
notInSql字段 NOT IN ( sql语句 )notInSql ( " id ", " select id from table where id < 3 " )
—> id not in ( select id from table where id < 3 )
groupBy分组:GROUP BY 字段, …例:groupBy ( " id ", " name " ) —> group by id, name
orderBy排序:ORDER BY 字段, …例:orderBy ( " id ", " name " ) —> order by id ASC, name DESC
orderByAsc排序:ORDER BY 字段, … ASC例:orderByAsc ( " id ", " name " ) —> order by id ASC, name ASC
orderByDesc排序:ORDER BY 字段, … DESC例:orderByDesc ( " id ", " name " ) —> order by id DESC, name DESC
havingHAVING ( sql语句 )例:having ( " sum ( age ) > { 0 } ", 11 ) —>having sum ( age ) > 11
or拼接 OR注意事项:
主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)
例:eq ( " id ", 1 ).or ().eq ( " name ", " 老王 " ) —> id = 1 or name = ’ 老王 ’
and嵌套 AND例:and ( i -> i.eq ( " name ", " 李白 " ).ne ( " status ", " 活着 " ) )
—> and ( name = ’ 李白 ’ and status <> ’ 活着 ’ )
nested正常嵌套,不带 AND 或者 OR例:nested ( i -> i.eq ( " name ", " 李白 " ).ne ( " status ", " 活着 " ) )
—> ( name = ’ 李白 ’ and status <> ’ 活着 ’ )
apply拼接 sql注意事项:
该方法可用于数据库函数 动态入参的 params 对应前面 sqlHaving 内部的 { index } 部分,这样是不会有 sql 注入风险的,反之会有!
例:apply ( " date_format ( dateColum, ’ %Y-%m-%d ’ ) = { 0 } ", " 2023-10-30 " )
—> date_format ( dateColumn, ’ %Y-%m-%d ’ ) = ’ 2023-10-30 ’
last无视优化规则直接拼接到 sql 的最后注意事项:
只能调用一次,多次调用以最后一次为准。有 sql 注入的风险,请谨慎使用
例:last ( " limit 1 " )
exists拼接 EXISTS ( sql语句 )例:exists ( " select id from table where age = 1 " )
—> exists ( select id from table where age = 1 )
notExists拼接 NOT EXISTS ( sql语句 )例:notExists ( " select id from table where age = 1 " )
—> not exists ( select id from table where age = 1 )

1、根据简单条件查询

    /*** 通过单个ID主键进行查询*/@Testpublic void selectById() {User user = userMapper.selectById(1094592041087729666L);System.out.println(user);}/*** 通过多个ID主键查询*/@Testpublic void selectByList() {List<Long> longs = Arrays.asList(1094592041087729666L, 1094590409767661570L);List<User> users = userMapper.selectBatchIds(longs);users.forEach(System.out::println);}/*** 通过Map参数进行查询*/@Testpublic void selectByMap() {Map<String, Object> params = new HashMap<>();params.put("name", "郑梓妍");params.put("age", 18);List<User> users = userMapper.selectByMap(params);users.forEach(System.out::println);}

2、Wrapper 条件构造器

MyBatis Plus 还提供了 Wrapper 条件构造器,具体使用请看如下代码:

	/*** 名字包含雨* 且年龄小于40* <p>* WHERE name LIKE '%雨%' AND age < 40*/@Testpublic void selectByWrapperOne() {QueryWrapper<User> wrapper = new QueryWrapper();wrapper.like("name", "雨").lt("age", 40);List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 名字包含雨* 且年龄大于20小于40* 且邮箱不能为空* <p>* WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL*/@Testpublic void selectByWrapperTwo() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 名字为王姓* 或者年龄大于等于25* 按照年龄降序排序,年龄相同按照id升序排序* <p>* WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC*/@Testpublic void selectByWrapperThree() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.likeRight("name", "王").or().ge("age", 25).orderByDesc("age").orderByAsc("id");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 查询创建时间为2019年2月14* 且上级领导姓王* <p>* WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')*/@Testpublic void selectByWrapperFour() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14").inSql("manager_id", "select id from user where name like '王%'");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 查询王姓* 且年龄小于40或者邮箱不为空* <p>* WHERE name LIKE '王%' AND ( age < 40 OR email IS NOT NULL )*/@Testpublic void selectByWrapperFive() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.likeRight("name", "王").and(qw -> qw.lt("age", 40).or().isNotNull("email"));List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 查询王姓* 且年龄大于20 、年龄小于40、邮箱不能为空* <p>* WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )*/@Testpublic void selectByWrapperSix() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.likeRight("name", "王").or(qw -> qw.between("age", 20, 40).isNotNull("email"));List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** (年龄小于40或者邮箱不为空) 并且名字姓王* WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'*/@Testpublic void selectByWrapperSeven() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email")).likeRight("name", "王");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 查询年龄为30、31、32* WHERE age IN (?,?,?)*/@Testpublic void selectByWrapperEight() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.in("age", Arrays.asList(30, 31, 32));List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}/*** 年龄为30、31、32* 查询一条数据* limit 1*/@Testpublic void selectByWrapperNine() {QueryWrapper<User> wrapper = Wrappers.query();wrapper.in("age", Arrays.asList(30, 31, 32)).last("limit 1");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

三、具体使用操作

注意:以下条件构造器的方法入参中的 column 均表示数据库字段

1、ge、gt、le、lt、isNull、isNotNull

@Test
public void testDelete() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("name").ge("age", 12).isNotNull("email");int result = userMapper.delete(queryWrapper);System.out.println("delete return count = " + result);
}
	update user set deleted = 1 where deleted = 0 and name is null and age >= ? and email is not null

2、eq、ne

selectOne 返回的是一条实体记录,当出现多条时会报错

@Test
public void testSelectOne() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "Tom");User user = userMapper.selectOne(queryWrapper);System.out.println(user);
}

3、between、notBetween

包含大小边界

@Test
public void testSelectCount() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.between("age", 20, 30);Integer count = userMapper.selectCount(queryWrapper);System.out.println(count);
}
	select count(1) from user where deleted = 0 and age Between 20 and 30

4、allEq

包含大小边界

@Test
public void testSelectList() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();Map<String, Object> map = new HashMap<>();map.put("id", 2);map.put("name", "Jack");map.put("age", 20);queryWrapper.allEq(map);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
	select id, name, age, email, create_time, update_time, deleted, version from user where deleted = 0 and name = 'Jack' and id = 2 and age = 20

5、like、notLike、likeLeft、likeRight

selectMaps 返回 Map 集合列表

@Test
public void testSelectMaps() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.notLike("name", "e").likeRight("email", "t");List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表maps.forEach(System.out::println);
}
	select id, name, age, email, create_time, update_time, deleted, version from user where deleted = 0 and name not like '%e%' and email like 't%'

6、in、notIn、inSql、notInSql、exists、notExists

in、notIn:

	notIn("age", {1,2,3}) ---> age not in (1,2,3)notIn("age", 1, 2, 3) ---> age not in (1,2,3)

inSql、notInSql:可以实现子查询

	inSql("age", "1,2,3") ---> age in (1,2,3)inSql("id", "select id from table where id < 3") ---> id in (select id from table where id < 3)
@Test
public void testSelectObjs() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//queryWrapper.in("id", 1, 2, 3);queryWrapper.inSql("id", "select id from user where id < 3");List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表objects.forEach(System.out::println);
}
	select id, name, age, email, create_time, update_time, deleted, version from user where deleted = 0 and id in (select id from user where id < 3)

7、or、and

这里使用的是 UpdateWrapper 不调用 or 则默认为使用 and 连接

@Test
public void testUpdate() {//修改值User user = new User();user.setAge(99);user.setName("Andy");//修改条件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.like("name", "h").or().between("age", 20, 30);int result = userMapper.update(user, userUpdateWrapper);System.out.println(result);
}
	update user set name = 'Andy', age = 99, update_time = ? where deleted = 0 and ((name like '%h%') or (age between 20 and 30))-- 名称包含’h‘,或名年龄在20到30岁之间

8、嵌套or、嵌套and

这里使用 lambda 表达式,or 中的表达式最后翻译成 sql 时会被加上圆括号

@Test
public void testUpdate2() {//修改值User user = new User();user.setAge(99);user.setName("Andy");//修改条件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.like("name", "h").or(i -> i.eq("name", "李白").ne("age", 20));int result = userMapper.update(user, userUpdateWrapper);System.out.println(result);
}
	update user set name = 'Andy', age = 99, update_time = ? where deleted = 0 and name like '%h%' or (name = '%李白%' and age <> 20)-- 名称包含’h‘,或名称包含‘李白’且年龄不等于20岁

9、orderBy、orderByDesc、orderByAsc

@Test
public void testSelectListOrderBy() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("id");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
	select id, name, age, email, create_time, update_time, deleted, version from user where deleted = 0 order by id desc

10、last

直接拼接到 sql 的最后
注意:只能调用一次,多次调用以最后一次为准,有 sql 注入的风险,请谨慎使用

@Test
public void testSelectListLast() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.last("limit 1");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
	select id, name, age, email, create_time, update_time, deleted, version from user where deleted = 0 limit 1

11、指定要查询的列

@Test
public void testSelectListColumn() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("id", "name", "age");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
	select id, name, age from user where deleted = 0

12、set、setSql

最终的 sql 会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中的字段

@Test
public void testUpdateSet() {//修改值User user = new User();user.setAge(99);//修改条件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.like("name", "h").set("name", "老李头") //除了可以查询还可以使用set设置修改的字段.setSql(" email = '123@qq.com'"); //可以有子查询int result = userMapper.update(user, userUpdateWrapper);
}
	update user set age = 99, update_time = ?, name = '老李头', email = '123@qq.com' where deleted = 0 and name like '%h%'

四、项目中的实际应用

实例1-- 包含 eq 相等的比较方法

在这里插入图片描述

实例2-- 包含 ge le 等比较方法;及分页查询

在这里插入图片描述

好事定律:每件事最后都会是好事,如果不是好事,说明还没到最后。

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

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

相关文章

mac m1下navicat执行mongorestore 到mongodb

首先&#xff0c;下载https://www.mongodb.com/try/download/mongocli 解压缩后 有可执行文件使用navicat打开 加载后再重新点击 选择 要恢复的文件即可

CDN加速技术海外与大陆优劣势对比

内容分发网络&#xff08;CDN&#xff09;是一项广泛应用于网络领域的技术&#xff0c;旨在提高网站和应用程序的性能、可用性和安全性。CDN是一种通过将内容分发到全球各地的服务器来加速数据传输的服务。本文将探讨使用CDN的优势以及国内CDN和海外CDN之间的不同优势和劣势。 …

【C语言】函数指针存疑调试及回调函数编写(结构体内的Callback回调函数传参和虚伪的回调函数__weak声明)

【C语言】函数指针存疑调试及回调函数编写&#xff08;结构体内的Callback回调函数传参和虚伪的回调函数__weak声明&#xff09; 文章目录 函数指针存疑调试函数指针函数调用 回调函数编写结构体内的回调函数虚伪的回调函数 附录&#xff1a;压缩字符串、大小端格式转换压缩字符…

数据结构——双向链表的实现

一、双向链表的结构 注意&#xff1a;双向链表又称带头双向循环链表 这⾥的“带头”跟前⾯我们说的“头节点”是两个概念&#xff0c;实际前⾯的在单链表阶段称呼不严 谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表⾥的头节点&#xff0c;实际…

MySQL---数据用户管理和索引

DDL&#xff1a;CTEATE DROP ALTER dml&#xff1a;对数据进行管理 update insert into delete truncate dpl&#xff1a;查询语句 select dcl&#xff1a;权限控制语句 grant revoke 数据库用户管理 创建用户 修改用户权限 删除用户 grant要在终端执行 创建用户 cr…

function函数指针和lamada的[]和[=]注意事项

在工作的过程中&#xff0c;lamda表达式的 重点&#xff1a; 1.function对象存储函数指针。 2.lamada表达式&和捕捉的方式 lamda传入引用&&#xff0c;导致作用域消失&#xff0c;最终报错 std::function<void()> pFun; void GetNum1(const std::function<…

企业在招标流程中面临的 6 大挑战

采购中的招标是一种采购策略&#xff0c;包括向不同的销售商/供应商询价&#xff08;RFQ&#xff09;和索取资料&#xff08;RFI&#xff09;&#xff0c;以比较其特点、价格和功能。 工作团队在招标采购流程中投入了数个小时&#xff0c;但在整个过程中仍不得不忍受失望和不适…

【抓包分析】通过ChatGPT解密还原某软件登录算法实现绕过手机验证码登录

文章目录 &#x1f34b;前言实现效果成品广告抓包分析一、定位加密文件二、编辑JS启用本地替换 利用Chatgpt进行代码转换获取计划任务id模拟数据请求最后 &#x1f34b;前言 由于C站版权太多&#xff0c;所有的爬虫相关均为记录&#xff0c;不做深入&#xff01; 今天发现gith…

数据结构 | 算法的时间复杂度和空间复杂度【详解】

数据结构 | 算法的时间复杂度和空间复杂度【详解】 文章目录 数据结构 | 算法的时间复杂度和空间复杂度【详解】1. 什么是数据结构&#xff1f;2. 什么是算法&#xff1f;3. 算法效率4. 时间复杂度4.1 时间复杂度的概念4.2 推导大O阶的方法&#xff1a;4.3 常见时间复杂度计算举…

Leetcode—274.H指数【中等】

2023每日刷题&#xff08;十三&#xff09; Leetcode—274.H指数 算法思想 参考自灵茶山艾府 实现代码 int minValue(int a, int b) {return a < b ? a : b; }int hIndex(int* citations, int citationsSize){int cnt[5001] {0};int i;for(i 0; i < citationsSize; …

SpringBoot 公司推广系统 公司广告系统

SpringBoot 公司推广系统 公司广告系统 系统功能 首页功能: 广告展示 方案列表 站内搜索 资讯 查看详细咨询 登录注册 收藏 咨询方案 在线客服实时聊天 后台管理功能: 系统管理分为: 用户管理 角色管理 客户管理 首页轮播管理 公告管理 方案管理: 方案管理 资讯管理: 类型管…

【C++项目】高并发内存池第五讲内存回收释放过程介绍

内存回收 1.ThreadCache2.CentralCache3.PageCache 项目源代码&#xff1a;高并发内存池 1.ThreadCache void ThreadCache::Deallocate(void* ptr, size_t size) {assert(ptr);assert(size < MAX_BYTES);//计算在哪号桶中&#xff0c;然后插入进去size_t index SizeClass…

c++ pcl 选取点云某一点反馈XYZ坐标的代码

看了看以前的代码&#xff0c;有一小段代码很有意思&#xff0c;是关于pcl点云处理的。 如有帮助&#xff0c;点赞收藏关注&#xff01;&#xff01;&#xff01; 读取点云数据&#xff0c;想可视化点云数据&#xff0c;并根据选择&#xff0c;实时显示点云的空间坐标数值。 接…

关于FreeTypeFont‘ object has no attribute ‘getsize‘问题的解决方案

引言 这个问题是在训练yolov5_obb项目遇到的&#xff0c;大概率又是环境问题。如下图&#xff1a; 解决方法 出现这个问题是Pillow版本太高了&#xff0c;下载低版本的&#xff1a; pip install Pillow9.5 OK&#xff01;

Java List Set Map

一、List 1.1 ArrayList 1.2 LinkedList 二、Set 2.1 HashSet 2.2 TreeSet 2.3 LinkedHashSet 三、Map 3.1 HashMap 3.2 TreeMap 3.3 LinkedHashMap 四、对比 类型底层结构重复null值场景备注查询删除新增ListArrayList动态数组可允许快速随机访问元素0(1)0(n)尾部增加0&a…

[已解决]虚拟机之前能正常上网,重启之后无法连接网络问题的解决方法

虚拟机之前网络正常&#xff0c;重启之后却始终连接不上网络。 找了许多方法&#xff0c;终于发现一种便捷有效的方法。 解决方法如下&#xff1a; 1、将网络模式更改为NAT模式., 2、打开终端窗口&#xff0c;输入如下命令。 sudo service network-manager stopsudo rm /var/l…

LeetCode | 17.04.消失的数字和189.旋转数组

LeetCode | 17.04.消失的数字和189.旋转数组 文章目录 LeetCode | 17.04.消失的数字和189.旋转数组17.04.消失的数字方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;方法二的代码方法三的代码 189.旋转数组思路一思路二思路三 17.04.消失的数字 OJ链接 这里题目要求…

10、电路综合-基于简化实频的宽带匹配电路设计方法

10、电路综合-基于简化实频的宽带匹配电路设计方法 网络综合和简化实频理论学习概述中的1-9介绍了SRFT的一些基本概念和实验方法&#xff0c;终于走到了SRFT的另一个究极用途&#xff0c;宽带匹配电路的设计。 1、之前的一些回顾与总结 之前也给出了一些电路综合的案例&…

实时定位和配送追踪:开发万岳同城外卖APP的关键技术特性

随着生活节奏的不断加快&#xff0c;外卖服务已经成为许多人日常生活中不可或缺的一部分。无论是工作日的午餐&#xff0c;还是周末的家庭聚会&#xff0c;外卖APP已经成为满足各种美食需求的首选方式。然而&#xff0c;同城外卖APP的成功不仅仅取决于美味的食物选择&#xff0…

leetCode 2578. 最小和分割 + 排序 + 贪心 + 奇偶分组(构造最优解)

2578. 最小和分割 - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所…