diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/AbstractKtWrapper.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/AbstractKtWrapper.kt index 5cc26cd7b..335af2b11 100644 --- a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/AbstractKtWrapper.kt +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/AbstractKtWrapper.kt @@ -31,7 +31,10 @@ import kotlin.reflect.KProperty1 * @since 2018-11-07 */ @Suppress("serial") -abstract class AbstractKtWrapper> : AbstractWrapper, Children>() { +abstract class AbstractKtWrapper> : + AbstractWrapper, Children>(), + CompareDsl, + FuncDsl { /** * 列 Map diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/BaseMapperExt.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/BaseMapperExt.kt new file mode 100644 index 000000000..b693e7869 --- /dev/null +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/BaseMapperExt.kt @@ -0,0 +1,93 @@ +package com.baomidou.mybatisplus.extension.kotlin + +import com.baomidou.mybatisplus.core.mapper.BaseMapper +import com.baomidou.mybatisplus.core.metadata.IPage +import org.apache.ibatis.session.ResultHandler +import kotlin.apply + +/** + * @Author lidiwei + * @CreateTime 2025/7/31 10:13 + */ + +inline fun BaseMapper.delete(noinline build: (KtQueryWrapper.() -> Unit)? = null): Int = + this.delete(build.toKtQueryWrapper()) + +inline fun BaseMapper.update( + entity: T? = null, + noinline build: (KtUpdateWrapper.() -> Unit)? = null +): Int = + this.update(entity, build.toKtUpdateWrapper()) + +inline fun BaseMapper.update(noinline build: (KtUpdateWrapper.() -> Unit)? = null): Int = + this.update(build.toKtUpdateWrapper()) + +inline fun BaseMapper.selectOne( + throwEx: Boolean = true, + noinline build: (KtQueryWrapper.() -> Unit)? = null, +): T? = + this.selectOne(build.toKtQueryWrapper(), throwEx) + +inline fun BaseMapper.exists(noinline build: (KtQueryWrapper.() -> Unit)? = null): Boolean = + this.exists(build.toKtQueryWrapper()) + +inline fun BaseMapper.selectCount(noinline build: (KtQueryWrapper.() -> Unit)? = null): Long = + this.selectCount(build.toKtQueryWrapper()) + +inline fun BaseMapper.selectList(noinline build: (KtQueryWrapper.() -> Unit)? = null): List = + this.selectList(build.toKtQueryWrapper()) + + +inline fun BaseMapper.selectList( + page: IPage, + noinline build: (KtQueryWrapper.() -> Unit)? = null, +): List = + this.selectList(page, build.toKtQueryWrapper()) + +inline fun BaseMapper.selectList( + noinline build: (KtQueryWrapper.() -> Unit)? = null, + resultHandler: ResultHandler +) = this.selectList(build.toKtQueryWrapper(), resultHandler) + +inline fun BaseMapper.selectList( + page: IPage, + noinline build: (KtQueryWrapper.() -> Unit)? = null, + resultHandler: ResultHandler +) = this.selectList(page, build.toKtQueryWrapper(), resultHandler) + +inline fun BaseMapper.selectMaps( + noinline build: (KtQueryWrapper.() -> Unit)? = null, +): List> = this.selectMaps(build.toKtQueryWrapper()) + +inline fun BaseMapper.selectMaps( + page: IPage>? = null, + noinline build: (KtQueryWrapper.() -> Unit)? = null, +): List> = this.selectMaps(page, build.toKtQueryWrapper()) + +inline fun BaseMapper.selectMaps( + noinline build: (KtQueryWrapper.() -> Unit)? = null, + resultHandler: ResultHandler> +) = this.selectMaps(build.toKtQueryWrapper(), resultHandler) + +inline fun BaseMapper.selectMaps( + page: IPage>? = null, + noinline build: (KtQueryWrapper.() -> Unit)? = null, + resultHandler: ResultHandler> +) = this.selectMaps(page, build.toKtQueryWrapper(), resultHandler) + +inline fun >> BaseMapper.selectMapsPage( + page: P? = null, + noinline build: (KtQueryWrapper.() -> Unit)? = null, +) = this.selectMapsPage(page, build.toKtQueryWrapper()) + +inline fun BaseMapper.selectPage( + page: IPage, + noinline build: (KtQueryWrapper.() -> Unit)? = null, +): IPage = + this.selectPage(page, build.toKtQueryWrapper()) + +inline fun (KtQueryWrapper.() -> Unit)?.toKtQueryWrapper() = + this?.let { buildKtQueryWrapper().apply(it) } + +inline fun (KtUpdateWrapper.() -> Unit)?.toKtUpdateWrapper() = + this?.let { buildKtUpdateWrapper().apply(it) } diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/CompareDsl.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/CompareDsl.kt new file mode 100644 index 000000000..ebf850256 --- /dev/null +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/CompareDsl.kt @@ -0,0 +1,30 @@ +package com.baomidou.mybatisplus.extension.kotlin + +import com.baomidou.mybatisplus.core.conditions.interfaces.Compare +import kotlin.reflect.KProperty1 + +/** + * @Author lidiwei + * @CreateTime 2025/7/31 16:18 + */ +interface CompareDsl : Compare> { + + infix fun KProperty1.eq(value: V?) = this@CompareDsl.eq(this, value) + infix fun KProperty1.ne(value: V?) = this@CompareDsl.ne(this, value) + infix fun KProperty1.gt(value: V?) = this@CompareDsl.gt(this, value) + infix fun KProperty1.ge(value: V?) = this@CompareDsl.ge(this, value) + infix fun KProperty1.lt(value: V?) = this@CompareDsl.lt(this, value) + infix fun KProperty1.le(value: V?) = this@CompareDsl.le(this, value) + infix fun KProperty1.between(value: Pair) = + this@CompareDsl.between(this, value.first, value.second) + + infix fun KProperty1.notBetween(value: Pair) = + this@CompareDsl.notBetween(this, value.first, value.second) + + infix fun KProperty1.like(value: V?) = this@CompareDsl.like(this, value) + infix fun KProperty1.notLike(value: V?) = this@CompareDsl.notLike(this, value) + infix fun KProperty1.likeLeft(value: V?) = this@CompareDsl.likeLeft(this, value) + infix fun KProperty1.notLikeLeft(value: V?) = this@CompareDsl.notLikeLeft(this, value) + infix fun KProperty1.likeRight(value: V?) = this@CompareDsl.likeRight(this, value) + infix fun KProperty1.notLikeRight(value: V?) = this@CompareDsl.notLikeRight(this, value) +} diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/DbExt.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/DbExt.kt new file mode 100644 index 000000000..b5ed2bb5c --- /dev/null +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/DbExt.kt @@ -0,0 +1,15 @@ +package com.baomidou.mybatisplus.extension.kotlin + +import com.baomidou.mybatisplus.extension.toolkit.Db +import kotlin.reflect.KClass + +/** + * @Author lidiwei + * @CreateTime 2025/7/31 16:15 + */ + +inline fun ktQuery(noinline query: (KtQueryChainWrapper.() -> Unit)? = null): KtQueryChainWrapper = + Db.ktQuery(T::class.java).also { query?.invoke(it) } + +inline fun > C.ktQuery(noinline query: (KtQueryChainWrapper.() -> Unit)? = null): KtQueryChainWrapper = + Db.ktQuery(T::class.java).also { query?.invoke(it) } diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/FuncDsl.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/FuncDsl.kt new file mode 100644 index 000000000..26aa8f6a1 --- /dev/null +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/FuncDsl.kt @@ -0,0 +1,23 @@ +package com.baomidou.mybatisplus.extension.kotlin + +import com.baomidou.mybatisplus.core.conditions.interfaces.Func +import kotlin.reflect.KProperty1 + +/** + * @Author lidiwei + * @CreateTime 2025/7/31 16:20 + */ +interface FuncDsl : Func> { + val KProperty1.isNull: Children? + get() = this@FuncDsl.isNull(this) + + val KProperty1.isNotNull: Children? + get() = this@FuncDsl.isNotNull(this) + + infix fun KProperty1.isIn(coll: Collection<*>?) = this@FuncDsl.`in`(this, coll) + infix fun KProperty1.isIn(array: Array<*>) = this@FuncDsl.`in`(this, array) + + infix fun KProperty1.isNotIn(coll: Collection<*>?) = this@FuncDsl.notIn(this, coll) + infix fun KProperty1.isNotIn(array: Array<*>) = this@FuncDsl.notIn(this, array) + +} diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryChainWrapper.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryChainWrapper.kt index eca75c452..c86e79935 100644 --- a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryChainWrapper.kt +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryChainWrapper.kt @@ -31,7 +31,9 @@ import kotlin.reflect.KProperty1 open class KtQueryChainWrapper( internal val baseMapper: BaseMapper? ) : AbstractChainWrapper, KtQueryChainWrapper, KtQueryWrapper>(), - ChainQuery, Query, T, KProperty1> { + ChainQuery, Query, T, KProperty1>, + CompareDsl, T>, + FuncDsl, T> { constructor(baseMapper: BaseMapper, entityClass: Class) : this(baseMapper) { super.wrapperChildren = KtQueryWrapper(entityClass) diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryWrapper.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryWrapper.kt index 0e10d6ec2..c1a79ab9a 100644 --- a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryWrapper.kt +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryWrapper.kt @@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache import java.util.concurrent.atomic.AtomicInteger import java.util.function.Predicate +import kotlin.reflect.KClass import kotlin.reflect.KProperty1 /** @@ -40,6 +41,11 @@ open class KtQueryWrapper : AbstractKtWrapper>, Qu */ private var sqlSelect: SharedString = SharedString() + constructor(entity: KClass) { + this.entityClass = entity.java + super.initNeed() + } + constructor(entity: T) { this.entity = entity super.initNeed() diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt index 8e8521e42..03bc7f89e 100644 --- a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt @@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache import java.math.BigDecimal import java.util.concurrent.atomic.AtomicInteger import java.util.stream.Collectors.joining +import kotlin.reflect.KClass import kotlin.reflect.KProperty1 /** @@ -42,6 +43,11 @@ open class KtUpdateWrapper : AbstractKtWrapper>, */ private val sqlSet = ArrayList() + constructor(entity: KClass) { + this.entityClass = entity.java + super.initNeed() + } + constructor(entity: T) { this.entity = entity super.initNeed() diff --git a/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/WrapperExt.kt b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/WrapperExt.kt new file mode 100644 index 000000000..0bcd2f433 --- /dev/null +++ b/mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/WrapperExt.kt @@ -0,0 +1,10 @@ +package com.baomidou.mybatisplus.extension.kotlin + +/** + * @Author lidiwei + * @CreateTime 2025/7/31 18:09 + */ + +inline fun buildKtQueryWrapper(): KtQueryWrapper = KtQueryWrapper(T::class) + +inline fun buildKtUpdateWrapper(): KtUpdateWrapper = KtUpdateWrapper(T::class)