Ver código fonte

优化 wrapper

hubin 7 anos atrás
pai
commit
af8d42a759

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

@@ -38,7 +38,7 @@ public abstract class AbstractLambdaWrapper<T, This extends AbstractLambdaWrappe
     private boolean initColumnMap = false;
 
     @Override
-    public String columnToString(Property<T, ?> column) {
+    protected String columnToString(Property<T, ?> column) {
         return getColumn(LambdaUtils.resolve(column));
     }
 

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

@@ -90,7 +90,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
         return typedThis();
     }
 
-    public abstract String columnToString(R column);
+    protected abstract String columnToString(R column);
 
     public This apply(String condition) {
         return doIt(true, () -> condition);

+ 3 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/select/EntityWrapper.java

@@ -37,7 +37,6 @@ public class EntityWrapper<T> extends AbstractWrapper<T, String, EntityWrapper<T
      */
     private String sqlSelect;
 
-
     public EntityWrapper() {
         this(null, null);
     }
@@ -64,7 +63,7 @@ public class EntityWrapper<T> extends AbstractWrapper<T, String, EntityWrapper<T
         return StringUtils.isEmpty(sqlSelect) ? null : SqlUtils.stripSqlInjection(sqlSelect);
     }
 
-    public EntityWrapper<T> setSqlSelect(String sqlSelect) {
+    public EntityWrapper<T> select(String sqlSelect) {
         if (StringUtils.isNotEmpty(sqlSelect)) {
             this.sqlSelect = sqlSelect;
         }
@@ -72,11 +71,11 @@ public class EntityWrapper<T> extends AbstractWrapper<T, String, EntityWrapper<T
     }
 
     public LambdaEntityWrapper<T> stream() {
-        return new LambdaEntityWrapper<>(entity, sqlSelect, paramNameSeq, paramNameValuePairs);
+        return new LambdaEntityWrapper<>(entity, paramNameSeq, paramNameValuePairs);
     }
 
     @Override
-    public String columnToString(String column) {
+    protected String columnToString(String column) {
         return column;
     }
 

+ 24 - 8
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/select/LambdaEntityWrapper.java

@@ -15,10 +15,16 @@
  */
 package com.baomidou.mybatisplus.core.conditions.select;
 
+import static java.util.stream.Collectors.joining;
+
 import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+import com.baomidou.mybatisplus.core.toolkit.support.Property;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -35,23 +41,33 @@ public class LambdaEntityWrapper<T> extends AbstractLambdaWrapper<T, LambdaEntit
     /**
      * SQL 查询字段内容,例如:id,name,age
      */
-    private String sqlSelect;
+    private List<String> sqlSelect = new ArrayList<>();
 
-    LambdaEntityWrapper(T entity, String sqlSelect, AtomicInteger paramNameSeq, Map<String, Object> paramNameValuePairs) {
+    LambdaEntityWrapper(T entity, AtomicInteger paramNameSeq, Map<String, Object> paramNameValuePairs) {
         this.entity = entity;
-        this.sqlSelect = sqlSelect;
         this.paramNameSeq = paramNameSeq;
         this.paramNameValuePairs = paramNameValuePairs;
     }
 
     @Override
     public String getSqlSelect() {
-        return StringUtils.isEmpty(sqlSelect) ? null : SqlUtils.stripSqlInjection(sqlSelect);
+        if (CollectionUtils.isEmpty(sqlSelect)) {
+            return null;
+        }
+        return SqlUtils.stripSqlInjection(sqlSelect.stream().collect(joining(",")));
     }
 
-    public LambdaEntityWrapper<T> setSqlSelect(String sqlSelect) {
-        if (StringUtils.isNotEmpty(sqlSelect)) {
-            this.sqlSelect = sqlSelect;
+    /**
+     * <p>
+     * SELECT 部分 SQL 设置
+     * </p>
+     *
+     * @param columns 查询字段
+     * @return
+     */
+    public LambdaEntityWrapper<T> select(Property<T, ?>... columns) {
+        for (Property<T, ?> column : columns) {
+            sqlSelect.add(this.columnToString(column));
         }
         return typedThis();
     }
@@ -59,6 +75,6 @@ public class LambdaEntityWrapper<T> extends AbstractLambdaWrapper<T, LambdaEntit
 
     @Override
     protected LambdaEntityWrapper<T> instance(AtomicInteger paramNameSeq, Map<String, Object> paramNameValuePairs) {
-        return new LambdaEntityWrapper<>(entity, sqlSelect, paramNameSeq, paramNameValuePairs);
+        return new LambdaEntityWrapper<>(entity, paramNameSeq, paramNameValuePairs);
     }
 }

+ 0 - 77
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/AbstractUpdateWrapper.java

@@ -1,77 +0,0 @@
-package com.baomidou.mybatisplus.core.conditions.update;
-
-import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
-import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EQ;
-
-/**
- * <p>
- * Update 条件封装
- * </p>
- *
- * @author hubin miemie HCL
- * @since 2018-05-30
- */
-public abstract class AbstractUpdateWrapper<T, R, This extends AbstractUpdateWrapper<T, R, This>> extends AbstractWrapper<T, R, This> {
-
-//    /**
-//     * SQL 更新字段内容,例如:name='1',age=2
-//     */
-//    protected String sqlSet;
-
-    private List<ISqlSegment> setExpression = new ArrayList<>();
-
-    /**
-     * 例: setSql("name='1',age=2")
-     */
-    public This setSql(String sql) {
-        return setSql(true, sql);
-    }
-
-    /**
-     * 例: setSql("name='1',age=2")
-     */
-    public This setSql(boolean condition, String sql) {
-        return doItUpd(condition, () -> sql);
-    }
-
-    /**
-     * 字段 = 值
-     */
-    public This set(R column, Object val) {
-        return set(true, column, val);
-    }
-
-    /**
-     * 字段 = 值
-     */
-    public This set(boolean condition, R column, Object val) {
-        return doItUpd(condition, () -> columnToString(column), EQ, () -> formatSql("{0}", val));
-    }
-
-    protected This doItUpd(boolean condition, ISqlSegment... sqlSegments) {
-        if (condition) {
-            setExpression.addAll(Arrays.asList(sqlSegments));
-            setExpression.add(() -> ",");
-        }
-        return typedThis();
-    }
-
-    @Override
-    public String getSqlSet() {
-        String sqlSet = String.join("", setExpression.stream()
-            .map(ISqlSegment::getSqlSegment)
-            .collect(Collectors.toList()));
-        if (StringUtils.isNotEmpty(sqlSet)) {
-            sqlSet = sqlSet.substring(0, sqlSet.length() - 1);
-        }
-        return sqlSet;
-    }
-}

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

@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.Property;
 
 /**
@@ -39,7 +40,7 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
     /**
      * SQL 更新字段内容,例如:name='1',age=2
      */
-    private List<String> expression = new ArrayList<>();
+    private List<String> sqlSet = new ArrayList<>();
 
     LambdaUpdateWrapper(T entity, AtomicInteger paramNameSeq, Map<String, Object> paramNameValuePairs) {
         this.entity = entity;
@@ -49,14 +50,20 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
 
     @Override
     public String getSqlSet() {
-        if (CollectionUtils.isEmpty(expression)) {
+        if (CollectionUtils.isEmpty(sqlSet)) {
             return null;
         }
-        return expression.stream().collect(joining(","));
+        return SqlUtils.stripSqlInjection(sqlSet.stream().collect(joining(",")));
     }
 
     public LambdaUpdateWrapper<T> set(Property<T, ?> column, Object val) {
-        expression.add(String.format("%s=%s", columnToString(column), val));
+        return this.set(true, column, val);
+    }
+
+    public LambdaUpdateWrapper<T> set(boolean condition, Property<T, ?> column, Object val) {
+        if (condition) {
+            sqlSet.add(String.format("%s=%s", columnToString(column), val));
+        }
         return typedThis();
     }
 

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

@@ -38,7 +38,7 @@ public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T
     /**
      * SQL 更新字段内容,例如:name='1',age=2
      */
-    private List<String> expression = new ArrayList<>();
+    private List<String> sqlSet = new ArrayList<>();
 
     public UpdateWrapper() {
         this(null);
@@ -61,20 +61,57 @@ public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T
 
     @Override
     public String getSqlSet() {
-        if (CollectionUtils.isEmpty(expression)) {
+        if (CollectionUtils.isEmpty(sqlSet)) {
             return null;
         }
-        return expression.stream().collect(joining(","));
+        return sqlSet.stream().collect(joining(","));
     }
 
+    /**
+     * <p>
+     * SQL SET 字段
+     * </p>
+     *
+     * @param column 字段
+     * @param val    值
+     * @return
+     */
     public UpdateWrapper<T> set(String column, Object val) {
-        // todo 待优化
-        expression.add(String.format("%s=%s", column, val));
+        return this.set(true, column, val);
+    }
+
+    /**
+     * <p>
+     * SQL SET 字段
+     * </p>
+     *
+     * @param condition 操作条件
+     * @param column    字段
+     * @param val       值
+     * @return
+     */
+    public UpdateWrapper<T> set(boolean condition, String column, Object val) {
+        if (condition) {
+            sqlSet.add(String.format("%s=%s", column, val));
+        }
+        return typedThis();
+    }
+
+    /**
+     * <p>
+     * SET 部分 SQL
+     * </p>
+     *
+     * @param sql SET 部分内容
+     * @return
+     */
+    public UpdateWrapper<T> setSql(String sql) {
+        sqlSet.add(sql);
         return typedThis();
     }
 
     @Override
-    public String columnToString(String column) {
+    protected String columnToString(String column) {
         return column;
     }
 

+ 8 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/WrapperTest.java

@@ -42,6 +42,14 @@ public class WrapperTest {
         log(ew.getSqlSegment());
     }
 
+    @Test
+    public void test3() {
+        UpdateWrapper<User> ew = new UpdateWrapper<User>()
+           .setSql("abc=1,def=2").eq("id", 1).and().ge("age", 3);
+        log(ew.getSqlSet());
+        log(ew.getSqlSegment());
+    }
+
 //    public void test() {
 //        String sql = new QueryWrapper()
 //            .where("b.age > 18", condition ->