Selaa lähdekoodia

feat: `updateWrapper#setSql`方法支持`动态入参`

miemie 2 vuotta sitten
vanhempi
commit
1f24e3f2a2
14 muutettua tiedostoa jossa 48 lisäystä ja 32 poistoa
  1. 1 0
      build.gradle
  2. 1 1
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java
  3. 1 0
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Join.java
  4. 3 3
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java
  5. 8 4
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/Update.java
  6. 3 3
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/UpdateWrapper.java
  7. 2 2
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/update/LambdaUpdateChainWrapper.java
  8. 2 2
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/update/UpdateChainWrapper.java
  9. 1 0
      mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/AbstractKtWrapper.kt
  10. 1 1
      mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryChainWrapper.kt
  11. 1 0
      mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryWrapper.kt
  12. 3 3
      mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateChainWrapper.kt
  13. 4 3
      mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt
  14. 17 10
      mybatis-plus-extension/src/test/kotlin/com/baomidou/mybatisplus/test/kotlin/WrapperTest.kt

+ 1 - 0
build.gradle

@@ -102,6 +102,7 @@ subprojects {
         testImplementation "${lib["junit-jupiter"]}"
         testImplementation "org.mockito:mockito-junit-jupiter:4.6.1"
         testImplementation "${lib["lagarto"]}"
+        testImplementation "${lib["logback-classic"]}"
     }
 
     tasks.withType(JavaCompile) {

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -478,7 +478,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
                 if (sqlStr.contains(target)) {
                     sqlStr = sqlStr.replace(target, formatParam(null, params[i]));
                 } else {
-                    Matcher matcher = Pattern.compile("\\{" + i + "[a-zA-Z0-9.,=]+}").matcher(sqlStr);
+                    Matcher matcher = Pattern.compile("[{]" + i + ",[a-zA-Z0-9.,=]+}").matcher(sqlStr);
                     if (!matcher.find()) {
                         throw ExceptionUtils.mpe("Please check the syntax correctness! sql not contains: \"%s\"", target);
                     }

+ 1 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Join.java

@@ -54,6 +54,7 @@ public interface Join<Children> extends Serializable {
      * <p>例1: apply("id = 1")</p>
      * <p>例2: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")</p>
      * <p>例3: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", LocalDate.now())</p>
+     * <p>例4: apply("name={0,javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler}", "老王")</p>
      *
      * @param condition 执行条件
      * @param values    数据数组

+ 3 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java

@@ -84,9 +84,9 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
     }
 
     @Override
-    public LambdaUpdateWrapper<T> setSql(boolean condition, String sql) {
-        if (condition && StringUtils.isNotBlank(sql)) {
-            sqlSet.add(sql);
+    public LambdaUpdateWrapper<T> setSql(boolean condition, String setSql, Object... params) {
+        if (condition && StringUtils.isNotBlank(setSql)) {
+            sqlSet.add(formatSqlMaybeWithParam(setSql, params));
         }
         return typedThis;
     }

+ 8 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/Update.java

@@ -63,17 +63,21 @@ public interface Update<Children, R> extends Serializable {
     /**
      * ignore
      */
-    default Children setSql(String sql) {
-        return setSql(true, sql);
+    default Children setSql(String setSql, Object... params) {
+        return setSql(true, setSql, params);
     }
 
     /**
      * 设置 更新 SQL 的 SET 片段
      *
-     * @param sql set sql
+     * @param setSql set sql
+     *               例1: setSql("id=1")
+     *               例2: apply("dateColumn={0}", LocalDate.now())
+     *               例3: apply("dateColumn={0}", LocalDate.now())
+     *               例4: apply("name={0,javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler}", "老王")
      * @return children
      */
-    Children setSql(boolean condition, String sql);
+    Children setSql(boolean condition, String setSql, Object... params);
 
     /**
      * 获取 更新 SQL 的 SET 片段

+ 3 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/UpdateWrapper.java

@@ -84,9 +84,9 @@ public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T
     }
 
     @Override
-    public UpdateWrapper<T> setSql(boolean condition, String sql) {
-        if (condition && StringUtils.isNotBlank(sql)) {
-            sqlSet.add(sql);
+    public UpdateWrapper<T> setSql(boolean condition, String setSql, Object... params) {
+        if (condition && StringUtils.isNotBlank(setSql)) {
+            sqlSet.add(formatSqlMaybeWithParam(setSql, params));
         }
         return typedThis;
     }

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/update/LambdaUpdateChainWrapper.java

@@ -53,8 +53,8 @@ public class LambdaUpdateChainWrapper<T> extends AbstractChainWrapper<T, SFuncti
     }
 
     @Override
-    public LambdaUpdateChainWrapper<T> setSql(boolean condition, String sql) {
-        wrapperChildren.setSql(condition, sql);
+    public LambdaUpdateChainWrapper<T> setSql(boolean condition, String setSql, Object... params) {
+        wrapperChildren.setSql(condition, setSql, params);
         return typedThis;
     }
 

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/update/UpdateChainWrapper.java

@@ -55,8 +55,8 @@ public class UpdateChainWrapper<T> extends AbstractChainWrapper<T, String, Updat
     }
 
     @Override
-    public UpdateChainWrapper<T> setSql(boolean condition, String sql) {
-        wrapperChildren.setSql(condition, sql);
+    public UpdateChainWrapper<T> setSql(boolean condition, String setSql, Object... params) {
+        wrapperChildren.setSql(condition, setSql, params);
         return typedThis;
     }
 

+ 1 - 0
mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/AbstractKtWrapper.kt

@@ -30,6 +30,7 @@ import kotlin.reflect.KProperty
  * @author yangyuhan,MieMie,HanChunLin
  * @since 2018-11-07
  */
+@Suppress("serial")
 abstract class AbstractKtWrapper<T, Children : AbstractKtWrapper<T, Children>> : AbstractWrapper<T, KProperty<*>, Children>() {
 
     /**

+ 1 - 1
mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryChainWrapper.kt

@@ -27,12 +27,12 @@ import kotlin.reflect.KProperty
  * @author FlyInWind
  * @since 2020-10-18
  */
+@Suppress("serial")
 open class KtQueryChainWrapper<T : Any>(
     internal val baseMapper: BaseMapper<T>
 ) : AbstractChainWrapper<T, KProperty<*>, KtQueryChainWrapper<T>, KtQueryWrapper<T>>(),
     ChainQuery<T>, Query<KtQueryChainWrapper<T>, T, KProperty<*>> {
 
-
     constructor(baseMapper: BaseMapper<T>, entityClass: Class<T>) : this(baseMapper) {
         super.wrapperChildren = KtQueryWrapper(entityClass)
     }

+ 1 - 0
mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtQueryWrapper.kt

@@ -32,6 +32,7 @@ import kotlin.reflect.KProperty
  * @author yangyuhan
  * @since 2018-11-02
  */
+@Suppress("serial")
 open class KtQueryWrapper<T : Any> : AbstractKtWrapper<T, KtQueryWrapper<T>>, Query<KtQueryWrapper<T>, T, KProperty<*>> {
 
     /**

+ 3 - 3
mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateChainWrapper.kt

@@ -25,12 +25,12 @@ import kotlin.reflect.KProperty
  * @author FlyInWind
  * @since 2020-10-18
  */
+@Suppress("serial")
 open class KtUpdateChainWrapper<T : Any>(
     internal val baseMapper: BaseMapper<T>
 ) : AbstractChainWrapper<T, KProperty<*>, KtUpdateChainWrapper<T>, KtUpdateWrapper<T>>(),
     ChainUpdate<T>, Update<KtUpdateChainWrapper<T>, KProperty<*>> {
 
-
     constructor(baseMapper: BaseMapper<T>, entityClass: Class<T>) : this(baseMapper) {
         super.wrapperChildren = KtUpdateWrapper(entityClass)
     }
@@ -44,8 +44,8 @@ open class KtUpdateChainWrapper<T : Any>(
         return typedThis
     }
 
-    override fun setSql(condition: Boolean, sql: String): KtUpdateChainWrapper<T> {
-        wrapperChildren.setSql(condition, sql)
+    override fun setSql(condition: Boolean, setSql: String, vararg params: Any): KtUpdateChainWrapper<T> {
+        wrapperChildren.setSql(condition, setSql, params)
         return typedThis
     }
 

+ 4 - 3
mybatis-plus-extension/src/main/kotlin/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt

@@ -33,6 +33,7 @@ import kotlin.reflect.KProperty
  * @author yangyuhan
  * @since 2018-11-02
  */
+@Suppress("serial")
 open class KtUpdateWrapper<T : Any> : AbstractKtWrapper<T, KtUpdateWrapper<T>>, Update<KtUpdateWrapper<T>, KProperty<*>> {
 
     /**
@@ -68,9 +69,9 @@ open class KtUpdateWrapper<T : Any> : AbstractKtWrapper<T, KtUpdateWrapper<T>>,
         else sqlSet.stream().collect(joining(StringPool.COMMA))
     }
 
-    override fun setSql(condition: Boolean, sql: String): KtUpdateWrapper<T> {
-        if (condition && StringUtils.isNotBlank(sql)) {
-            sqlSet.add(sql)
+    override fun setSql(condition: Boolean, setSql: String, vararg params: Any): KtUpdateWrapper<T> {
+        if (condition && StringUtils.isNotBlank(setSql)) {
+            sqlSet.add(formatSqlMaybeWithParam(setSql, *params))
         }
         return typedThis
     }

+ 17 - 10
mybatis-plus-extension/src/test/kotlin/com/baomidou/mybatisplus/test/kotlin/WrapperTest.kt

@@ -16,7 +16,6 @@
 package com.baomidou.mybatisplus.test.kotlin
 
 import com.baomidou.mybatisplus.core.MybatisConfiguration
-import com.baomidou.mybatisplus.core.conditions.ISqlSegment
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper
 import com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper
 import com.baomidou.mybatisplus.extension.kotlin.KtUpdateWrapper
@@ -31,20 +30,28 @@ class WrapperTest {
         TableInfoHelper.initTableInfo(MapperBuilderAssistant(MybatisConfiguration(), ""), User::class.java)
     }
 
-    private fun logSqlSegment(explain: String, sqlSegment: ISqlSegment) {
-        println(String.format(" ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   ->(%s)<-   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓", explain))
-        println(sqlSegment.sqlSegment)
-    }
-
     @Test
     fun testLambdaQuery() {
-        logSqlSegment("测试1.1 LambdaKt", KtQueryWrapper(User()).eq(User::name, "sss").eq(User::roleId, "sss2"))
-        logSqlSegment("测试1.2 LambdaKt", KtQueryWrapper(User::class.java).eq(User::name, "sss").eq(User::roleId, "sss2"))
+        logSqlSegment("测试1.1 LambdaKt", KtQueryWrapper(User()).eq(User::name, "sss").eq(User::roleId, "sss2")
+            .apply("a=1").apply("b={0}", 3).apply("c={0} and d={1}", 4, 5))
     }
 
     @Test
     fun testLambdaUpdate() {
-        logSqlSegment("测试2.1 LambdaKt", KtUpdateWrapper(User()).eq(User::name, "sss").eq(User::roleId, "sss2"))
-        logSqlSegment("测试2.2 LambdaKt", KtUpdateWrapper(User::class.java).eq(User::name, "sss").eq(User::roleId, "sss2"))
+        logSqlSegmentAndSetSql("测试2.1 LambdaKt", KtUpdateWrapper(User()).eq(User::name, "sss").eq(User::roleId, "sss2")
+            .setSql("a=1").setSql("b={0}", 3).setSql("c={0},d={1}", 4, 5))
+    }
+
+    private fun logSqlSegment(explain: String, wp: KtQueryWrapper<*>) {
+        println(String.format(" ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   ->(%s)<-   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓", explain))
+        println(wp.sqlSegment)
+        wp.paramNameValuePairs.forEach(::println)
+    }
+
+    private fun logSqlSegmentAndSetSql(explain: String, wp: KtUpdateWrapper<*>) {
+        println(String.format(" ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   ->(%s)<-   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓", explain))
+        println(wp.sqlSegment)
+        println(wp.sqlSet)
+        wp.paramNameValuePairs.forEach(::println)
     }
 }