All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.mybatis.mapper.example.ExampleWrapper Maven / Gradle / Ivy

There is a newer version: 2.2.5
Show newest version
/*
 * Copyright 2020-2022 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.mybatis.mapper.example;

import io.mybatis.common.util.Assert;
import io.mybatis.mapper.BaseMapper;
import io.mybatis.mapper.fn.Fn;
import org.apache.ibatis.exceptions.TooManyResultsException;
import org.apache.ibatis.session.RowBounds;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 封装 Example 的查询条件,方便链式调用
 *
 * @param  实体类类型
 * @param  主键类型
 * @author liuzh
 */
public class ExampleWrapper {
  private final BaseMapper    baseMapper;
  private final Example          example;
  private       Example.Criteria current;

  public ExampleWrapper(BaseMapper baseMapper, Example example) {
    this.baseMapper = baseMapper;
    this.example = example;
    this.current = example.createCriteria();
  }

  /**
   * or 一组条件
   *
   * @return 条件
   */
  public ExampleWrapper or() {
    this.current = this.example.or();
    return this;
  }

  /**
   * 获取查询条件
   */
  public Example example() {
    return example;
  }

  /**
   * 清除条件,可重用
   */
  public ExampleWrapper clear() {
    this.example.clear();
    this.current = example.createCriteria();
    return this;
  }

  /**
   * 指定查询列
   *
   * @param fns 方法引用
   */
  @SafeVarargs
  public final ExampleWrapper select(Fn... fns) {
    this.example.selectColumns(fns);
    return this;
  }

  /**
   * 排除指定查询列
   *
   * @param fns 方法引用
   */
  @SafeVarargs
  public final ExampleWrapper exclude(Fn... fns) {
    this.example.excludeColumns(fns);
    return this;
  }

  /**
   * 设置起始 SQL
   *
   * @param startSql 起始 SQL,添加到 SQL 前,注意防止 SQL 注入
   */
  public ExampleWrapper startSql(String startSql) {
    this.example.setStartSql(startSql);
    return this;
  }

  /**
   * 设置结尾 SQL
   *
   * @param endSql 结尾 SQL,添加到 SQL 最后,注意防止 SQL 注入
   */
  public ExampleWrapper endSql(String endSql) {
    this.example.setEndSql(endSql);
    return this;
  }

  /**
   * 通过方法引用方式设置排序字段
   *
   * @param fn    排序列的方法引用
   * @param order 排序方式
   * @return Example
   */
  public ExampleWrapper orderBy(Fn fn, Example.Order order) {
    this.example.orderBy(fn, order);
    return this;
  }

  /**
   * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案
   *
   * @param orderByCondition 排序字符串(不会覆盖已有的排序内容)
   * @return Example
   */
  public ExampleWrapper orderBy(String orderByCondition) {
    this.example.orderBy(orderByCondition);
    return this;
  }

  /**
   * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案
   *
   * @param orderByCondition 排序字符串构造方法,比如通过数组集合循环拼接等
   * @return Example
   */
  public ExampleWrapper orderBy(Supplier orderByCondition) {
    this.example.orderBy(orderByCondition);
    return this;
  }

  /**
   * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案
   *
   * @param useOrderBy       条件表达式,true使用,false不使用 字符串排序
   * @param orderByCondition 排序字符串构造方法,比如通过数组集合循环拼接等
   * @return Example
   */
  public ExampleWrapper orderBy(boolean useOrderBy, Supplier orderByCondition) {
    return useOrderBy ? this.orderBy(orderByCondition) : this;
  }

  /**
   * 通过方法引用方式设置排序字段,升序排序
   *
   * @param fns 排序列的方法引用
   * @return Example
   */
  @SafeVarargs
  public final ExampleWrapper orderByAsc(Fn... fns) {
    this.example.orderByAsc(fns);
    return this;
  }

  /**
   * 通过方法引用方式设置排序字段,降序排序
   *
   * @param fns 排序列的方法引用
   * @return Example
   */
  @SafeVarargs
  public final ExampleWrapper orderByDesc(Fn... fns) {
    this.example.orderByDesc(fns);
    return this;
  }

