PlusMybatisPlus快速上手4——条件构造器Wrapper

发布于:2022-12-07 ⋅ 阅读:(740) ⋅ 点赞:(0)

MybatisPlus快速上手:

MybatisPlus快速上手1——MybatisPlus插件的介绍和整合
Mybatis快速上手2——通用的CRUD操作
PlusMybatisPlus快速上手3——相关配置

条件构造器 Wrapper

在MybatisPlus中,Wrapper接口的实现类关系如下(IDEA按CTRL+H):
在这里插入图片描述
可以看到,AbstractWrapper和AbstractChainWrapper是重点实现,接下来我们重点学习AbstractWrapper以及其子类。

说明:
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sql的 where 条件, entity 属性也用于生成 sql 的 where 条件 注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为

官方文档

allEq

说明

全部eq(或个别isNull)
个别参数说明: params :
key 为数据库字段名,
value 为字段值
null2IsNull : 为 true 则在 map 的 value 为 null 时调用 isNull 方法,为 false 时则忽略 value 为 null 的

//allEq方法
allEq(Map<R, V> params) 
allEq(Map<R, V> params, boolean null2IsNull) 
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
1: 
allEq({id:1,name:"老王",age:null}) 
---> id = 1 and name = '老王' and age is null2: 
allEq({id:1,name:"老王",age:null}, false) 
---> id = 1 and name = '老王

个别参数说明:
filter : 过滤函数,是否允许字段传入比对条件中 params 与
null2IsNull : 同上

allEq(BiPredicate<R, V> filter, Map<R, V> params) 
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) 
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
1: 
allEq((k,v) -> k.indexOf("a") > 0, {id:1,name:"老王",age:null}) 
---> name = '老王' and age is null2: 
allEq((k,v) -> k.indexOf("a") > 0, {id:1,name:"老王",age:null}, false) 
---> name = '老王'
测试用例
@Test
public void testAllEq(){
    Map<String,Object> params = new HashMap<>();
    params.put("name","张三");
    params.put("age",45);
    params.put("password",null);
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //对应的sql语句 SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE password = ? AND name = ? AND age = ?
	//wrapper.allEq(params);

    // 对应的sql语句 SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? AND age = ?
	//wrapper.allEq(params,false);   //false表示不用将null值当做查询的条件

    
    wrapper.allEq((k, v) -> (k.equals("age")|| k.equals("id")||k.equals("name")),params);
    //传入的 params 参数是否能被作为sql查询条件,取决于lambda表达式所对比之后的结果,即password!=age||id 则不会作为查询结果
    // 对应的sql语句 SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? AND age = ? 

    List<User> userList = mapper.selectList(wrapper);
    for (User user : userList) {
        System.out.println(user);
    }
}

基本比较操作

eq:等于 =
ne:不等于 <>
gt:大于 >
ge:大于等于 >=
lt:小于 <
le:小于等于 <=
between:BETWEEN 值1 AND 值2
notBetween:NOT BETWEEN 值1 AND 值2
in:字段 IN (value.get(0), value.get(1), …)
notIn:字段 NOT IN (v0, v1, …)

测试
@Test 
public void testEq() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
    wrapper.eq("password", "123456")
            .ge("age", 20)
            .in("name", "李四", "王五", "赵六");

    List<User> users = this.mapper.selectList(wrapper);
    for (User user : users) { System.out.println(user); 
    } 
}

模糊查询

like
- LIKE ‘%值%’
- 例: like(“name”, “王”) —> name like ‘%王%’

notLike
- NOT LIKE ‘%值%’
- 例: notLike(“name”, “王”) —> name not like ‘%王%’

likeLeft
- LIKE ‘%值’
- 例: likeLeft(“name”, “王”) —> name like ‘%王’

likeRight
- LIKE ‘值%’
- 例: likeRight(“name”, “王”) —> name like ‘王%’

测试用例
 @Test
 public void testLike(){
     QueryWrapper<User> wrapper = new QueryWrapper<>();

     //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name LIKE ? 
     wrapper.likeLeft("name","五");//Parameters: %五(String)

     List<User> userList = mapper.selectList(wrapper);
     for (User user : userList) {
         System.out.println(user);
     }
 }

排序

orderBy
- 排序:ORDER BY 字段, …
- 例: orderBy(true, true, “id”, “name”) —> order by id ASC,name ASC

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

测试用例
@Test
public void testOrderBy(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();

    //SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC 
    wrapper.orderByDesc("age");//按照年龄倒叙排序

    List<User> userList = mapper.selectList(wrapper);
    for (User user : userList) {
        System.out.println(user);
    }
}

逻辑查询

or
- 拼接 OR
- 主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)

and
- AND 嵌套
- 例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')

测试用例
@Test
public void testOr(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();

    //SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC
    //wrapper.eq("name","王五").eq("age",21);//条件之间为and关系
    wrapper.eq("name","王五").or().eq("age",21);//条件之间为or关系
    //Preparing: SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? OR age = ?
    
    List<User> userList = mapper.selectList(wrapper);
    for (User user : userList) {
        System.out.println(user);
    }
}

指定需要查询的字段 select

在 MybatisPlus 查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。

@Test
public void testSelect(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();

    //Preparing: SELECT id,name,age FROM tb_user WHERE name = ? OR age = ? 
    wrapper.eq("name","王五")
            .or()
            .eq("age",21)
            .select("id","name","age");//指定需要查询的字段

    List<User> userList = mapper.selectList(wrapper);
    for (User user : userList) {
        System.out.println(user);
    }
}
本文含有隐藏内容,请 开通VIP 后查看