1. 映射   28

学习过Mybatis的同学应该知道,Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现。

既然MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。

我们先来了解一下自动映射规则。

1.1 自动映射规则  29

【1】表名和实体类名映射 -> 表名user   实体类名User

【2】字段名和实体类属性名映射 -> 字段名name   实体类属性名name

【3】字段名下划线命名方式和实体类属性小驼峰命名方式映射 -> 字段名 user_email   实体类属性名 userEmail

MybatisPlus支持这种映射规则,可以通过配置来设置

map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射

map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射

映射和条件构造器_实体类

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

1.2 表映射  30-31

去数据库将user表名改为powershop_user

映射和条件构造器_字段_02

随便运行一个程序(单元测试中的UserMapper查询所有selectList方法),他说user表找不到

映射和条件构造器_字段_03

通过@TableName()注解指定映射的数据库表名,就会按照指定的表名进行映射

如:此时将数据库的表名改为powershop_user,要完成表名和实体类名的映射,需要将实体类名也要指定为powershop_user

映射和条件构造器_User_04

package com.powernode.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//数据库对应的实体类user   4
@Data  //生成set get方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
@TableName("powershop_user") //指定数据库中的powershop_user表和这个User实体类映射  30
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

映射和条件构造器_User_05

如果有很多实体类,对应到数据库中的很多表,我们不需要每个依次配置,只需要配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀,这里我们演示一下全局配置的效果

映射和条件构造器_字段_06

mybatis-plus:
  global-config:
    db-config:
      table-prefix: powershop_

再次运行一个程序,成功

映射和条件构造器_User_07

1.3 字段映射  32

将表中的name字段改为username

映射和条件构造器_实体类_08

执行一个程序,说name它找不到

映射和条件构造器_字段_09

什么场景下会改变字段映射呢?

当数据库字段和表实体类的属性不一致时

我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致

如:此时将数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使用@TableField()中指定的名称username进行拼接,完成查询

映射和条件构造器_字段_10

package com.powernode.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//数据库对应的实体类user   4
@Data  //生成set get方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
//@TableName("powershop_user") //指定数据库中的powershop_user表和这个User实体类映射  30
public class User {
    private Long id;
    @TableField("username") //指定表中的字段名和属性对应  32
    private String name;
    private Integer age;
    private String email;
}

映射和条件构造器_实体类_11

此时的SQL语句是这样的

SELECT id,username AS name,email FROM powershop_user

字段名和关键字相同时   33

我们在表中添加一个desc列

映射和条件构造器_User_12

【2】数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,例如:

SELECT  id,username AS name,age,email,desc  FROM powershop_user

这条语句直接进行查询的时候,会出现错误

Error querying database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc  FROM powershop_user' at line 1

原因是,desc属于关键字,不能直接用于sql查询,要解决这个问题,就需要将desc字段加上``符号,将他变为不是关键字,才能完成查询,那这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过@TableField()改变实体类的属性名称,将desc变为`desc`,就可以解决这个问题

映射和条件构造器_字段_13

package com.powernode.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//数据库对应的实体类user   4
@Data  //生成set get方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
//@TableName("powershop_user") //指定数据库中的powershop_user表和这个User实体类映射  30
public class User {
    private Long id;
    @TableField("username") //指定表中的字段名和属性对应  32
    private String name;
    private Integer age;
    private String email;
    @TableField("`desc`") //将desc字段变成普通字段  33
    private String desc;
}

映射和条件构造器_User_14

此时可以观察到,框架拼接生成的SQL语句的字段名称变为了`desc`,这样是可以正常完成查询的

1.4 字段失效  34

当数据库中有字段不希望被查询,我们可以通过@TableField(select = false)来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段

如:如果不想显示年龄信息,那么可以在age属性上添加这个注解,来隐藏这个字段

package com.powernode.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//数据库对应的实体类user   4
@Data  //生成set get方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
//@TableName("powershop_user") //指定数据库中的powershop_user表和这个User实体类映射  30
public class User {
    private Long id;
    @TableField("username") //指定表中的字段名和属性对应  32
    private String name;
    @TableField(select = false)//时age字段失效查询不到  34
    private Integer age;
    private String email;
    @TableField("`desc`") //将desc字段变成普通字段  33
    private String desc;
}

映射和条件构造器_字段_15

生成的SQL语句如下,通过查询生成的SQL语句,发现并没有拼接age字段

1.5 视图属性   35

在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段。

根据之前的经验,框架会默认将实体类中的属性作为查询字段进行拼接,那我们来思考,像这种视图字段,能够作为查询条件么,显示是不能的。因为数据库中没有这个字段,所以查询字段如果包含这个字段,SQL语句会出现问题。我们通过@TableField(exist = false)来去掉这个字段,不让他作为查询字段。