  /**
   * 设置 distince
   */
  public ExampleWrapper distinct() {
    this.example.setDistinct(true);
    return this;
  }

  /**
   * 设置更新字段和值
   *
   * @param useSet 表达式条件, true 使用,false 不使用
   * @param setSql "column = value"
   */
  public ExampleWrapper set(boolean useSet, String setSql) {
    return useSet ? set(setSql) : this;
  }

  /**
   * 设置更新字段和值
   *
   * @param setSql "column = value"
   */
  public ExampleWrapper set(String setSql) {
    this.example.set(setSql);
    return this;
  }

  /**
   * 设置更新字段和值
   *
   * @param useSet 表达式条件, true 使用,false 不使用
   * @param fn     字段
   * @param value  值
   */
  public ExampleWrapper set(boolean useSet, Fn fn, Object value) {
    return useSet ? set(fn, value) : this;
  }


  /**
   * 设置更新字段和值
   *
   * @param useSet   表达式条件, true 使用,false 不使用
   * @param fn       字段
   * @param supplier 值构造函数
   */
  public ExampleWrapper set(boolean useSet, Fn fn, Supplier supplier) {
    return useSet ? set(fn, supplier.get()) : this;
  }


  /**
   * 设置更新字段和值
   *
   * @param fn    字段
   * @param value 值
   */
  public ExampleWrapper set(Fn fn, Object value) {
    this.example.set(fn, value);
    return this;
  }

  /**
   * 指定字段为 null
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   */
  public ExampleWrapper isNull(boolean useCondition, Fn fn) {
    return useCondition ? isNull(fn) : this;
  }

  /**
   * 指定字段为 null
   *
   * @param fn 字段对应的 get 方法引用
   */
  public ExampleWrapper isNull(Fn fn) {
    this.current.andIsNull(fn);
    return this;
  }

  /**
   * 指定字段不为 null
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   */
  public ExampleWrapper isNotNull(boolean useCondition, Fn fn) {
    return useCondition ? isNotNull(fn) : this;
  }

  /**
   * 指定字段不为 null
   *
   * @param fn 字段对应的 get 方法引用
   */
  public ExampleWrapper isNotNull(Fn fn) {
    this.current.andIsNotNull(fn);
    return this;
  }

  /**
   * 字段 = 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值
   */
  public ExampleWrapper eq(boolean useCondition, Fn fn, Object value) {
    return useCondition ? eq(fn, value) : this;
  }

  /**
   * 字段 = 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数
   */
  public ExampleWrapper eq(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? eq(fn, supplier.get()) : this;
  }

  /**
   * 字段 = 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值
   */
  public ExampleWrapper eq(Fn fn, Object value) {
    this.current.andEqualTo(fn, value);
    return this;
  }

  /**
   * 字段 != 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数
   */
  public ExampleWrapper ne(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? ne(fn, supplier.get()) : this;
  }

  /**
   * 字段 != 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值
   */
  public ExampleWrapper ne(boolean useCondition, Fn fn, Object value) {
    return useCondition ? ne(fn, value) : this;
  }

  /**
   * 字段 != 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值
   */
  public ExampleWrapper ne(Fn fn, Object value) {
    this.current.andNotEqualTo(fn, value);
    return this;
  }

  /**
   * 字段 > 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数
   */
  public ExampleWrapper gt(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? gt(fn, supplier.get()) : this;
  }

  /**
   * 字段 > 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值
   */
  public ExampleWrapper gt(boolean useCondition, Fn fn, Object value) {
    return useCondition ? gt(fn, value) : this;
  }

  /**
   * 字段 > 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值
   */
  public ExampleWrapper gt(Fn fn, Object value) {
    this.current.andGreaterThan(fn, value);
    return this;
  }

  /**
   * 字段 >= 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数
   */
  public ExampleWrapper ge(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? ge(fn, supplier.get()) : this;
  }

  /**
   * 字段 >= 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值
   */
  public ExampleWrapper ge(boolean useCondition, Fn fn, Object value) {
    return useCondition ? ge(fn, value) : this;
  }

