亲宝软件园·资讯

展开

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

JavaEdge. 人气:0
想了解关于MyBatis plus条件构造器的逐条详解的相关内容吗,JavaEdge.在本文为您仔细讲解MyBatis plus条件构造器的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:MyBatis,plus条件构造器,Java,MyBatis,plus,下面大家一起来学习吧。

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();

加载全部内容

相关教程
猜你喜欢
用户评论