浏览代码

一波 lambda 重构

hubin 7 年之前
父节点
当前提交
e043619284

+ 64 - 39
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/QueryWrapper.java

@@ -15,16 +15,39 @@
  */
 package com.baomidou.mybatisplus.core.conditions;
 
-import com.baomidou.mybatisplus.core.enums.SqlKeyword;
-import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-
-import java.util.*;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.AND;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.BETWEEN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EQ;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EXISTS;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GROUP_BY;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.HAVING;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NOT_NULL;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NULL;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LIKE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.OR;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
+import com.baomidou.mybatisplus.core.enums.SqlKeyword;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.support.Property;
 
 
 /**
@@ -61,8 +84,9 @@ public class QueryWrapper<T> extends Wrapper<T> {
         return addNestedCondition(func, AND);
     }
 
-    public QueryWrapper or(String column, Object val) {
-        return addCondition(true, column, OR, val);//todo 待动
+    public QueryWrapper or(Property<T, ?> property, Object val) {
+        //todo 待动
+        return addCondition(true, property, OR, val);
     }
 
     public QueryWrapper or(Function<QueryWrapper, QueryWrapper> func) {
@@ -122,85 +146,85 @@ public class QueryWrapper<T> extends Wrapper<T> {
     /**
      * 等于 =
      */