  /**
   * 字段 >= 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值
   */
  public ExampleWrapper ge(Fn fn, Object value) {
    this.current.andGreaterThanOrEqualTo(fn, value);
    return this;
  }

  /**
   * 字段 < 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   */
  public ExampleWrapper lt(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? lt(fn, supplier.get()) : this;
  }

  /**
   * 字段 < 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值
   */
  public ExampleWrapper lt(boolean useCondition, Fn fn, Object value) {
    return useCondition ? lt(fn, value) : this;
  }

  /**
   * 字段 < 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值
   */
  public ExampleWrapper lt(Fn fn, Object value) {
    this.current.andLessThan(fn, value);
    return this;
  }

  /**
   * 字段 <= 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值
   */
  public ExampleWrapper le(boolean useCondition, Fn fn, Object value) {
    return useCondition ? le(fn, value) : this;
  }

  /**
   * 字段 <= 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数
   */
  public ExampleWrapper le(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? le(fn, supplier.get()) : this;
  }

  /**
   * 字段 <= 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值
   */
  public ExampleWrapper le(Fn fn, Object value) {
    this.current.andLessThanOrEqualTo(fn, value);
    return this;
  }

  /**
   * 字段 in (值集合)
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param values       值集合
   */
  @SuppressWarnings("rawtypes")
  public ExampleWrapper in(boolean useCondition, Fn fn, Iterable values) {
    return useCondition ? in(fn, values) : this;
  }

  /**
   * 字段 in (值集合)
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值集合构造函数
   */
  @SuppressWarnings("rawtypes")
  public ExampleWrapper in(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? in(fn, supplier.get()) : this;
  }

  /**
   * 字段 in (值集合)
   *
   * @param fn     字段对应的 get 方法引用
   * @param values 值集合
   */
  @SuppressWarnings("rawtypes")
  public ExampleWrapper in(Fn fn, Iterable values) {
    this.current.andIn(fn, values);
    return this;
  }

  /**
   * 字段 not in (值集合)
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param values       值集合
   */
  @SuppressWarnings("rawtypes")
  public ExampleWrapper notIn(boolean useCondition, Fn fn, Iterable values) {
    return useCondition ? notIn(fn, values) : this;
  }

  /**
   * 字段 not in (值集合)
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值集合构造函数
   */
  @SuppressWarnings("rawtypes")
  public ExampleWrapper notIn(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? notIn(fn, supplier.get()) : this;
  }

  /**
   * 字段 not in (值集合)
   *
   * @param fn     字段对应的 get 方法引用
   * @param values 值集合
   */
  @SuppressWarnings("rawtypes")
  public ExampleWrapper notIn(Fn fn, Iterable values) {
    this.current.andNotIn(fn, values);
    return this;
  }

  /**
   * 字段 between value1 and value 2
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value1       值1
   * @param value2       值2
   */
  public ExampleWrapper between(boolean useCondition, Fn fn, Object value1, Object value2) {
    return useCondition ? between(fn, value1, value2) : this;
  }

  /**
   * 字段 between value1 and value 2
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier1    值1构造函数
   * @param supplier2    值2构造函数
   */
  public ExampleWrapper between(boolean useCondition, Fn fn, Supplier supplier1, Supplier supplier2) {
    return useCondition ? between(fn, supplier1.get(), supplier2.get()) : this;
  }

  /**
   * 字段 between value1 and value 2
   *
   * @param fn     字段对应的 get 方法引用
   * @param value1 值1
   * @param value2 值2
   */
  public ExampleWrapper between(Fn fn, Object value1, Object value2) {
    this.current.andBetween(fn, value1, value2);
    return this;
  }

  /**
   * 字段 not between value1 and value 2
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value1       值1
   * @param value2       值2
   */
  public ExampleWrapper notBetween(boolean useCondition, Fn fn, Object value1, Object value2) {
    return useCondition ? notBetween(fn, value1, value2) : this;
  }

