万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • MyBatis

  • Spring-MyBatis

  • MyBatis-Plus

    • MyBaits Plus简介
    • MyBaits Plus快速入门
    • MyBaits Plus CURD
    • MyBaits Plus配置
    • Wrapper条件构造器
      • AbstractWrapper
      • 基本⽐较操作
      • 模糊查询
      • 排序
      • 逻辑查询
      • select
    • ActiveRecord
    • MyBaits Plus插件
    • MyBaits Plus拓展
    • MyBaits Plus代码生成器
  • MyBatis
  • MyBatis-Plus
2022-12-24
目录

Wrapper条件构造器

# Wrapper条件构造器

Wrapper条件构造抽象类在MP中非常重要,它实现类关系如下:

wrapper_interface.png

可以看到,AbstractWrapper和AbstractChainWrapper是重点实现,接下来我们重点学习AbstractWrapper以及其⼦类。官方学习文档 (opens new window)。

警告

不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输

  1. wrapper 很重
  2. 传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)
  3. 正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作
  4. 我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr

# AbstractWrapper

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

# allEq

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

全部eq(或个别isNull)。

  • 参数说明:
    • params : key为数据库字段名,value为字段值
    • null2IsNull : 为true则在map的value为null时调用 isNull 方法,为false时则忽略value为null的
  • 例子:
    • 例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
    • 例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'
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)
  • 参数说明:
    • filter : 过滤函数,是否允许字段传入比对条件中
    • params 与 null2IsNull : 同上
  • 例子:
    • 例1: allEq((k,v) -> k.contains("a"), {id:1,name:"老王",age:null})--->name = '老王' and age is null
    • 例2: allEq((k,v) -> k.contains("a"), {id:1,name:"老王",age:null}, false)--->name = '老王'

# 测试用例

@RunWith(SpringRunner.class)
@SpringBootTest
public class MPWrapperTest {

    @Autowired
    private UserMapper userMapper;

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

        Map<String, Object> params = new HashMap<>();
        params.put("name", "jack");
        params.put("age", "20");
        params.put("email", null);
//        wrapper.allEq(params); // SELECT id,name,age,email FROM user WHERE (name = ? AND age = ? AND email IS NULL)
//        wrapper.allEq(params, false); // SELECT id,name,age,email FROM user WHERE (name = ? AND age = ?)
        wrapper.allEq((k, v) -> (!k.equals("email")), params); // SELECT id,name,age,email FROM user WHERE (name = ? AND age = ?)

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

}

# 基本⽐较操作

Wrapper 支持基本比较操作,如下:

  • eq:等于 =
  • ne:不等于 <>
  • gt:⼤于 >
  • ge:⼤于等于 >=
  • lt:⼩于 <
  • le:⼩于等于 <=
  • between:BETWEEN 值1 AND 值2
  • notBetween:NOT BETWEEN 值1 AND 值2
  • in:字段 IN (v0, v1, ...)
  • notIn:字段 NOT IN (v0, v1, ...)

测试用例:

@Test
public void testQueryWrapperCompare() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("email", "test2@baomidou.com")
            .ge("age", 20)
            .in("name", "Jack", "Jone");
    // SELECT id,name,age,email FROM user WHERE (email = ? AND age >= ? AND name IN (?,?))
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

# 模糊查询

Wrapper 支持模糊查询,如下:

  • like:LIKE '%val%',例: like("name", "王") ---> name like '%王%'
  • notLike:NOT LIKE '%val%',例: notLike("name", "王") ---> name not like '%王%'
  • likeLeft:LIKE '%val',例: likeLeft("name", "王") ---> name like '%王'
  • likeRight:LIKE 'val%',例: likeRight("name", "王") ---> name like '王%'

测试用例:

@Test
public void testQueryWrapperLike() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("name", "J");
    // SELECT id,name,age,email FROM user WHERE (name LIKE %J%)
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

# 排序

  • 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 testQueryWrapperSort() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.orderByDesc("age");
    // SELECT id,name,age,email FROM user ORDER BY age DESC
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

# 逻辑查询

  • or:拼接 OR,主动调⽤ or 表示紧接着下⼀个⽅法不是⽤ and 连接! (不调⽤ or 则默认为使⽤ and 连接)
  • and:AND 嵌套,例: and(i -> i.eq("name", "李⽩").ne("status", "活着")) ---> and (name = '李 ⽩' and status <> '活着')

测试用例:

@Test
public void testQueryWrapperJoin() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name", "Jack").or().eq("age", 20);
    // SELECT id,name,age,email FROM user WHERE (name = ? OR age = ?)
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

# select

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

测试用例:

@Test
public void testQueryWrapperSelect() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.select("id", "name");
    // SELECT id,name FROM user
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

以上是Wrapper条件构造器的简单使用,如果你的jdk是1.8+版本,可以使用lambda语法,简化columns的写法。用法大同小异,这里不赘述,更多见官网。

上次更新: 5/30/2023, 11:23:39 PM
ActiveRecord

ActiveRecord→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式