-    public QueryWrapper eq(String column, Object val) {
-        return eq(true, column, val);
+    public QueryWrapper eq(Property<T, ?> property, Object val) {
+        return eq(true, property, val);
     }
 
     /**
      * 等于 =
      */
-    public QueryWrapper eq(boolean condition, String column, Object val) {
-        return addCondition(condition, column, EQ, val);
+    public QueryWrapper eq(boolean condition, Property<T, ?> property, Object val) {
+        return addCondition(condition, property, EQ, val);
     }
 
     /**
      * 不等于 <>
      */
-    public QueryWrapper ne(String column, Object val) {
-        return ne(true, column, val);
+    public QueryWrapper ne(Property<T, ?> property, Object val) {
+        return ne(true, property, val);
     }
 
     /**
      * 不等于 <>
      */
-    public QueryWrapper ne(boolean condition, String column, Object val) {
-        return addCondition(condition, column, NE, val);
+    public QueryWrapper ne(boolean condition, Property<T, ?> property, Object val) {
+        return addCondition(condition, property, NE, val);
     }
 
     /**
      * 大于 >
      */
-    public QueryWrapper gt(String column, Object val) {
-        return gt(true, column, val);
+    public QueryWrapper gt(Property<T, ?> property, Object val) {
+        return gt(true, property, val);
     }
 
     /**
      * 大于 >
      */
-    public QueryWrapper gt(boolean condition, String column, Object val) {
-        return addCondition(condition, column, GT, val);
+    public QueryWrapper gt(boolean condition, Property<T, ?> property, Object val) {
+        return addCondition(condition, property, GT, val);
     }
 
     /**
      * 大于等于 >=
      */
-    public QueryWrapper ge(String column, Object val) {
-        return ge(true, column, val);
+    public QueryWrapper ge(Property<T, ?> property, Object val) {
+        return ge(true, property, val);
     }
 
     /**
      * 大于等于 >=
      */
-    public QueryWrapper ge(boolean condition, String column, Object val) {
-        return addCondition(condition, column, GE, val);
+    public QueryWrapper ge(boolean condition, Property<T, ?> property, Object val) {
+        return addCondition(condition, property, GE, val);
     }
 
     /**
      * 小于 <
      */
-    public QueryWrapper lt(String column, Object val) {
-        return lt(true, column, val);
+    public QueryWrapper lt(Property<T, ?> property, Object val) {
+        return lt(true, property, val);
     }
 
     /**
      * 小于 <
      */
-    public QueryWrapper lt(boolean condition, String column, Object val) {
-        return addCondition(condition, column, LT, val);
+    public QueryWrapper lt(boolean condition, Property<T, ?> property, Object val) {
+        return addCondition(condition, property, LT, val);
     }
 
     /**
      * 小于等于 <=
      */
-    public QueryWrapper le(String column, Object val) {
-        return le(true, column, val);
+    public QueryWrapper le(Property<T, ?> property, Object val) {
+        return le(true, property, val);
     }
 
     /**
      * 小于等于 <=
      */
-    public QueryWrapper le(boolean condition, String column, Object val) {
-        return addCondition(condition, column, LE, val);
+    public QueryWrapper le(boolean condition, Property<T, ?> property, Object val) {
+        return addCondition(condition, property, LE, val);
     }
 
     /**
@@ -293,13 +317,14 @@ public class QueryWrapper<T> extends Wrapper<T> {
      * </p>
      *
      * @param condition  是否执行
-     * @param column     字段
+     * @param property   属性
      * @param sqlKeyword SQL 关键词
      * @param val        条件值
      * @return this
      */
-    protected QueryWrapper addCondition(boolean condition, String column, SqlKeyword sqlKeyword, Object val) {
-        return doIt(condition, () -> column, sqlKeyword, () -> this.formatSql("{0}", val));
+    protected QueryWrapper addCondition(boolean condition, Property<T, ?> property, SqlKeyword sqlKeyword, Object val) {
+        return doIt(condition, () -> TableInfoHelper.toColumn(property),
+            sqlKeyword, () -> this.formatSql("{0}", val));
     }
 
     /**
@@ -333,13 +358,13 @@ public class QueryWrapper<T> extends Wrapper<T> {
      * 对sql片段进行组装
      * </p>
      *
-     * @param condition    是否执行
-     * @param iSqlSegments sql片段数组
+     * @param condition   是否执行
+     * @param sqlSegments sql片段数组
      * @return this
      */
-    protected QueryWrapper doIt(boolean condition, ISqlSegment... iSqlSegments) {
+    protected QueryWrapper doIt(boolean condition, ISqlSegment... sqlSegments) {
         if (condition) {
-            expression.addAll(Arrays.asList(iSqlSegments));
+            expression.addAll(Arrays.asList(sqlSegments));
         }
         return this;
     }

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

@@ -60,6 +60,7 @@ public class UpdateWrapper<T> extends QueryWrapper<T> {
     /**
      * SQL SET 字段
      */
+    @Override
     public String getSqlSet() {
         return this.sqlSet;
     }

+ 6 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/Wrapper.java

@@ -33,5 +33,11 @@ public abstract class Wrapper<T> implements ISqlSegment {
         return null;
     }
 
+    /**
+     * 更新 SQL 片段(子类实现)
+     */
+    public String getSqlSet() {
+        return null;
+    }
 }
 

+ 2 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java

@@ -56,6 +56,7 @@ public interface BaseMapper<T> {
      * @param entity 实体对象
      * @return int
      */
+    @Deprecated
     Integer insertAllColumn(T entity);
 
     /**
@@ -116,6 +117,7 @@ public interface BaseMapper<T> {
      * @param entity 实体对象
      * @return int
      */
+    @Deprecated
     Integer updateAllColumnById(@Param("et") T entity);
 
     /**

+ 10 - 10
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/TableInfoHelper.java

@@ -42,7 +42,6 @@ import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.core.assist.ISqlRunner;
 import com.baomidou.mybatisplus.core.config.DbConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
@@ -102,16 +101,17 @@ public class TableInfoHelper {
      */
     private static String resolveColumn(SerializedLambda lambda) {
         String filedName = resolveFieldName(lambda);
+        return filedName;
         // 为防止后面字段,驼峰等信息根据配置发生变化,此处不自己解析字段信息
-        return getTableInfo(resolveClass(lambda)).getFieldList().stream()
-            .filter(fieldInfo -> filedName.equals(fieldInfo.getProperty()))
-            .findAny()
-            .map(TableFieldInfo::getColumn)
-            .orElseThrow(() -> {
-                String message = String.format("没有根据 %s#%s 解析到对应的表列名称,您可能排除了该字段或者 %s 方法不是标准的 getter 方法"
-                    , lambda.getImplClass(), lambda.getImplMethodName(), lambda.getImplMethodName());
-                return new MybatisPlusException(message);
-            });
+//        return getTableInfo(resolveClass(lambda)).getFieldList().stream()
+//            .filter(fieldInfo -> filedName.equals(fieldInfo.getProperty()))
+//            .findAny()
+//            .map(TableFieldInfo::getColumn)
+//            .orElseThrow(() -> {
+//                String message = String.format("没有根据 %s#%s 解析到对应的表列名称,您可能排除了该字段或者 %s 方法不是标准的 getter 方法"
+//                    , lambda.getImplClass(), lambda.getImplMethodName(), lambda.getImplMethodName());
+//                return new MybatisPlusException(message);
+//            });
     }
 
     /**

+ 3 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/support/SerializedLambda.java

@@ -58,6 +58,8 @@ public class SerializedLambda implements Serializable {
 
     @Override
     public String toString() {
-        return super.toString() + implClass.replace("/", ".") + "#" + implMethodName;
+        return new StringBuilder(super.toString())
+            .append(implClass.replace("/", "."))
+            .append("#").append(implMethodName).toString();
     }
 }

+ 1 - 1
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/QueryWrapperTest.java

@@ -13,7 +13,7 @@ public class QueryWrapperTest {
 
     @Test
     public void test() {
-        Wrapper wrapper = new EntityWrapper().eq("abc", 123);
+        Wrapper wrapper = new EntityWrapper().eq(User::getName, 123);
         log(wrapper.getSqlSegment());
     }
 

+ 7 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/User.java

@@ -16,4 +16,11 @@ public class User {
 
     private Integer roleId;
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
 }

+ 1 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/toolkit/LambdaUtilsTest.java

@@ -15,6 +15,7 @@ public class LambdaUtilsTest {
         SerializedLambda lambda = LambdaUtils.resolve(TestPojo::getId);
         Assert.assertEquals(TestPojo.class.getName(), lambda.getImplClass().replace("/", "."));
         Assert.assertEquals("getId", lambda.getImplMethodName());
+        Assert.assertEquals("id", TableInfoHelper.toColumn(TestPojo::getId));
 
         Cond<TestPojo> cond = new Cond<>();
         System.out.println(cond.eq(TestPojo::getId, 123).toString());