  /**
   * 字段 not between value1 and value 2
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier1    值1构造函数
   * @param supplier2    值2构造函数
   */
  public ExampleWrapper notBetween(boolean useCondition, Fn fn, Supplier supplier1, Supplier supplier2) {
    return useCondition ? notBetween(fn, supplier1.get(), supplier2.get()) : this;
  }

  /**
   * 字段 not between value1 and value 2
   *
   * @param fn     字段对应的 get 方法引用
   * @param value1 值1
   * @param value2 值2
   */
  public ExampleWrapper notBetween(Fn fn, Object value1, Object value2) {
    this.current.andNotBetween(fn, value1, value2);
    return this;
  }

  /**
   * 字段 like %值%
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值,两侧自动添加 %
   */
  public ExampleWrapper contains(boolean useCondition, Fn fn, String value) {
    return useCondition ? contains(fn, value) : this;
  }

  /**
   * 字段 like %值%
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数,两侧自动添加 %
   */
  public ExampleWrapper contains(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? contains(fn, supplier.get()) : this;
  }

  /**
   * 字段 like %值%
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值,两侧自动添加 %
   */
  public ExampleWrapper contains(Fn fn, String value) {
    this.current.addCriterion(fn.toColumn() + "  LIKE", "%" + value + "%");
    return this;
  }

  /**
   * 字段 like 值%,匹配 value 为前缀的值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值,右侧自动添加 %
   */
  public ExampleWrapper startsWith(boolean useCondition, Fn fn, String value) {
    return useCondition ? startsWith(fn, value) : this;
  }

  /**
   * 字段 like 值%,匹配 value 为前缀的值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数,右侧自动添加 %
   */
  public ExampleWrapper startsWith(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? startsWith(fn, supplier.get()) : this;
  }

  /**
   * 字段 like 值%,匹配 value 为前缀的值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值,右侧自动添加 %
   */
  public ExampleWrapper startsWith(Fn fn, String value) {
    this.current.addCriterion(fn.toColumn() + "  LIKE", value + "%");
    return this;
  }

  /**
   * 字段 like %值,匹配 value 为后缀的值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值,左侧自动添加 %
   */
  public ExampleWrapper endsWith(boolean useCondition, Fn fn, String value) {
    return useCondition ? endsWith(fn, value) : this;
  }

  /**
   * 字段 like %值,匹配 value 为后缀的值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数,左侧自动添加 %
   */
  public ExampleWrapper endsWith(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? endsWith(fn, supplier.get()) : this;
  }

  /**
   * 字段 like %值,匹配 value 为后缀的值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值,左侧自动添加 %
   */
  public ExampleWrapper endsWith(Fn fn, String value) {
    this.current.addCriterion(fn.toColumn() + "  LIKE", "%" + value);
    return this;
  }

  /**
   * 字段 like 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值,需要指定 '%'(多个), '_'(单个) 模糊匹配
   */
  public ExampleWrapper like(boolean useCondition, Fn fn, Object value) {
    return useCondition ? like(fn, value) : this;
  }

  /**
   * 字段 like 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数,需要指定 '%'(多个), '_'(单个) 模糊匹配
   */
  public ExampleWrapper like(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? like(fn, supplier.get()) : this;
  }

  /**
   * 字段 like 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值,需要指定 '%'(多个), '_'(单个) 模糊匹配
   */
  public ExampleWrapper like(Fn fn, Object value) {
    this.current.andLike(fn, value);
    return this;
  }

  /**
   * 字段 not like 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param value        值,需要指定 % 模糊匹配
   */
  public ExampleWrapper notLike(boolean useCondition, Fn fn, Object value) {
    return useCondition ? notLike(fn, value) : this;
  }

  /**
   * 字段 not like 值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param fn           字段对应的 get 方法引用
   * @param supplier     值构造函数,需要指定 % 模糊匹配
   */
  public ExampleWrapper notLike(boolean useCondition, Fn fn, Supplier supplier) {
    return useCondition ? notLike(fn, supplier.get()) : this;
  }

  /**
   * 字段 not like 值
   *
   * @param fn    字段对应的 get 方法引用
   * @param value 值,需要指定 % 模糊匹配
   */
  public ExampleWrapper notLike(Fn fn, Object value) {
    this.current.andNotLike(fn, value);
    return this;
  }

