1.查询构造器:Wrapper
QueryWrapper(LambdaQueryWrapper)和UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条
件。 MP3.x开始支持lambda表达式,LambdaQueryWrapper,LambdaUpdateWrapper支持 lambda 表达式的构造查询条件。
我们这里主要使用的是QueryWrapper这个类,它的父类AbstractWrapper实现了一个接口Compare<This, R>,在这个接口中,有大量用来拼接where子句中相关条件的方法。
1. allEq:基于map的相等
2. eq 等于 =
3. ne 不等于 <>
4. gt 大于 >
5. ge 大于等于 >=
6. lt 小于 <
7. le 小于等于 <=
8. between BETWEEN 值 1 AND 值 2
9. notBetween NOT BETWEEN 值 1 AND 值 2
10.like LIKE '%值%'
11.notLike NOT LIKE '%值%'
12.likeLeft LIKE '%值'
13.likeRight LIKE '值%'
14.isNull 字段 IS NULL
15.isNotNull 字段 IS NOT NULL
16.in 字段 IN (value1, value2, ...)
17.notIn 字段 NOT IN (value1, value2, ...)
18.inSql 字段 IN ( sql 语句 )
例: inSql("age", "1,2,3")--->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)19.notInSql 字段 NOT IN ( sql 语句 )
20.groupBy GROUP BY 字段
21.orderByAsc 升序 ORDER BY 字段, ... ASC
22.orderByDesc 降序 ORDER BY 字段, ... DESC
23.orderBy 自定义字段排序 orderBy(true, true, "id", "name")--->order by id ASC,name ASC
24.having 条件分组
25.or OR 语句,拼接 + OR 字段=值
26.and AND 语句,拼接 + AND 字段=值
27.apply 拼接 sql
28.last 在 sql 语句后拼接自定义条件
29.exists 拼接 EXISTS ( sql 语句 )
例 : exists("select id from table where age =
1")--->exists (select id from table where age = 1)30.notExists 拼接 NOT EXISTS ( sql 语句 )
31.nested 正常嵌套不带 AND 或者 OR
2.案例详解
这篇文章中所用到的数据库表、实体类,mapper接口均和上一篇文章(链接:https://blog.csdn.net/weixin_43823808/article/details/118412431)相同,所以这里不再给出代码了,只是这篇文章中,不再使用xml映射文件了。
我将使用Wrapper这个查询构造器来实现查询操作。
2.1 测试方法
@Test public void testAllEq() { QueryWrapper<Student> qw=new QueryWrapper<>(); //将查询条件封装到Map集合中,and Map<String,Object> map=new HashMap<>(); map.put("name","张三"); map.put("age",22); qw.allEq(map); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testAllEq2() { QueryWrapper<Student> qw=new QueryWrapper<>(); //将查询条件封装到Map集合中 Map<String,Object> map=new HashMap<>(); map.put("name","张三"); map.put("age",null); /** * 第二个参数为 true:处理null值,where条件中加入 字段 IS NULL * 为 false:直接忽略null值,不添加到where子句中 */ qw.allEq(map,true); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
qw.allEq(map,true)的执行结果
qw.allEq(map,false)的执行结果
@Test public void testEq() { QueryWrapper<Student> qw=new QueryWrapper<>(); //eq等于 qw.eq("name","李四"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testNe() { QueryWrapper<Student> qw=new QueryWrapper<>(); //ne不等于 qw.ne("name","李四"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testGt() { QueryWrapper<Student> qw=new QueryWrapper<>(); //gt大于,ge大于等于 //lt小于,le小于等于 qw.gt("age",25); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testBetween() { QueryWrapper<Student> qw=new QueryWrapper<>(); //between在两个值的范围之间(闭区间) //notBetween不在两个值范围之间(对应上面集合的补集) qw.between("age",30,36); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testLike() { QueryWrapper<Student> qw=new QueryWrapper<>(); //like 匹配值 "%值%" //notLike 不匹配 "%值%" qw.like("name","周"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testLikeLeft() { QueryWrapper<Student> qw=new QueryWrapper<>(); //likeLeft 匹配 like "%值" //likeRight 匹配 like "值%" qw.likeLeft("name","三"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testIsNull() { QueryWrapper<Student> qw=new QueryWrapper<>(); //isNull 判断字段值为 null //isNotNull 字段值不为 null qw.isNull("age"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testIn() { QueryWrapper<Student> qw=new QueryWrapper<>(); //in 在这个值列表中,在列表中的都是符合条件的。 //notIn 不在列表中的 // List<String> list=new ArrayList<>(); // list.add("张三"); // list.add("李四"); // qw.in("name",list); //下面这行等价于上面注释掉的四行 qw.in("name","张三","李四"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testInSql() { QueryWrapper<Student> qw=new QueryWrapper<>(); //inSql 常用来做子查询 类似 in() //notInSql 类似 notIn() qw.inSql("age","select age from student where id=2"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testGroupBy() { QueryWrapper<Student> qw=new QueryWrapper<>(); qw.select("status,count(*)"); //groupBy 基于多个字段分组 qw.groupBy("status"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testOrderByAsc() { QueryWrapper<Student> qw=new QueryWrapper<>(); //orderByAsc 按字段升序 //orderByDesc 按字段降序 //orderBy 每个字段指定排序方向 qw.orderByAsc("age"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testOr() { QueryWrapper<Student> qw=new QueryWrapper<>(); //or 连接条件用 or,默认是 and //and 连接条件用 and qw.eq("name","张三").or().eq("age",24); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testLast() { QueryWrapper<Student> qw=new QueryWrapper<>(); //last 拼接 sql 语句 qw.eq("name","张三").or().eq("age",24).last("limit 1"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
@Test public void testExists() { QueryWrapper<Student> qw=new QueryWrapper<>(); //exists 拼接 exists ( sql 语句 ) //notExists 是 exists 的相反操作 qw.exists("select id,name from student where age>36"); List<Student> students=mapper.selectList(qw); students.forEach( student -> System.out.println(student)); }
1.2 分页操作
首先添加分页插件,在原先的SSM中,我们需要在xml文件中使用<bean>标签进行声明配置;现在升级为了SpringBoot,就告别xml了,我们直接定义一个config包,在其中创建一个类,使用@Configuration注解标记该类为配置类,在其中使用@Bean注解就可以了。
package com.szh.mybatisplus.config; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * */ @Configuration public class MyConfig { //分页插件 @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
下面是测试方法。
@Test public void testPage() { QueryWrapper<Student> qw=new QueryWrapper<>(); qw.gt("age",20); qw.orderByAsc("id"); //设置分页的数据 IPage<Student> page=new Page<>(); page.setCurrent(1);//第1页 page.setSize(3);//每页3条记录 IPage<Student> result = mapper.selectPage(page, qw); List<Student> students = result.getRecords(); System.out.println("总页数:" + result.getPages()); System.out.println("总记录数:" + result.getTotal()); System.out.println("当前页码:" + result.getCurrent()); System.out.println("每页大小:" + result.getSize()); students.forEach( student -> System.out.println(student)); }