每天玩转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 email manager_id create_time
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

一、案例汇总(第二波)

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. 高级查询(二)(条件构造器)的更多相关文章

  1. mybatis中的高级查询

    Mybatis作为一个ORM框架,肯定是支持sql高级查询的. 下面的一个案例来为大家详细讲解mybatis中的高级查询. 案例说明: 此案例的业务关系是用户,订单,订单详情与商品之间的关系. 以订单 ...

  2. 使用MyBatis的resultMap高级查询时常用的方式总结

    以下内容已经通过楼主测试, 从pd设计数据库到测试完成, 之前楼主也没有过Mybatis 使用resultMap觉得有点乱,最近抽出时间总结了一下也算对MyBatis的resultMap进行一次系统的 ...

  3. 每天玩转3分钟 MyBatis-Plus - 2. 普通查询

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 mybatis-plus的查询功能非常强大, 这一篇,我们来看下mybati ...

  4. 每天玩转3分钟 MyBatis-Plus - 1. 配置环境

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 ...

  5. 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一)(条件构造器)

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询 代码下载:ht ...

  6. 每天玩转3分钟 MyBatis-Plus - 5. 高级查询(三)(条件构造器)

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...

  7. 每天玩转3分钟 MyBatis-Plus - 6. select 用法

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...

  8. MyBatis 高级查询环境准备(八)

    MyBatis 高级查询 之前在学习 Mapper XML 映射文件时,说到 resultMap 标记是 MyBatis 中最重要最强大也是最复杂的标记,而且还提到后面会详细介绍它的高级用法. 听到高 ...

  9. MyBatis实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

随机推荐

  1. url查找参数

    function GetUrlParam(paraName) { var url = document.location.toString(); var arrObj = url.split(&quo ...

  2. Linux 内核 /sys/class类

    我们在本章中要考察最后的设备模型概念是类.一个类是一个设备的高级视图, 它抽象出 低级的实现细节. 驱动可以见到一个 SCSI 磁盘或者一个 ATA 磁盘, 在类的级别, 它们都 是磁盘. 类允许用户 ...

  3. Simple Robot Gym - 101102I (思维)

    SaMer is building a simple robot that can move in the four directions: up (^), down (v), left (<) ...

  4. Visual Studio Team Services使用教程【4】:默认团队checkin权限修改

    2017.4.23之后建议朋友看下面的帖子 TFS2017 & VSTS 实战(繁体中文视频) Visual Studio Team Services(VSTS)与敏捷开发ALM实战关键报告( ...

  5. 在windows+nginx的curl操作请求超时的问题

    之前的项目在apache下进行本地curl操作的时候请求不会超时 后来要在nginx下开发的时候,我在项目中写一个curl操作的test.php文件,请求相同项目下的一个index.php文件,然后c ...

  6. DynamoDB的基本操作(一)

    一.创建表 1 var AWS = require("aws-sdk"); 2 AWS.config.update({ 3 region: "us-west-2" ...

  7. 解析GMT+N时区,返回日期类型

    涉及到正则表达式,时区转换. /** * * 按格式 yyyy-MM-dd HH:mm:ss 以指定GMT时区进行解析,返回对应的当前系统时区当地时间. * @param dateString  格式 ...

  8. TemplateMethodPattern(模板方法模式)-----Java/.Net

    一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式

  9. sql函数实用——字符函数(sqlserver与mysql对比)

    1.获取长度 sqlserver写法:关键字:len()    获取参数的字符数量 select  Len('aksjdhh')    输出结果 7 select len('张无忌ooo')   输出 ...

  10. 「洛谷P1231」教辅的组成 解题报告

    P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...