#nested
nested(Consumer<Param> consumer) nested(boolean condition, Consumer<Param> consumer)
- 正常嵌套 不带 AND 或者 OR
- 例:
nested(i -> i.eq("name", "李白").ne("status", "活着"))
--->(name = '李白' and status <> '活着')
#apply
apply(String applySql, Object... params) apply(boolean condition, String applySql, Object... params)
- 拼接 sql注意事项:
该方法可用于数据库函数 动态入参的params
对应前面applySql
内部的{index}
部分.这样是不会有sql注入风险的,反之会有! - 例: apply("id = 1")--->id = 1
- 例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
- 例:
apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")
--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
#last
last(String lastSql) last(boolean condition, String lastSql)
- 无视优化规则直接拼接到 sql 的最后注意事项:
只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用 - 例:
last("limit 1")
#exists
exists(String existsSql) exists(boolean condition, String existsSql)
- 拼接 EXISTS ( sql语句 )
- 例:
exists("select id from table where age = 1")
--->exists (select id from table where age = 1)
#notExists
notExists(String notExistsSql) notExists(boolean condition, String notExistsSql)
- 拼接 NOT EXISTS ( sql语句 )
- 例:
notExists("select id from table where age = 1")
--->not exists (select id from table where age = 1)
#QueryWrapper
说明:
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取
#select
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"))
#UpdateWrapper
说明:
继承自 AbstractWrapper
,自身的内部属性 entity
也用于生成 where 条件
及 LambdaUpdateWrapper
, 可以通过 new UpdateWrapper().lambda()
方法获取!
#set
set(String column, Object val) set(boolean condition, String column, Object val)
- SQL SET 字段
- 例:
set("name", "老李头")
- 例:
set("name", "")
--->数据库字段值变为空字符串 - 例:
set("name", null)
--->数据库字段值变为null
#setSql
setSql(String sql)
- 设置 SET 部分 SQL
- 例:
setSql("name = '老李头'")
#lambda
- 获取
LambdaWrapper
在QueryWrapper
中是获取LambdaQueryWrapper
在UpdateWrapper
中是获取LambdaUpdateWrapper
#使用 Wrapper 自定义SQL
注意事项:
需要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 }
注意:这里的TableId及TableField并非必要,只是为了展示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>
#kotlin使用wrapper
kotlin 可以使用 QueryWrapper 和 UpdateWrapper 但无法使用 LambdaQueryWrapper 和 LambdaUpdateWrapper
如果想使用 lambda 方式的 wrapper 请使用 KtQueryWrapper 和 KtUpdateWrappe
请参考实例(opens new window)
val queryWrapper = KtQueryWrapper(User()).eq(User::name, "sss").eq(User::roleId, "sss2") userMapper!!.selectList(queryWrapper) val updateConditionWrapper = KtUpdateWrapper(User()).eq(User::name, "sss").eq(User::roleId, "sss2") val updateRecord = User() updateRecord.name = "newName" userMapper!!.update(updateRecord, updateConditionWrapper) val updateRecord = User() updateRecord.id = 2 updateRecord.name = "haha" userMapper.updateById(updateRecord)
#链式调用 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();
在 GitHub 上编辑此页 (opens new window)