阅读(2082) (0)

MyBatis-Plus 条件构造器-使用 Wrapper 自定义SQL

2022-03-24 16:01:18 更新

注意事项

需要​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和 ​KtUpdateWrapper

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