每天玩转3分钟 MyBatis-Plus - 4. 高级查询(二)(条件构造器)
每天玩转3分钟 MyBatis-Plus - 1. 配置环境
每天玩转3分钟 MyBatis-Plus - 2. 普通查询
每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一)
每天玩转3分钟 MyBatis-Plus - 4. 高级查询(二)
代码下载:https://github.com/Jackson0714/study-mybatis-plus.git
mybatis-plus的查询功能非常强大, 上一篇,我们通过例题的方式讲解了mybatis-plus的高级查询功能:条件查询,这一篇我们继续以例题的方式讲解mybatis-plus的高级查询功能。
准备数据
DROP TABLE IF EXISTS user; CREATE TABLE user (user
id BIGINT(20) PRIMARY KEY NOT NULL COMMENT '主键',
name VARCHAR(30) DEFAULT NULL COMMENT '姓名',
age INT(11) DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
manager_id BIGINT(20) DEFAULT NULL COMMENT '直属上级id',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
CONSTRAINT manager_fk FOREIGN KEY (manager_id)
REFERENCES user (id)
) ENGINE=INNODB CHARSET=UTF8; DELETE FROM user; INSERT INTO user (id, name, age, email,manager_id,create_time) VALUES
(1, 'Jone', 18, 'test1@baomidou.com', null, '2020-01-01 14:20:20'),
(2, 'Jack', 20, 'test2@baomidou.com', 1, '2020-01-20 14:20:20'),
(3, 'Tom', 28, 'test3@baomidou.com', 2, '2020-01-15 14:20:20'),
(4, 'Sandy', 21, 'test4@baomidou.com', 2, '2020-01-12 14:20:20'),
(5, 'Billie', 24, 'test5@baomidou.com', 2, '2020-01-22 14:20:20');
User 表结构如下:
| id | name | age | manager_id | create_time | ||
|---|---|---|---|---|---|---|
| 1 | Jone | 18 | test1@baomidou.com | null |
|
|
| 2 | Jack | 20 | test2@baomidou.com | 1 |
|
|
| 3 | Tom | 28 | test3@baomidou.com | 2 |
|
|
| 4 | Sandy | 21 | test4@baomidou.com | 2 |
|
|
| 5 | Billie | 24 | test5@baomidou.com | 2 |
|
一、案例汇总(第二波)
1.1 查询创建日期为2020年1月15日并且直属上级的名字为J开头的
难度系数 ★★★★
二、案例讲解
1.1 查询创建日期为2020年1月15日并且直属上级的名字为J开头的
难度系数 ★★★★
考察 apply 和 inSql的用法
(1)先用sql 语句来试下怎么写
这里需要用到子查询,先查询出name为“J”开头的集合1,然后再查询出manger_id 与集合1中的id相等的集合
SELECT * FROM demo.user
WHERE date_format(create_time, '%Y-%m-%d') ='2020-01-15'
AND manager_id in (SELECT id FROM demo.user WHERE name LIKE 'J%');
(2)我们还可以用INNER JOIN来查询
SELECT user1.* FROM demo.user AS user1
INNER JOIN demo.user AS user2 ON user1.manager_id = user2.id
WHERE date_format(user1.create_time, '%Y-%m-%d') ='2020-01-15'
AND user2.name LIKE 'J%'
(3)在mabatis-plus中可以用“apply” 来实现动态拼接sql
apply有两种用法:
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
第一种有SQL注入的风险,稍后我们再介绍,先介绍第二种用法
queryWrapper.apply("date_format(create_time, '%Y-%m-%d')={0}","2020-01-15")
(4)子查询我们可以用inSql
inSql
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
字段 IN ( sql语句 )
例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
例题中的写法:
.inSql("manager_id", "select id from user where name like 'J%'");
(5)完整示例
/*
* 描述:例1.4 查询创建日期为2020年1月15日并且直属上级的名字为“J”开头的
* SQL语句方案一:SELECT * FROM demo.user where date_format(create_time, '%Y-%m-%d') ='2020-01-15' AND manager_id in (select id from user where name like 'J%');
* SQL语句方案二:SELECT user1.* FROM demo.user AS user1 INNER JOIN demo.user AS user2 ON user1.manager_id = user2.id WHERE date_format(user1.create_time, '%Y-%m-%d') ='2020-01-15' AND user2.name LIKE 'J%'
* 作者:博客园-悟空聊架构
* 时间:2019-01-29
* Github:https://github.com/Jackson0714/study-mybatis-plus.git
* 博客园:https://www.cnblogs.com/jackson0714
* */
@Test
public void testSelectByQueryWrapper4() {
System.out.println(("----- 查询创建日期为2020年1月15日并且直属上级的名字为“J”开头的 ------"));
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.apply("date_format(create_time, '%Y-%m-%d')='2020-01-15' or true or true") // SQL注入
queryWrapper.apply("date_format(create_time, '%Y-%m-%d')={0}","2020-01-15")
.inSql("manager_id", "select id from user where name like 'J%'");
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
查询日志:

SQL语句执行结果

(6)动态拼接中的SQL注入
apply的第一种写法,传入的参数是 '2020-01-15'
queryWrapper.apply("date_format(create_time, '%Y-%m-%d')='2020-01-15'")
如果传入的是 "'2020-01-15' or true or true",则apply写法如下:
queryWrapper.apply("date_format(create_time, '%Y-%m-%d')='2020-01-15' or true or true")
则拼接后的SQL语句如下:
SELECT id,name,age,email,manager_id,create_time FROM user
WHERE (date_format(create_time, '%Y-%m-%d')='2020-01-15' or true or true AND manager_id IN (select id from user where name like 'J%'))
执行该SQL语句,可以查询出所有user数据,造成隐私泄露。

每天玩转3分钟 MyBatis-Plus - 1. 配置环境
每天玩转3分钟 MyBatis-Plus - 2. 普通查询
每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一)
每天玩转3分钟 MyBatis-Plus - 4. 高级查询(二)
关注公众号:悟空聊架构,回复pmp,领取pmp资料!回复悟空,领取架构师资料!
作 者:悟空聊架构
出 处:http://www.cnblogs.com/jackson0714/
关于作者:专注于移动开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

