java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis plus条件构造器

关于MyBatis plus条件构造器的逐条详解

作者:JavaEdge.

什么是条件构造器呢?简单来说,条件构造器就是用来生成我们查数据库的sql。它可以简化sql代码的编写,灵活、方便且易于维护

sidebarDepth: 3

条件构造器

说明

以下出现的第一个入参boolean condition表示该条件是否加入最后生成的SQL中,例如:

query.like(StringUtils.isNotBlank(name), Entity::getName, name)
  .eq(age!=null && age >= 0, Entity::getAge, age)

以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true,如:

以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)

以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)

警告

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

wrapper 很重

传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)

正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作

我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr

AbstratWrappr

说明

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)
tip 个别参数说明:
params : key为数据库字段名,value为字段值
null2IsNull : 为true则在mapvaluenull时调用 isNull 方法,为false时则忽略valuenull

例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 : 过滤函数,是否允许字段传入比对条件中
paramsnull2IsNull : 同上

例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})—>name = '老王' and age is null

例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)—>name = '老王'

eq

等于 =

eq(R column, Object val)
eq(boolean condition, R column, Object val)

实例

eq("name", "老王")—>name = '老王'

ne

ne(R column, Object val)
ne(boolean condition, R column, Object val)

gt

gt(R column, Object val)
gt(boolean condition, R column, Object val)

ge

ge(R column, Object val)
ge(boolean condition, R column, Object val)

lt

le(R column, Object val)
le(boolean condition, R column, Object val)

le

le(R column, Object val)
le(boolean condition, R column, Object val)

between

between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)

notBetween

notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)

like

like(R column, Object val)
like(boolean condition, R column, Object val)

notLike

notLike(R column, Object val)
notLike(boolean condition, R column, Object val)

likeLeft

likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)

likeRight

likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)

isNull

isNull(R column)
isNull(boolean condition, R column)

isNotNull

isNotNull(R column)
isNotNull(boolean condition, R column)

in

字段 IN (value.get(0), value.get(1), …)

in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)

in("age",{1,2,3})—>age in (1,2,3)

in(R column, Object... values)
in(boolean condition, R column, Object... values)

字段 IN (v0, v1, …)

in("age", 1, 2, 3)—>age in (1,2,3)

notIn

notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)

inSql

inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)

notInSql

notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)

groupBy

groupBy(R... columns)
groupBy(boolean condition, R... columns)

orderByAsc

排序:ORDER BY 字段, … ASC

orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)

实例

orderByAsc("id", "name")—>order by id ASC,name ASC

orderByDesc

orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)

orderBy

orderBy(boolean condition, boolean isAsc, R... columns)

having

having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)

func

func(Consumer<Children> consumer)
func(boolean condition, Consumer<Children> consumer)

or

or()
or(boolean condition)

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

or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)

and

and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)

nested

nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)

apply-拼接SQL

apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)

该方法可用于数据库函数
动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!

实例

apply("id = 1")—>id = 1

last

last(String lastSql)
last(boolean condition, String lastSql)

::: tip 注意事项:
只能调用一次,多次调用以最后一次为准
有sql注入的风险,请谨慎使用
:::

exists

exists(String existsSql)
exists(boolean condition, String existsSql)

notExists

notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)

QueryWrapper

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

select

select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)

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

UpdateWrapper

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

set

set(String column, Object val)
set(boolean condition, String column, Object val)

setSql

setSql(String sql)

lambda

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

使用 Wrapper 自定义SQL

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

kotlin持久化对象定义最佳实践

由于kotlin相比于java多了数据对象(data class),在未说明情况下可能会混用。建议按照以下形式定义持久化对象

@TableName("sys_user")
class User {
		@TableId(type = IdType.AUTO)
    var id: Int? = null

    @TableField("username")
    var name: String? = null

    var roleId: Int? = null
}

注意:这里的TableIdTableField并非必要,只是为了展示Mybatis-Plus中的annotation使用

这里所有成员都需要定义为可空类型(?),并赋予null的初始值,方便我们在以下场景中使用(类似java中的updateSelective

val wrapper = KtUpdateWrapper(User::class.java).eq(User::id, 2)
val newRecord = User()
newRecord.name = "newName"
userMapper!!.update(newRecord, wrapper)

不建议使用data class及全参数构造方法,这样我们会写很多不必要的null来构造一个空对象

用注解

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

用XML

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

链式调用 lambda 式

// 区分:
// 链式调用 普通
UpdateChainWrapper<T> update();
// 链式调用 lambda 式。注意:不支持 Kotlin 
LambdaUpdateChainWrapper<T> lambdaUpdate();

// 等价示例:
query().eq("id", value).one();
lambdaQuery().eq(Entity::getId, value).one();

// 等价示例:
update().eq("id", value).remove();
lambdaUpdate().eq(Entity::getId, value).remove();

到此这篇关于关于MyBatis plus条件构造器的逐条详解的文章就介绍到这了,更多相关MyBatis plus条件构造器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文