每天玩转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的高级查询功能。

准备数据

 1 DROP TABLE IF EXISTS user;
 2
 3 CREATE TABLE user (user
 4     id BIGINT(20) PRIMARY KEY NOT NULL COMMENT ‘主键‘,
 5     name VARCHAR(30) DEFAULT NULL COMMENT ‘姓名‘,
 6     age INT(11) DEFAULT NULL COMMENT ‘年龄‘,
 7     email VARCHAR(50) DEFAULT NULL COMMENT ‘邮箱‘,
 8     manager_id BIGINT(20) DEFAULT NULL COMMENT ‘直属上级id‘,
 9     create_time DATETIME DEFAULT NULL COMMENT ‘创建时间‘,
10     CONSTRAINT manager_fk FOREIGN KEY (manager_id)
11         REFERENCES user (id)
12 )  ENGINE=INNODB CHARSET=UTF8;
13
14 DELETE FROM user;
15
16 INSERT INTO user (id, name, age, email,manager_id,create_time) VALUES
17 (1, ‘Jone‘, 18, ‘[email protected]‘, null, ‘2020-01-01 14:20:20‘),
18 (2, ‘Jack‘, 20, ‘[email protected]‘, 1, ‘2020-01-20 14:20:20‘),
19 (3, ‘Tom‘, 28, ‘[email protected]‘, 2, ‘2020-01-15 14:20:20‘),
20 (4, ‘Sandy‘, 21, ‘[email protected]‘, 2, ‘2020-01-12 14:20:20‘),
21 (5, ‘Billie‘, 24, ‘[email protected]‘, 2, ‘2020-01-22 14:20:20‘);

User 表结构如下:

id name age email manager_id create_time
1 Jone 18 [email protected] null
2020-01-01 14:20:20
2 Jack 20 [email protected] 1
2020-01-20 14:20:20
3 Tom 28 [email protected] 2
2020-01-15 14:20:20
4 Sandy 21 [email protected] 2
2020-01-12 14:20:20
5 Billie 24 [email protected] 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来查询

1 SELECT user1.* FROM demo.user AS user1
2 INNER JOIN demo.user AS user2 ON user1.manager_id = user2.id
3 WHERE date_format(user1.create_time, ‘%Y-%m-%d‘) =‘2020-01-15‘
4 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

1 inSql
2 inSql(R column, String inValue)
3 inSql(boolean condition, R column, String inValue)
4 字段 IN ( sql语句 )
5 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
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     /*
 2      * 描述:例1.4 查询创建日期为2020年1月15日并且直属上级的名字为“J”开头的
 3      * 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%‘);
 4      * 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%‘
 5      * 作者:博客园-悟空聊架构
 6      * 时间:2019-01-29
 7      * Github:https://github.com/Jackson0714/study-mybatis-plus.git
 8      * 博客园:https://www.cnblogs.com/jackson0714
 9      * */
10     @Test
11     public void testSelectByQueryWrapper4() {
12         System.out.println(("----- 查询创建日期为2020年1月15日并且直属上级的名字为“J”开头的 ------"));
13         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
14         //queryWrapper.apply("date_format(create_time, ‘%Y-%m-%d‘)=‘2020-01-15‘ or true or true") // SQL注入
15         queryWrapper.apply("date_format(create_time, ‘%Y-%m-%d‘)={0}","2020-01-15")
16                 .inSql("manager_id", "select id from user where name like ‘J%‘");
17         List<User> userList = userMapper.selectList(queryWrapper);
18         userList.forEach(System.out::println);
19     }

查询日志:

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%‘)) 

原文地址:https://www.cnblogs.com/jackson0714/p/study-mybatis-plus4.html

时间: 2024-11-12 13:19:24

每天玩转3分钟 MyBatis-Plus - 4. 高级查询(二)(条件构造器)的相关文章

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

以下内容已经通过楼主测试, 从pd设计数据库到测试完成, 之前楼主也没有过Mybatis 使用resultMap觉得有点乱,最近抽出时间总结了一下也算对MyBatis的resultMap进行一次系统的学习, 希望与大家分享学习心得, 有说的不对的地方请大家帮指教 下面是PD设计的几张数据库模型 先说下表吧 多对多 采用 传统而经典的 用户角色表,并没有采用当今流行的联合主键方式 而是将 用户表_id 和 角色表_id 进行Unique 详情参见http://www.cnblogs.com/Yin

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

每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询 代码下载:https://github.com/Jackson0714/study-mybatis-plus.git mybatis-plus的查询功能非常强大, 上一篇,我们介绍了mybatis-plus的普通查询功能,这一篇我们介绍mybatis-plus的高级查询功能.通过几个查询需求来讲解. 准备数据 U

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

每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转3分钟 MyBatis-Plus - 4. 高级查询(二) 每天玩转3分钟 MyBatis-Plus - 5. 高级查询(三) 每天玩转3分钟 MyBatis-Plus - 6. select 查询 代码下载:https://github.com/Jackson0714/study-mybatis-

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

Mybatis学习记录(四)--高级查询和缓存

这些都是连贯的学习笔记,所以有的地方因为之前都说过,所以也就没怎么写详细了,看不太明白的可以看看之前的笔记. 一.高级查询 高级查询主要是一对一查询,一对多查询,多对多查询 1.一对一查询 有用户和订单两个表,用户对订单是1对1查询.也就是订单中有一个外键是指向用户的. 先创建实体类: User.java public class User { private int id; private String username; private String password; private St

终结篇:MyBatis原理深入解析(二)

8 MyBatis数据源与连接池# 8.1 MyBatis数据源DataSource分类## MyBatis数据源实现是在以下四个包中: MyBatis数据源实现包 MyBatis把数据源DataSource分为三种: UNPOOLED 不使用连接池的数据源 POOLED 使用连接池的数据源 JNDI 使用JNDI实现的数据源 即: MyBatis三种数据源 相应地,MyBatis内部分别定义了实现了java.sql.DataSource接口的UnpooledDataSource,PooledD

1分钟让别人喜欢你(二)

1分钟让别人喜欢你(二) 第4章 至关重要的第一印象 1.  一个人永远不会有第二次机会给人以第一印象. 2.  我们都会有这样的感觉:与陌生人第一次接触后,就能大概判断出他(她)的性格是内向还是外向,是善谈还是寡言. 3.  现代心理学表明:当人们根据一系列信息去认识某一对象时,最初得到的信息比以后得到的信息占有压倒的优势. 4.  在现实生活中,人们对你形成的某种第一印象,通常难以改变.而且,人们还会寻找更多的理由去支持这种印象. 5.  如何建立美好的第一印象? 第一印象决定于第一次见面时

Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm

这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 项目开发中,在做Mybatis动态查询时,遇到了一个问题:MySQL在进行LIKE模糊查询时,输入英文可以正常检索出结果,但是输入中文后检索得到的结果为空. 由于是使用GET方式请求,所以为了确保中文不乱码,在控制台接收到请求参数后,对中文进行了一次编码. ? 1 2 3 4 5 try { realName = new String(realNam

MyBatis学习总结_13_Mybatis查询之resultMap和resultType区别

MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,将数据库中列数据复制到对象的相应属性上,可以用于复制查询,两者不能同时用. 1.resultType 返回单个实例 <select id="selectUser" parameterType="int" resu