悟空聊架构
关注我,带你每天进步一点点!
每天玩转3分钟 MyBatis-Plus - 4. 高级查询(二)(条件构造器)的更多相关文章
- mybatis中的高级查询
Mybatis作为一个ORM框架,肯定是支持sql高级查询的. 下面的一个案例来为大家详细讲解mybatis中的高级查询. 案例说明: 此案例的业务关系是用户,订单,订单详情与商品之间的关系. 以订单 ...
- 使用MyBatis的resultMap高级查询时常用的方式总结
以下内容已经通过楼主测试, 从pd设计数据库到测试完成, 之前楼主也没有过Mybatis 使用resultMap觉得有点乱,最近抽出时间总结了一下也算对MyBatis的resultMap进行一次系统的 ...
- 每天玩转3分钟 MyBatis-Plus - 2. 普通查询
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 mybatis-plus的查询功能非常强大, 这一篇,我们来看下mybati ...
- 每天玩转3分钟 MyBatis-Plus - 1. 配置环境
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 ...
- 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一)(条件构造器)
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询 代码下载:ht ...
- 每天玩转3分钟 MyBatis-Plus - 5. 高级查询(三)(条件构造器)
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...
- 每天玩转3分钟 MyBatis-Plus - 6. select 用法
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...
- MyBatis 高级查询环境准备(八)
MyBatis 高级查询 之前在学习 Mapper XML 映射文件时,说到 resultMap 标记是 MyBatis 中最重要最强大也是最复杂的标记,而且还提到后面会详细介绍它的高级用法. 听到高 ...
- MyBatis实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
随机推荐
- dotnet 通过 WMI 获取设备厂商
本文告诉大家如何通过 WMI 获取设备厂商 通过 Win32_ComputerSystem 可以获取电脑系统信息 通过下面代码可以获取 机器型号 和 制造厂商 var mc = "Win32 ...
- 2017.5.11 昨天晚上看fview直播坚果pro回放
对话1 彭林: 我以前也是产品经理,身为产品经理,你有没有感觉我们做出过什么之前不被人接受的东西,但是我们却坚持做了,并且得到的反响非常好. 朱萧木: 没有吧,我们没有做颠覆用户认知或者三观的特别 ...
- TestStand 界面重置【小技巧】
有几种情况可能会使用到这个功能: (1)当界面调整的很乱的时候 (2)当界面突然消失的时候(但是软件进程还在)--快捷键 Alt+V 会弹出菜单,再点击Reset UI Configuration即可 ...
- no supported authentication methods avaiable
在git(小乌龟)向github远程推送(push)文件是会报一个异常 no supported authentication methods avaiable 解决方法:因为git(小乌龟)和Git ...
- Kafka原理及应用(一)
一. Kafka简介 (1) 消息中间件的两种实现模式 JMS (Java Message Service) 对消息的发送和接收定义了两种模式: 点对点模式:消息的生产和消费者均只有一个,消息由生产者 ...
- 1092 最好吃的月饼 (20分)C语言
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种"最好吃"的月饼,那势必在吃货界引发一场腥风血雨-- 在这里我们用数字说话,给出全国各地各种月饼的 ...
- 1094 谷歌的招聘 (20 分)C语言
2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e ...
- 调试排错 - Java问题排查:Linux命令
本文原创,更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. Java 在线问题排查主要分两篇:本文是第一篇,通过linux常用命令排查.@pdai 文本操作 文本查找 - grep g ...
- DM7的SQL批量插入for、while方法
示例1,for用法: begin for i in 1...10000 loop insert into test values(i,i,'aaa',sysdate); if i mod 20 = 0 ...
- 使用tushare 库查阅交易日历
资料参考:https://tushare.pro/ 交易日历 接口:trade_cal描述:获取各大交易所交易日历数据,默认提取的是上交所 tushare的版本和更新: 执行命令: pip insta ...