MyBatis-Plus 條件構(gòu)造器-使用 Wrapper 自定義SQL

2022-03-24 16:27 更新

注意事項

需要?mybatis-plus?版本 >= ?3.0.7?

?param ?參數(shù)名要么叫?ew?,要么加上注解?@Param(Constants.WRAPPER)

使用?${ew.customSqlSegment}? 不支持 ?Wrapper內(nèi)的entity生成where語句

kotlin持久化對象定義最佳實踐

由于?kotlin?相比于?java?多了數(shù)據(jù)對象(?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?及全參數(shù)構(gòu)造方法,這樣我們會寫很多不必要的?null?來構(gòu)造一個空對象

用注解

@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)

鏈?zhǔn)秸{(diào)用 lambda 式

// 區(qū)分:
// 鏈?zhǔn)秸{(diào)用 普通
UpdateChainWrapper<T> update();
// 鏈?zhǔn)秸{(diào)用 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();


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號