映射和条件构造器_User_16

package com.powernode.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//数据库对应的实体类user   4
@Data  //生成set get方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
//@TableName("powershop_user") //指定数据库中的powershop_user表和这个User实体类映射  30
public class User {
    private Long id;
    @TableField("username") //指定表中的字段名和属性对应  32
    private String name;
//    @TableField(select = false)//时age字段失效查询不到  34
    private Integer age;
    private String email;
//    @TableField("`desc`") //将desc字段变成普通字段  33
//    private String desc;

    //online属性在表中没有,但是我们有需要这个属性进行展示,所以使用TableField注解,  35
    // 去掉这个字段,不让他作为查询字段。
    @TableField(exist = false)
    private Integer online; //用户在线或不在线
}

映射和条件构造器_字段_17

可以看到查询结果中不包含该字段

1.6 小结  35

这一章节,我们讲解了MybatisPlus的映射规则,以及如果通过注解配置来改变这种映射规则。

2.  条件构造器  36

2.1 条件构造器介绍

之前我们进行的MybatisPlus的操作,没有涉及到条件查询,实际上在开发需求中条件查询是非常普遍的。接下来我们就来讲解如何使用MybatisPlus完成条件查询。

首先,想要使用MybatisPlus完成条件查询,基于面向对象的思想,万物皆对象,那么查询条件也需要使用对象来完成封装。我们先看一下,在MybatisPlus中,和条件有关的类有哪些,他们之间有什么关系,理清楚了这个,我们在传递条件对象的时候,就很清晰了。

2.1.1  Wrapper

抽象类,条件类的顶层,提供了一些获取和判断相关的方法

映射和条件构造器_字段_18

2.1.2 AbstractWrapper

抽象类,Wrapper的子类,提供了所有的条件相关方法


映射和条件构造器_实体类_19

2.1.3  AbstractLambdaWrapper

抽象类,AbstractWrapper的子类,确定字段参数为方法引用类型


映射和条件构造器_字段_20

2.1.4 QueryWrapper

类,AbstractWrapper的子类,如果我们需要传递String类型的字段信息,创建该对象


映射和条件构造器_User_21

2.1.5  LambdaQueryWrapper

类,AbstractLambdaWrapper的子类,如果我们需要传递方法引用方式的字段信息,创建该对象

映射和条件构造器_实体类_22

该图为以上各类的关系,我们在编写代码的时候,只需要关注QueryWrapper和LambdaQueryWrapper

映射和条件构造器_实体类_23

2.2  等值查询  37

2.2.1  eq  单条件 37-40

使用QueryWrapper对象,构建查询条件

QueryTest

package com.powernode;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.powernode.domain.User;
import com.powernode.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

//条件查询  37
@SpringBootTest
public class QueryTest {

    @Autowired
    private UserMapper userMapper;

    //等值查询eq  37
    @Test
    void eq(){
        //1.创建条件查询对象
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //2.设置查询条件,指定查询的字段和匹配的值
        queryWrapper.eq("name","Jack");
        //3.进行条件查询
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }

}

测试效果

映射和条件构造器_字段_24

我们思考如果每次都是自己进行字段名称的编写,有可能会出现名称写错的情况,怎么避免这种情况呢,我们可以使用LambdaQueryWrapper对象,在构建字段时,使用方法引用的方式来选择字段,这样做可以避免字段拼写错误出现问题。

代码如下:

QueryTest

//LambdaQueryWrapper的等值查询  38
    @Test
    void eq2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName,"Jack");
        User user = userMapper.selectOne(lambdaQueryWrapper);
        System.out.println(user);
    }

映射和条件构造器_User_25

还要考虑一种情况,我们构建的条件是从哪里来的?应该是从客户端通过请求发送过来的,由服务端接收的。在网站中一般都会有多个条件入口,用户可以选择一个或多个条件进行查询,那这个时候在请求时,我们不能确定所有的条件都是有值的,部分条件可能用户没有传值,那该条件就为null。

比如在电商网站中,可以选择多个查询条件。

映射和条件构造器_User_26

那为null的条件,我们是不需要进行查询条件拼接的,否则就会出现如下情况,将为null的条件进行拼接,筛选后无法查询出结果

QueryTest

//当查询条件为null时  39
    @Test
    void isNull(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName,null);
        User user = userMapper.selectOne(lambdaQueryWrapper);
        System.out.println(user);
    }

映射和条件构造器_字段_27

当然我们要解决这个问题,可以先判断是否为空,根据判断结果选择是否拼接该字段,这个功能其实不需要我们写,由MybatisPlus的方法已经提供好了。

QueryTest

 //优化当查询条件为null时  40
    @Test
    void isNull2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        String name = null;
        //name != null是空时将不作为查询条件  40
        lambdaQueryWrapper.eq(name != null,User::getName,name);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

