From 5bec655ce3937528b6e219d26a83efc70f37a845 Mon Sep 17 00:00:00 2001 From: lidiwei Date: Thu, 31 Jul 2025 18:13:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=BC=BAkotlin?= =?UTF-8?q?=E7=9A=84BaseMapper=E8=AF=AD=E6=B3=95=E7=B3=96=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Adsl=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/kotlin/AbstractKtWrapper.kt | 5 +- .../extension/kotlin/BaseMapperExt.kt | 93 +++++++++++++++++++ .../extension/kotlin/CompareDsl.kt | 30 ++++++ .../mybatisplus/extension/kotlin/DbExt.kt | 15 +++ .../mybatisplus/extension/kotlin/FuncDsl.kt | 23 +++++ .../extension/kotlin/KtQueryChainWrapper.kt | 4 +- .../extension/kotlin/KtQueryWrapper.kt | 6 ++ .../extension/kotlin/KtUpdateWrapper.kt | 6 ++ .../extension/kotlin/WrapperExt.kt | 10 ++ 9 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/BaseMapperExt.kt create mode 100644 mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/CompareDsl.kt create mode 100644 mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/DbExt.kt create mode 100644 mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/FuncDsl.kt create mode 100644 mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/WrapperExt.kt 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 5cc26cd7ba..335af2b11d 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 0000000000..b693e7869c --- /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 0000000000..ebf8502562 --- /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 0000000000..e390077273 --- /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(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = + Db.ktQuery(T::class.java).apply(query) + +inline fun > T.ktQuery(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = + Db.ktQuery(T::class.java).apply(query) 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 0000000000..26aa8f6a18 --- /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 eca75c4521..c86e799359 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 0e10d6ec2e..c1a79ab9a4 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 8e8521e42b..03bc7f89e0 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 0000000000..0bcd2f4330 --- /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) From 17d1f836113b5fde4771f9acbbb91df9488767e8 Mon Sep 17 00:00:00 2001 From: lidiwei Date: Thu, 31 Jul 2025 18:17:52 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=BC=BAkotlin?= =?UTF-8?q?=E7=9A=84BaseMapper=E8=AF=AD=E6=B3=95=E7=B3=96=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Adsl=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/baomidou/mybatisplus/extension/kotlin/DbExt.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index e390077273..60bcfab29f 100644 --- 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 @@ -11,5 +11,5 @@ import kotlin.reflect.KClass inline fun ktQuery(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = Db.ktQuery(T::class.java).apply(query) -inline fun > T.ktQuery(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = +inline fun > C.ktQuery(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = Db.ktQuery(T::class.java).apply(query) From 93ae91ccd5d10e7aec1eed3b867348da07ab9f4f Mon Sep 17 00:00:00 2001 From: lidiwei Date: Thu, 31 Jul 2025 18:41:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=BC=BAkotlin?= =?UTF-8?q?=E7=9A=84BaseMapper=E8=AF=AD=E6=B3=95=E7=B3=96=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Adsl=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/baomidou/mybatisplus/extension/kotlin/DbExt.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 index 60bcfab29f..b5ed2bb5ca 100644 --- 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 @@ -8,8 +8,8 @@ import kotlin.reflect.KClass * @CreateTime 2025/7/31 16:15 */ -inline fun ktQuery(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = - Db.ktQuery(T::class.java).apply(query) +inline fun ktQuery(noinline query: (KtQueryChainWrapper.() -> Unit)? = null): KtQueryChainWrapper = + Db.ktQuery(T::class.java).also { query?.invoke(it) } -inline fun > C.ktQuery(query: KtQueryChainWrapper.() -> Unit): KtQueryChainWrapper = - Db.ktQuery(T::class.java).apply(query) +inline fun > C.ktQuery(noinline query: (KtQueryChainWrapper.() -> Unit)? = null): KtQueryChainWrapper = + Db.ktQuery(T::class.java).also { query?.invoke(it) }