MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。以下是主要的 Wrapper 类及其功能:
-
AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
-
QueryWrapper:专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and
和 or
逻辑。
-
UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
-
LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
-
LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。
功能详解
MyBatis-Plus 的 Wrapper 类是构建复杂查询和更新条件的关键工具。它允许开发者以链式调用的方式构造 SQL 的 WHERE 子句,提供了极大的灵活性和便利性。
以下是对 Wrapper 功能的提示和注意事项。
allEq
allEq
方法是 MyBatis-Plus 中用于构建查询条件的方法之一,它允许我们通过一个 Map
来设置多个字段的相等条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
params
:一个 Map
,其中 key
是数据库字段名,value
是对应的字段值。
null2IsNull
:如果设置为 true
,当 Map
中的 value
为 null
时,会调用 isNull
方法;如果设置为 false
,则会忽略 value
为 null
的键值对。
filter
:一个 BiPredicate
,用于过滤哪些字段应该被包含在查询条件中。
condition
:一个布尔值,用于控制是否应用这些条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
带过滤器的普通 Wrapper (QueryWrapper
):
带过滤器的 Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
eq
eq
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的相等条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值。
condition
:一个布尔值,用于控制是否应用这个相等条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
ne
ne
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的不相等条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值。
condition
:一个布尔值,用于控制是否应用这个不相等条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
gt
gt
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的大于条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值。
condition
:一个布尔值,用于控制是否应用这个大于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
ge
ge
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的大于等于条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值。
condition
:一个布尔值,用于控制是否应用这个大于等于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
lt
lt
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的小于条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值。
condition
:一个布尔值,用于控制是否应用这个小于是条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
le
le
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的小于等于条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值。
condition
:一个布尔值,用于控制是否应用这个小于是条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
between
between
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 BETWEEN 条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val1
:与字段名对应的第一个值,表示 BETWEEN 条件的起始值。
val2
:与字段名对应的第二个值,表示 BETWEEN 条件的结束值。
condition
:一个布尔值,用于控制是否应用这个 BETWEEN 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
notBetween
notBetween
方法是 MyBatis-Plus 中用于构建查询条件的另一个基本方法,它用于设置单个字段的 NOT BETWEEN 条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val1
:与字段名对应的第一个值,表示 NOT BETWEEN 条件的起始值。
val2
:与字段名对应的第二个值,表示 NOT BETWEEN 条件的结束值。
condition
:一个布尔值,用于控制是否应用这个 NOT BETWEEN 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
like
like
方法是 MyBatis-Plus 中用于构建模糊查询条件的基本方法之一,它用于设置单个字段的 LIKE 条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值,表示 LIKE 条件中的搜索值。
condition
:一个布尔值,用于控制是否应用这个 LIKE 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
notLike
notLike
方法是 MyBatis-Plus 中用于构建模糊查询条件的另一个基本方法,它用于设置单个字段的 NOT LIKE 条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值,表示 NOT LIKE 条件中的搜索值。
condition
:一个布尔值,用于控制是否应用这个 NOT LIKE 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
likeLeft
likeLeft
方法是 MyBatis-Plus 中用于构建模糊查询条件的基本方法之一,它用于设置单个字段的右模糊匹配条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值,表示右模糊匹配条件中的搜索值。
condition
:一个布尔值,用于控制是否应用这个右模糊匹配条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
通过上述优化,likeLeft
方法的文档更加清晰地展示了其用法、参数说明、示例以及注意事项,使得开发者能够更容易理解和正确使用该方法。
likeRight
likeRight
方法是 MyBatis-Plus 中用于构建模糊查询条件的基本方法之一,它用于设置单个字段的左模糊匹配条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值,表示左模糊匹配条件中的搜索值。
condition
:一个布尔值,用于控制是否应用这个左模糊匹配条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
notLikeLeft
notLikeLeft
方法是 MyBatis-Plus 中用于构建模糊查询条件的另一个基本方法,它用于设置单个字段的非右模糊匹配条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值,表示非右模糊匹配条件中的搜索值。
condition
:一个布尔值,用于控制是否应用这个非右模糊匹配条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
notLikeRight
notLikeRight
方法是 MyBatis-Plus 中用于构建模糊查询条件的另一个基本方法,它用于设置单个字段的非左模糊匹配条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
val
:与字段名对应的值,表示非左模糊匹配条件中的搜索值。
condition
:一个布尔值,用于控制是否应用这个非左模糊匹配条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
通过上述优化,notLikeRight
方法的文档更加清晰地展示了其用法、参数说明、示例以及注意事项,使得开发者能够更容易理解和正确使用该方法。
isNull
isNull
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 IS NULL 条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
condition
:一个布尔值,用于控制是否应用这个 IS NULL 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
in
in
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 IN 条件,即字段的值在给定的集合中。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
value
:一个集合,包含 IN 条件中字段可能的值。
values
:一个可变参数列表,包含 IN 条件中字段可能的值。
condition
:一个布尔值,用于控制是否应用这个 IN 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
notIn
notIn
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 NOT IN 条件,即字段的值不在给定的集合中。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
value
:一个集合,包含 NOT IN 条件中字段可能的值。
values
:一个可变参数列表,包含 NOT IN 条件中字段可能的值。
condition
:一个布尔值,用于控制是否应用这个 NOT IN 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
inSql
inSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置单个字段的 IN 条件,但与 in
方法不同的是,inSql
允许你直接使用 SQL 语句来生成 IN 子句中的值集合。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
sqlValue
:一个字符串,包含用于生成 IN 子句中值集合的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个 IN 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
使用子查询的示例:
生成的 SQL
notInSql
notInSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置单个字段的 NOT IN 条件,但与 notIn
方法不同的是,notInSql
允许你直接使用 SQL 语句来生成 NOT IN 子句中的值集合。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
sqlValue
:一个字符串,包含用于生成 NOT IN 子句中值集合的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个 NOT IN 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
使用子查询的示例:
生成的 SQL
eqSql Since 3.5.6
eqSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,允许你设置一个字段等于(EQ)某个 SQL 语句的结果。这个方法特别适用于需要将字段值与子查询结果进行比较的场景。
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
inValue
:一个字符串,包含用于生成等于条件的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个等于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
gtSql Since 3.4.3.2
gtSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,允许你设置一个字段大于(GT)某个 SQL 语句的结果。
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
inValue
:一个字符串,包含用于生成大于条件的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个大于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
geSql Since 3.4.3.2
geSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,允许你设置一个字段大于等于(GE)某个 SQL 语句的结果。
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
inValue
:一个字符串,包含用于生成大于等于条件的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个大于等于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
ltSql Since 3.4.3.2
ltSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,允许你设置一个字段小于(LT)某个 SQL 语句的结果。
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
inValue
:一个字符串,包含用于生成小于条件的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个小于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
leSql Since 3.4.3.2
leSql
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,允许你设置一个字段小于等于(LE)某个 SQL 语句的结果。
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
inValue
:一个字符串,包含用于生成小于等于条件的 SQL 语句。
condition
:一个布尔值,用于控制是否应用这个小于等于条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
groupBy
groupBy
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的分组条件。通过指定一个或多个字段,groupBy
方法可以生成 SQL 语句中的 GROUP BY 子句。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
columns
:一个可变参数列表,包含用于分组的字段名。
condition
:一个布尔值,用于控制是否应用这个分组条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
orderByAsc
orderByAsc
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的升序排序条件。通过指定一个或多个字段,orderByAsc
方法可以生成 SQL 语句中的 ORDER BY 子句,并指定升序排序。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
columns
:一个可变参数列表,包含用于排序的字段名。
condition
:一个布尔值,用于控制是否应用这个排序条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
orderByDesc
orderByDesc
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的降序排序条件。通过指定一个或多个字段,orderByDesc
方法可以生成 SQL 语句中的 ORDER BY 子句,并指定降序排序。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
columns
:一个可变参数列表,包含用于排序的字段名。
condition
:一个布尔值,用于控制是否应用这个排序条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
orderBy
orderBy
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的排序条件。通过指定一个或多个字段以及排序方向(升序或降序),orderBy
方法可以生成 SQL 语句中的 ORDER BY 子句。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
condition
:一个布尔值,用于控制是否应用这个排序条件。
isAsc
:一个布尔值,表示排序方向。true
表示升序(ASC),false
表示降序(DESC)。
columns
:一个可变参数列表,包含用于排序的字段名。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
having
having
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置 HAVING 子句,通常与 GROUP BY 一起使用,用于对分组后的数据进行条件筛选。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
sqlHaving
:一个字符串,包含用于生成 HAVING 子句的 SQL 语句。
params
:一个可变参数列表,包含 SQL 语句中占位符的替换值。
condition
:一个布尔值,用于控制是否应用这个 HAVING 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
func
func
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它提供了一种在链式调用中根据条件执行不同查询操作的机制。通过传入一个 Consumer
函数式接口,func
方法允许你在不中断链式调用的情况下,根据条件执行不同的查询构建逻辑。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
consumer
:一个 Consumer
函数式接口,它接受一个 Children
类型的参数,并可以调用 Children
对象上的方法来构建查询条件。
condition
:一个布尔值,用于控制是否应用这个 Consumer
逻辑。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
or
or
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于在查询条件中添加 OR 逻辑。通过调用 or
方法,可以改变后续查询条件的连接方式,从默认的 AND 连接变为 OR 连接。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
condition
:一个布尔值,用于控制是否应用这个 OR 逻辑。
consumer
:一个 Consumer
函数式接口,它接受一个 Param
类型的参数,并可以调用 Param
对象上的方法来构建 OR 嵌套条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
OR 嵌套示例:
生成的 SQL
and
and
方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于在查询条件中添加 AND 逻辑。通过调用 and
方法,可以创建 AND 嵌套条件,即在一个 AND 逻辑块中包含多个查询条件。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
consumer
:一个 Consumer
函数式接口,它接受一个 Param
类型的参数,并可以调用 Param
对象上的方法来构建 AND 嵌套条件。
condition
:一个布尔值,用于控制是否应用这个 AND 嵌套逻辑。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
nested
nested
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于创建一个独立的查询条件块,不带默认的 AND 或 OR 逻辑。通过调用 nested
方法,可以在查询条件中添加一个嵌套的子句,该子句可以包含多个查询条件,并且可以被外部查询条件通过 AND 或 OR 连接。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
consumer
:一个 Consumer
函数式接口,它接受一个 Param
类型的参数,并可以调用 Param
对象上的方法来构建嵌套的查询条件。
condition
:一个布尔值,用于控制是否应用这个嵌套逻辑。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
apply
apply
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它允许你直接拼接 SQL 片段到查询条件中。这个方法特别适用于需要使用数据库函数或其他复杂 SQL 构造的场景。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
applySql
:一个字符串,包含要拼接的 SQL 片段。
params
:一个可变参数列表,包含 SQL 片段中占位符的替换值。
condition
:一个布尔值,用于控制是否应用这个 SQL 片段。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
使用参数占位符的示例:
生成的 SQL
注意事项
apply
方法可用于拼接包含数据库函数的 SQL 片段。
- 动态入参的
params
对应 applySql
内部的 {index}
部分,这样是不会有 SQL 注入风险的。如果直接将参数拼接到 SQL 中,则会有 SQL 注入风险,故应避免 SQL 由前端动态参数传入并直接引用。
- 在使用
apply
方法时,确保 applySql
参数是一个有效的 SQL 片段,并且 params
参数正确地替换了占位符。
condition
参数用于控制是否应用这个 SQL 片段,这允许你根据某些条件动态添加查询条件。
last
last
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它允许你直接在查询的最后添加一个 SQL 片段,而不受 MyBatis-Plus 的查询优化规则影响。这个方法应该谨慎使用,因为它可能会绕过 MyBatis-Plus 的查询优化。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
lastSql
:一个字符串,包含要添加到查询最后的 SQL 片段。
condition
:一个布尔值,用于控制是否应用这个 SQL 片段。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
exists
exists
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于在查询中添加一个 EXISTS 子查询。通过调用 exists
方法,可以将一个完整的 SQL 子查询作为 EXISTS 条件添加到主查询中。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
existsSql
:一个字符串,包含要作为 EXISTS 条件的 SQL 子查询。
condition
:一个布尔值,用于控制是否应用这个 EXISTS 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
notExists
notExists
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于在查询中添加一个 NOT EXISTS 子查询。通过调用 notExists
方法,可以将一个完整的 SQL 子查询作为 NOT EXISTS 条件添加到主查询中。
使用范围
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
notExistsSql
:一个字符串,包含要作为 NOT EXISTS 条件的 SQL 子查询。
condition
:一个布尔值,用于控制是否应用这个 NOT EXISTS 条件。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
生成的 SQL
select
select
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询的字段。通过调用 select
方法,可以指定在查询结果中包含哪些字段,从而实现字段级别的查询定制。
使用范围
QueryWrapper
LambdaQueryWrapper
方法签名
参数说明
sqlSelect
:一个字符串数组,包含要查询的字段名。
predicate
:一个 Predicate
函数式接口,用于过滤查询字段。它接受一个 TableFieldInfo
类型的参数,并返回一个布尔值,表示是否选择该字段。
entityClass
:实体类的类型,用于获取字段信息。
示例
普通 Wrapper (QueryWrapper
):
Lambda Wrapper (LambdaQueryWrapper
):
使用 Predicate 过滤字段的示例:
生成的 SQL
set
set
方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它用于设置更新语句中的 SET 字段。通过调用 set
方法,可以指定在更新操作中要修改的字段及其新值。
使用范围
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
column
:数据库字段名或使用 Lambda
表达式的字段名。
condition
:一个布尔值,用于控制是否应用这个 SET 字段。
val
:一个对象,表示要更新到字段的新值。
mapping
:额外指定,例如: javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler
示例
普通 Wrapper (UpdateWrapper
):
Lambda Wrapper (LambdaUpdateWrapper
):
生成的 SQL
使用条件控制的示例:
生成的 SQL
setSql
setSql
方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它允许你直接设置更新语句中的 SET 部分 SQL。通过调用 setSql
方法,可以将一个自定义的 SQL 片段作为 SET 子句添加到更新语句中。
使用范围
UpdateWrapper
LambdaUpdateWrapper
方法签名
参数说明
setSql
:一个字符串,包含要作为 SET 子句的 SQL 片段。
condition
:一个布尔值,用于控制是否应用这个 SET 字段。
params
:一个可变参数列表,包含 SQL 片段中占位符的替换值。
示例
setIncrBy Since 3.5.6
setIncrBy
方法是 MyBatis-Plus 中用于更新操作的高级方法之一,它允许你指定一个字段,并使其在数据库中的值增加指定的数值。这个方法特别适用于需要对数值字段进行增量操作的场景。
使用范围
方法签名
参数说明
column
:一个 SFunction
对象,表示要自增的字段。
val
:一个 Number
对象,表示要增加的数值。
condition
(可选):一个布尔值,表示是否在满足条件时执行自增操作。
示例
普通 Wrapper (UpdateWrapper
):
Lambda Wrapper (LambdaUpdateWrapper
):
生成的 SQL
setDecrBy Since 3.5.6
setDecrBy
方法是 MyBatis-Plus 中用于更新操作的高级方法之一,它允许你指定一个字段,并使其在数据库中的值减少指定的数值。这个方法特别适用于需要对数值字段进行减量操作的场景。
使用范围
方法签名
参数说明
column
:一个 SFunction
对象,表示要自减的字段。
val
:一个 Number
对象,表示要减少的数值。
condition
(可选):一个布尔值,表示是否在满足条件时执行自减操作。
示例
普通 Wrapper (UpdateWrapper
):
Lambda Wrapper (LambdaUpdateWrapper
):
生成的 SQL
lambda
lambda
方法是一个便捷的方法,它允许你从 QueryWrapper
或 UpdateWrapper
对象中获取对应的 LambdaQueryWrapper
或 LambdaUpdateWrapper
对象。这样,你就可以使用 Lambda 表达式来构建查询或更新条件,使得代码更加简洁和类型安全。
使用范围
QueryWrapper
UpdateWrapper
方法签名
示例
从 QueryWrapper 获取 LambdaQueryWrapper:
从 UpdateWrapper 获取 LambdaUpdateWrapper:
说明
lambda
方法返回一个 LambdaWrapper
对象,具体类型取决于调用它的 Wrapper
类型。
- 在
QueryWrapper
上调用 lambda
方法将返回一个 LambdaQueryWrapper
。
- 在
UpdateWrapper
上调用 lambda
方法将返回一个 LambdaUpdateWrapper
。
- 使用 Lambda 表达式可以避免直接使用字符串来指定字段名,从而减少错误并提高代码的可读性。
使用 TypeHandler
在 wrapper
中使用 typeHandler
需要特殊处理利用 formatSqlMaybeWithParam
方法
使用提示
通过使用 MyBatis-Plus 的 Wrapper 条件构造器,开发者可以更加高效地构建复杂的数据库查询条件,同时保持代码的简洁性和安全性。以下是一些注意事项与推荐做法:
- 在使用 Wrapper 时,尽量使用 Lambda 表达式来避免硬编码字段名,这样可以提高代码的可读性和可维护性。
- Wrapper 支持链式调用,可以组合多个条件,如
and
、or
等逻辑操作符。
- 在更新操作中使用 UpdateWrapper 或 LambdaUpdateWrapper 时,可以省略实体对象,直接在 Wrapper 中设置更新字段。
- 注意 Wrapper 的线程安全性,通常在每次使用时创建新的 Wrapper 实例。
- 在使用 MyBatis-Plus 的 Wrapper 时,应避免将前端动态参数直接拼接到 SQL 片段中,以防止 SQL 注入攻击。MyBatis-Plus 提供了安全的参数绑定方式,如使用
eq
、apply
等方法,它们会自动处理参数绑定,避免 SQL 注入风险。
Wrappers
MyBatis-Plus 提供了 Wrappers
类,它是一个静态工厂类,用于快速创建 QueryWrapper
、UpdateWrapper
、LambdaQueryWrapper
和 LambdaUpdateWrapper
的实例。使用 Wrappers
可以减少代码量,提高开发效率。
示例:
线程安全性
Wrapper 实例不是线程安全的,因此建议在每次使用时创建新的 Wrapper 实例。这样可以避免多线程环境下的数据竞争和潜在的错误。
示例:
通过遵循这些最佳实践,开发者可以更加安全、高效地使用 MyBatis-Plus 的 Wrapper 条件构造器,构建出既安全又易于维护的数据库操作代码。
使用 Wrapper 自定义 SQL
MyBatis-Plus 提供了强大的 Wrapper 条件构造器,允许开发者自定义 SQL 语句,以满足更复杂的数据库查询需求。为了使用这一功能,请确保你的 mybatis-plus
版本不低于 3.0.7
。
注意事项
- 版本要求:确保你的项目中使用的
mybatis-plus
版本至少为 3.0.7
,以支持自定义 SQL 功能。
- 参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为
ew
,或者使用注解 @Param(Constants.WRAPPER)
明确指定参数为 Wrapper 对象。
- 使用
${ew.customSqlSegment}
:在 SQL 语句中,使用 ${ew.customSqlSegment}
来引用 Wrapper 对象生成的 SQL 片段。
- 不支持基于 entity 的 where 语句:自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 where 子句,你需要手动编写完整的 SQL 语句。
示例
以下是一个使用 Wrapper 自定义 SQL 的示例:
在上述示例中,我们定义了一个 selectByCustomSql
方法,它使用了一个自定义的 SQL 语句,并通过 ${ew.customSqlSegment}
引入了 Wrapper 对象生成的 SQL 片段。
使用方法
要使用自定义 SQL,只需调用上述方法并传入一个 Wrapper 对象:
在这个例子中,selectByCustomSql
方法将执行一个带有 where 条件的查询,该条件由传入的 queryWrapper
对象生成。
通过这种方式,你可以灵活地结合 MyBatis-Plus 的 Wrapper 功能和自定义 SQL,以满足各种复杂的数据库操作需求。
Kotlin持久化对象定义最佳实践
在Kotlin中定义持久化对象时,我们应当遵循一些最佳实践,以确保代码的清晰性和可维护性。以下是一个使用MyBatis-Plus的示例,展示了如何定义一个持久化对象:
注意:上述代码中的@TableId
和@TableField
注解是为了展示MyBatis-Plus的使用,并非必须。所有成员变量都应定义为可空类型,并赋予初始值null
,以便在类似Java中的updateSelective
场景中使用。
不推荐使用data class
或全参数构造方法,因为这可能导致在创建空对象时需要提供不必要的null
值。
使用注解查询
使用XML配置查询
Kotlin中使用Wrapper
Kotlin支持QueryWrapper
和UpdateWrapper
,但不支持LambdaQueryWrapper
和LambdaUpdateWrapper
。如果需要使用Lambda风格的Wrapper,可以使用KtQueryWrapper
和KtUpdateWrapper
。
参考示例:
链式调用与Lambda式调用
MyBatis-Plus提供了两种风格的链式调用:普通链式调用和Lambda式链式调用。需要注意的是,Lambda式链式调用不支持Kotlin。
通过遵循这些最佳实践,我们可以确保Kotlin中的持久化对象定义既清晰又易于维护,同时充分利用MyBatis-Plus提供的功能。