映射和条件构造器_User_28

2.2.2 allEq  多条件 41

先演示一下如何通过多个eq,构建多条件查询

QueryTest

//多条件查询  41
    @Test
    void allEq1(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName,"Tom");
        lambdaQueryWrapper.eq(User::getAge,28);
        User user = userMapper.selectOne(lambdaQueryWrapper);
        System.out.println(user);
    }

映射和条件构造器_User_29

如果此时有多个条件需要同时判断,我们可以将这多个条件放入到Map集合中,更加的方便

QueryTest

//多条件查询2 41
    //一次通过map封装多个查询条件
    @Test
    void allEq2(){
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name","Tom");
        hashMap.put("age",28);

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.allEq(hashMap,false);//为true或者false,就是判断是否作为查询字段

        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    }

映射和条件构造器_实体类_30

allEq(Map<R, V> params, boolean null2IsNull)

参数params:表示传递的Map集合

参数null2IsNull:表示对于为null的条件是否判断isNull

2.2.3 ne  不等查询   43

//不等查询  43
    @Test
    void ne(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.ne(User::getName,"Tom");//名字不是tom的
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_31

映射和条件构造器_User_32

2.3 范围查询  44

2.3.1  gt 大于

//范围查询
    //大于
    @Test
    void gt(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        Integer age = 18;
        lambdaQueryWrapper.gt(User::getAge,age);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_33

2.3.2 ge  大于等于   45

//大于等于  45
    @Test
    void ge(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        Integer age = 18;
        lambdaQueryWrapper.ge(User::getAge,age);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_34

2.3.3 lt  小于  46

//小于  46
    @Test
    void lt(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        Integer age = 30;
        lambdaQueryWrapper.lt(User::getAge,age);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_35

2.3.4 le  小于等于  47

//小于等于  47
    @Test
    void le(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        Integer age = 30;
        lambdaQueryWrapper.le(User::getAge,age);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_36

2.3.5 between    48

//范围查询
    //在区间内  48
    @Test
    void between(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.between(User::getAge,18,30);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_37

2.3.6 notBetween   49

//不在区间范围  49
    @Test
    void notBetween(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notBetween(User::getAge,18,30);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_38

2.4  模糊查询  50

2.4.1   like 匹配的模糊查询  50

//模糊查询  50
    //like 模糊查询
    @Test
    void like(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(User::getName,"J");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_39

2.4.2 notLike 不匹配的模糊查询   51

//不匹配的模糊查询  51
    @Test
    void notLike(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notLike(User::getName,"J");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_40

2.4.3 likeLeft 左模糊匹配  52

//左模糊匹配  52
    //本方法的意思是,它左边是啥都行,最有表必须是e
    @Test
    void likeLeft(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.likeLeft(User::getName,"e");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_41

2.4.4 likeRight  右模糊匹配  53

//右模糊匹配  53
    @Test
    void likeRight(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.likeRight(User::getName,"J");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_42

2.5 判空查询  54

2.5.1  isNull   54

如果为空就获取,否则不获取

//判空查询  54
    @Test
    void isNull3(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.isNull(User::getName);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

因为我们数据库中的name字段没有为空的,所以获取为0

映射和条件构造器_User_43

2.5.2 isNotNull   54

如果为空就不获取,否则获取

//如果为空就不获取,否则获取   54
    @Test
    void isNotNull(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.isNotNull(User::getName);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_44

2.6 包含查询  55

2.6.1   in

//包含查询   55
    //字段=值 or 字段=值  -> in  55
    @Test
    void in(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        ArrayList<Integer> arrayList = new ArrayList<>();
        Collections.addAll(arrayList,18,20,22);
        lambdaQueryWrapper.in(User::getAge,arrayList);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_45

2.6.2 notIn   56

//字段!=值 and 字段!=值   -> notIn   56
    @Test
    void notIn(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        ArrayList<Integer> arrayList = new ArrayList<>();
        Collections.addAll(arrayList,18,20,22);
        lambdaQueryWrapper.notIn(User::getAge,arrayList);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_46

2.6.3 inSql   57

//包含查询
    //inSql支持sql语句  58
    @Test
    void inSql(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.inSql(User::getAge,"18,20,22");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_47

@Test
    void inSql2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.inSql(User::getAge,"select age from powershop_user where age > 20");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

映射和条件构造器_实体类_48

2.6.4 notInSql   58

@Test
    void notInSql(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notInSql(User::getAge,"18,20,22");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_49

@Test
    void notInSql2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notInSql(User::getAge,"select age from powershop_user where age > 20");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

映射和条件构造器_实体类_50

2.7  分组查询  60

2.7.1 groupBy

//分组查询  60
    @Test
    void groupBy(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //分组字段
        queryWrapper.groupBy("age");
        //查询字段
        queryWrapper.select("age,count(*) as field_count");
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        System.out.println(maps);
    }

拼接的SQL如下

映射和条件构造器_User_51

映射和条件构造器_User_52

2.8 聚合查询   61

2.8.1  having

//聚合查询  61
    @Test
    void having(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //分组字段
        queryWrapper.groupBy("age");
        //查询字段
        queryWrapper.select("age,count(*) as field_count");
        //聚合条件筛选
        queryWrapper.having("field_count = 1");
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        System.out.println(maps);
    }

拼接的SQL如下

映射和条件构造器_User_53

映射和条件构造器_字段_54

2.9 排序查询   62

2.9.1  orderByAsc  升序

//排序查询  62
    //升序
    @Test
    void orderByAsc(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.orderByAsc(User::getAge,User::getId);//先按照年龄排序,如果年龄一样再按照id排序
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_55

2.9.2 orderByDesc  降序   63

//降序
    @Test
    void orderByDesc(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.orderByDesc(User::getAge,User::getId);//先按照年龄排序,如果年龄一样再按照id排序
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_56

2.9.3 orderBy  自定义排序方式 64

//自定义排序降序   64
    @Test
    void orderBy(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //设置排序字段和排序的方式  参数1:如果排序字段的值为null的时候,是否还要作为排序字段参与排序  参数2:是否是升序排序  参数3:排序字段
        //线按照年龄升序,年龄一样按照id降序   64
        lambdaQueryWrapper.orderBy(true,true,User::getAge);
        lambdaQueryWrapper.orderBy(true,false,User::getId);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_57

2.10 func查询   65

可以根据不同的情况来选择拼接不同的查询条件

2.10.1   func

//func查询   65
    @Test
    void func(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //可能会根据不同的情况来选择拼接不同的查询条件
        lambdaQueryWrapper.func(userLambdaQueryWrapper -> {
            if (false){
                userLambdaQueryWrapper.eq(User::getId,1);
            }else {
                userLambdaQueryWrapper.ne(User::getId,1);
            }
        });
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_58

2.11 逻辑查询   66

2.11.1   and   66

// 逻辑查询  66
    @Test
    void and(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //年龄大于22小于30
        lambdaQueryWrapper.gt(User::getAge,22).lt(User::getAge,30); //and(条件)
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_59

and也可以进行嵌套   67

//and的嵌套操作   67
    @Test
    void and2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName,"wang")
                .and(i -> i.gt(User::getAge,26).or().lt(User::getAge,22));

        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_60

2.11.2  or   68

@Test
    void or(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.lt(User::getAge,20).or().gt(User::getAge,23);  //age < 20 || age > 23
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_61

OR嵌套   69

//or的嵌套  69
    @Test
    void or2(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper
                .eq(User::getName,"wang")
                .or(i -> i.gt(User::getAge,22).lt(User::getAge,26));
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_62

2.11.3 nested  70

直接将条件拼接在where后面

//70
    @Test
    void nested(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //名字是tom且年龄不是22
        lambdaQueryWrapper.nested(i -> i.eq(User::getName,"Tom").ne(User::getAge,22));
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_63

2.12  自定义条件查询   71

可以将我们所写的条件直接拼接在where后面

2.12.1  apply

//自定义条件查询   71
    @Test
    void apply(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.apply("id = 1");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_64

2.13 last查询  72

将传递一个字符串,可以将字符串拼接在sql语句的最后面

2.13.1 last  72

//将传递一个字符串,可以将字符串拼接在sql语句的最后面  72
    @Test
    void last(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.last("limit 0,2");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_User_65

2.14 exists查询   73

2.14.1   exists   73

//exists会根据子查询的结果来判断主查询是否保留  73
    @Test
    void exists(){
        //1.创建QueryWrapper对象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.构建查询条件
        //age没有等于188的,主查询数据不会保留
        lambdaQueryWrapper.exists("select id from powershop_user where age = 188");
        //3.查询
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_66

2.14.2 notExists   74

//与exists正好相反  74
    @Test
    void notExists(){
        //1.创建QueryWrapper对象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //2.构建查询条件
        lambdaQueryWrapper.notExists("select id from powershop_user where age = 18");
        //3.查询
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_实体类_67

2.15 字段查询   75

2.15.1 select   75

//查询字段  75
    @Test
    void select(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //查询时只有这两个字段会被查询出来
        lambdaQueryWrapper.select(User::getId,User::getName);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);
    }

拼接的SQL如下

映射和条件构造器_字段_68

2.16 小结  75

本章节讲解了条件查询中的各种查询操作,我们可以通过面向对象的形式,直接调用方法来完成mysql中的条件查询