MyBatisPlus之条件构造器
一、引言
说明:
条件构造器构造条件时,一般支持两到三个入参,使用以下两个入参情况较多(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 | having(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 | func(Consumer<Children> consumer) |
- func 方法 (主要方便在出现 if…else 下调用不同方法能不断链)
- 例:
func(i -> if(true) {i.eq("id", 1)} else {i.ne("id", 1)})
or
1 | or() |
拼接 OR
注意事项:
主动调用
or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)例:
eq("id",1).or().eq("name","老王")—>id = 1 or name = '老王'
1 | or(Consumer<Param> consumer) |
- OR 嵌套
- 例:
or(i -> i.eq("name", "李白").ne("status", "活着"))—>or (name = '李白' and status <> '活着')
and
1 | and(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 | select(String... sqlSelect) |
设置查询字段
说明:
以上方法分为两类.
第二类方法为:过滤查询字段 (主键除外), 入参不包含 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 | set(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 | new LambdaUpdateChainWrapper<>(testMapper) |
这种方法能够直接按照条件查询并更新数据库
此外,需要注意 @TableField (exist = false) 注解,加了这个注解的参数不会再往数据库写入,同样无法作为条件参数进行查询
使用 Wrapper 自定义 SQL
注意事项:
需要
mybatis-plus版本 >=3.0.7param 参数名要么叫ew, 要么加上注解@Param(Constants.WRAPPER)使用${ew.customSqlSegment}不支持Wrapper内的 entity 生成 where 语句
用注解
1 |
|
用 XML
1 | List<MysqlData> getAll(Wrapper ew); |
该方法可以将 sql 与使用 Wrapper 构造的查询条件进行拼接,在业务比较复杂,使用 wrapper 又无法满足需求的时候,拼接可以减少不必要的重写 sql 工作