  /**
   * 添加任意条件,条件一定是后端使用的,需要自己防止 SQL 注入
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param condition    任意条件,例如 "length(countryname)<5"
   */
  public ExampleWrapper anyCondition(boolean useCondition, String condition) {
    return useCondition ? anyCondition(condition) : this;
  }

  /**
   * 添加任意条件,条件一定是后端使用的,需要自己防止 SQL 注入
   *
   * @param condition 任意条件,例如 "length(countryname)<5"
   */
  public ExampleWrapper anyCondition(String condition) {
    this.current.andCondition(condition);
    return this;
  }

  /**
   * 手写左边条件,右边用value值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param condition    例如 "length(countryname)="
   * @param value        例如 5
   */
  public ExampleWrapper anyCondition(boolean useCondition, String condition, Object value) {
    return useCondition ? anyCondition(condition, value) : this;
  }

  /**
   * 手写左边条件,右边用value值
   *
   * @param useCondition 表达式条件, true 使用,false 不使用
   * @param condition    例如 "length(countryname)="
   * @param supplier     任意条件值的构造函数
   */
  public ExampleWrapper anyCondition(boolean useCondition, String condition, Supplier supplier) {
    return useCondition ? anyCondition(condition, supplier.get()) : this;
  }

  /**
   * 手写左边条件,右边用value值
   *
   * @param condition 例如 "length(countryname)="
   * @param value     例如 5
   */
  public ExampleWrapper anyCondition(String condition, Object value) {
    this.current.andCondition(condition, value);
    return this;
  }

  /**
   * 嵌套 or 查询,数组多个条件直接使用 or,单个条件中为 and
   *
   * @param orParts 条件块
   */
  @SafeVarargs
  public final ExampleWrapper or(Function, Example.OrCriteria>... orParts) {
    if (orParts != null && orParts.length > 0) {
      this.current.andOr(Arrays.stream(orParts).map(orPart -> orPart.apply(example.orPart())).collect(Collectors.toList()));
    }
    return this;
  }

  /**
   * 根据当前条件删除
   */
  public int delete() {
    return baseMapper.deleteByExample(example);
  }

  /**
   * 将符合当前查询条件的数据更新为 {@link #set(String)} 和 {@link #set(Fn, Object)} 设置的值
   */
  public int update() {
    Assert.notEmpty(example.getSetValues(), "必须通过 set 方法设置更新的列和值");
    return baseMapper.updateByExampleSetValues(example);
  }

  /**
   * 将符合当前查询条件的数据更新为提供的值, {@link #set(String)} 和 {@link #set(Fn, Object)} 设置的值无效
   *
   * @param t 要更新的值
   */
  public int update(T t) {
    return baseMapper.updateByExample(t, example);
  }

  /**
   * 将符合当前查询条件的数据更新为提供的值,不更新 null 的值
   *
   * @param t 要更新的值
   */
  public int updateSelective(T t) {
    return baseMapper.updateByExampleSelective(t, example);
  }

  /**
   * 根据当前查询条件查询
   */
  public List list() {
    return baseMapper.selectByExample(example);
  }

  /**
   * 根据当前查询条件查询,返回 Stream
   */
  public Stream stream() {
    return list().stream();
  }

  /**
   * 根据当前查询条件查询出一个结果,当存在多个符合条件的结果时会抛出异常 {@link TooManyResultsException}
   */
  public Optional one() {
    return baseMapper.selectOneByExample(example);
  }

  /**
   * 根据当前查询条件查询出第一个结果,通过 {@link RowBounds} 实现
   */
  public Optional first() {
    return baseMapper.selectByExample(example, new RowBounds(0, 1)).stream().findFirst();
  }

  /**
   * 根据当前查询条件查询出前 n 个结果,通过 {@link RowBounds} 实现
   *
   * @param n 结果数
   */
  public List top(int n) {
    return baseMapper.selectByExample(example, new RowBounds(0, n));
  }

  /**
   * 查询符合当前条件的结果数
   */
  public long count() {
    return baseMapper.countByExample(example);
  }

}