一、引言

说明:

条件构造器构造条件时,一般支持两到三个入参,使用以下两个入参情况较多(R column, Object val);第一个参数是一个 boolean 类型,默认为 true,表示加入到最后构造的 sql 当中;因此在构造条件时,可以将判断加在外面,也可以写在第一个参数处

二、Wrapper

AbstractWrapper

说明:

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

作为父类,AbstractWrapper 包含了大量构造条件所用方法

常用方法不再赘述,具体参考 MyBatis-Plus 官网:条件构造器 - AbstractWrapper

需要稍微注意的是以下几个方法

inSql

1
inSql(R column, String inValue)

其中,inValue 代表 sql 语句,即开发者可以直接将 sql 语句作为参数传递进来,作为查询条件构造

  • 字段 IN (sql 语句)
  • 例: inSql("age", "1,2,3,4,5,6")—>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)

having

1
2
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
  • HAVING (sql 语句)
  • 例: having("sum(age) > 10")—>having sum(age) > 10
  • 例: having("sum(age) > {0}", 11)—>having sum(age) > 11

func

1
2
func(Consumer<Children> consumer)
func(boolean condition, Consumer<Children> consumer)
  • func 方法 (主要方便在出现 if…else 下调用不同方法能不断链)
  • 例: func(i -> if(true) {i.eq("id", 1)} else {i.ne("id", 1)})

or

1
2
or()
or(boolean condition)
  • 拼接 OR

    注意事项:

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

  • 例: eq("id",1).or().eq("name","老王")—>id = 1 or name = '老王'

1
2
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
  • OR 嵌套
  • 例: or(i -> i.eq("name", "李白").ne("status", "活着"))—>or (name = '李白' and status <> '活着')

and

1
2
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
  • AND 嵌套
  • 例: and(i -> i.eq("name", "李白").ne("status", "活着"))—>and (name = '李白' and status <> '活着')

QueryWrapper

说明:

继承自 AbstractWrapper , 自身的内部属性 entity 也用于生成 where 条件
及 LambdaQueryWrapper, 可以通过 new QueryWrapper ().lambda () 方法获取

select

1
2
3
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
  • 设置查询字段

    说明:

    以上方法分为两类.
    第二类方法为:过滤查询字段 (主键除外), 入参不包含 class 的调用前需要 wrapper 内的 entity 属性有值!这两类方法重复调用以最后一次为准

  • 例: select("id", "name", "age")

  • 例: select(i -> i.getProperty().startsWith("test"))

在构造 Wrapper 时,使用 select 可以减少无用字段的查询

UpdateWrapper

说明:

继承自 AbstractWrapper , 自身的内部属性 entity 也用于生成 where 条件
LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!

set

1
2
set(String column, Object val)
set(boolean condition, String column, Object val)
  • SQL SET 字段
  • 例: set("name", "老李头")
  • 例: set("name", "")—> 数据库字段值变为空字符串
  • 例: set("name", null)—> 数据库字段值变为 null

setSql

1
setSql(String sql)
  • 设置 SET 部分 SQL
  • 例: setSql("name = '老李头'")

lambda

  • 获取 LambdaWrapper
    QueryWrapper 中是获取 LambdaQueryWrapper
    UpdateWrapper 中是获取 LambdaUpdateWrapper

进阶

上面介绍的都是常规用法,MyBatis-Plus 还支持一些更为简洁的书写方式

1
2
3
4
5
6
7
new LambdaUpdateChainWrapper<>(testMapper)
.eq(TestEntity::getIsDelete,0)
.eq(TestEntity::getName,"张三")
.eq(TestEntity::getAge,18)
.set(TestEntity::getAge,20)
.set(TestEntity::getUpdateTime,new Date())
.update();

这种方法能够直接按照条件查询并更新数据库

此外,需要注意 @TableField (exist = false) 注解,加了这个注解的参数不会再往数据库写入,同样无法作为条件参数进行查询

使用 Wrapper 自定义 SQL

注意事项:

需要 mybatis-plus 版本 >= 3.0.7 param 参数名要么叫 ew, 要么加上注解 @Param(Constants.WRAPPER) 使用 ${ew.customSqlSegment} 不支持 Wrapper 内的 entity 生成 where 语句

用注解

1
2
@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);

用 XML

1
2
3
4
5
List<MysqlData> getAll(Wrapper ew);
XML
<select id="getAll" resultType="MysqlData">
SELECT * FROM mysql_data ${ew.customSqlSegment}
</select>

该方法可以将 sql 与使用 Wrapper 构造的查询条件进行拼接,在业务比较复杂,使用 wrapper 又无法满足需求的时候,拼接可以减少不必要的重写 sql 工作