Browse Source

优化完毕

miemie 7 years ago
parent
commit
3baba242c7

+ 40 - 19
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -244,35 +244,56 @@ public class TableFieldInfo {
         return sqlSelect;
     }
 
+    /**
+     * 获取 inset 时候插入值 sql 脚本片段
+     * insert into table (字段) values (值)
+     * 位于 "值" 部位
+     *
+     * @return sql 脚本片段
+     */
+    public String getInsertSqlProperty() {
+        String sqlScript = SqlScriptUtils.HASH_LEFT_BRACE + el + StringPool.RIGHT_BRACE + StringPool.COMMA;
+        if (fieldFill == FieldFill.INSERT || fieldFill == FieldFill.INSERT_UPDATE) {
+            return sqlScript;
+        }
+        return SqlScriptUtils.convertIf(sqlScript, property, isCharSequence, fieldStrategy);
+    }
+
+    /**
+     * 获取 inset 时候字段 sql 脚本片段
+     * insert into table (字段) values (值)
+     * 位于 "字段" 部位
+     *
+     * @return sql 脚本片段
+     */
+    public String getInsertSqlColumn() {
+        String sqlScript = column + StringPool.COMMA;
+        if (fieldFill == FieldFill.INSERT || fieldFill == FieldFill.INSERT_UPDATE) {
+            return sqlScript;
+        }
+        return SqlScriptUtils.convertIf(sqlScript, property, isCharSequence, fieldStrategy);
+    }
+
     /**
      * 获取 set sql 片段
      *
-     * @param isInsert 是 insert sql 否
-     * @param prefix   前缀
+     * @param prefix 前缀
      * @return sql 脚本片段
      */
-    public String getSqlSet(boolean isInsert, String prefix) {
+    public String getSqlSet(String prefix) {
         prefix = StringUtils.isEmpty(prefix) ? StringPool.EMPTY : prefix;
-        // column = ?
+        // 默认: column=
         String sqlSet = column + StringPool.EQUALS;
-        // 默认判断 update 语句
-        boolean existIf = fieldFill != FieldFill.UPDATE && fieldFill != FieldFill.INSERT_UPDATE;
-        if (isInsert) {
-            // insert 语句
-            existIf = fieldFill != FieldFill.INSERT && fieldFill != FieldFill.INSERT_UPDATE;
-            sqlSet += ("#{" + prefix + el + "}");
+        if (StringUtils.isNotEmpty(update)) {
+            sqlSet += String.format(update, column);
         } else {
-            if (StringUtils.isNotEmpty(update)) {
-                sqlSet += String.format(update, column);
-            } else {
-                sqlSet += ("#{" + prefix + el + "}");
-            }
+            sqlSet += ("#{" + prefix + el + "}");
         }
-        // 逗号结尾
         sqlSet += StringPool.COMMA;
-        if (existIf) {
-            sqlSet = SqlScriptUtils.convertIf(sqlSet, prefix + property, isCharSequence, fieldStrategy);
+        if (fieldFill == FieldFill.UPDATE || fieldFill == FieldFill.INSERT_UPDATE) {
+            // 不进行 if 包裹
+            return sqlSet;
         }
-        return sqlSet;
+        return SqlScriptUtils.convertIf(sqlSet, prefix + property, isCharSequence, fieldStrategy);
     }
 }

+ 56 - 20
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import lombok.AccessLevel;
 import lombok.Data;
@@ -151,7 +152,7 @@ public class TableInfo {
      *
      * @return sql 片段
      */
-    public String getSqlSelect() {
+    public String getKeySqlSelect() {
         if (sqlSelect != null) {
             return sqlSelect;
         }
@@ -177,7 +178,7 @@ public class TableInfo {
         if (allSqlSelect != null) {
             return allSqlSelect;
         }
-        String sqlSelect = getSqlSelect();
+        String sqlSelect = getKeySqlSelect();
         String fieldsSqlSelect = fieldList.stream().filter(TableFieldInfo::isSelect)
             .map(i -> i.getSqlSelect(dbType)).collect(joining(StringPool.COMMA));
         if (StringUtils.isNotEmpty(sqlSelect) && StringUtils.isNotEmpty(fieldsSqlSelect)) {
@@ -191,37 +192,72 @@ public class TableInfo {
     }
 
     /**
-     * 获取主键的 sql set 片段
+     * 获取 inset 时候主键 sql 脚本片段
+     * insert into table (字段) values (值)
+     * 位于 "值" 部位
      *
-     * @param prefix 前缀
      * @return sql 脚本片段
      */
-    public String getSqlSet(String prefix) {
+    public String getKeyInsertSqlProperty() {
         if (StringUtils.isNotEmpty(keyProperty)) {
-            return keyColumn + StringPool.EQUALS + "#{" + prefix + keyProperty + "}" + StringPool.COMMA +
-                StringPool.NEWLINE;
+            if (idType.getKey() == 0) {
+                return "";
+            }
+            return SqlScriptUtils.HASH_LEFT_BRACE + keyProperty + StringPool.RIGHT_BRACE + StringPool.COMMA;
+        }
+        return "";
+    }
+
+    /**
+     * 获取 inset 时候主键 sql 脚本片段
+     * insert into table (字段) values (值)
+     * 位于 "字段" 部位
+     *
+     * @return sql 脚本片段
+     */
+    public String getKeyInsertSqlColumn() {
+        if (StringUtils.isNotEmpty(keyColumn)) {
+            if (idType.getKey() == 0) {
+                return "";
+            }
+            return keyColumn + StringPool.COMMA;
         }
         return "";
     }
 
+
+    /**
+     * 获取所有 inset 时候插入值 sql 脚本片段
+     * insert into table (字段) values (值)
+     * 位于 "值" 部位
+     *
+     * @return sql 脚本片段
+     */
+    public String getAllInsertSqlProperty() {
+        return getKeyInsertSqlProperty() + fieldList.stream().map(TableFieldInfo::getInsertSqlProperty)
+            .collect(joining(StringPool.EMPTY));
+    }
+
+    /**
+     * 获取 inset 时候字段 sql 脚本片段
+     * insert into table (字段) values (值)
+     * 位于 "字段" 部位
+     *
+     * @return sql 脚本片段
+     */
+    public String getAllInsertSqlColumn() {
+        return getKeyInsertSqlColumn() + fieldList.stream().map(TableFieldInfo::getInsertSqlColumn)
+            .collect(joining(StringPool.EMPTY));
+    }
+
     /**
      * 获取所有的 sql set 片段
      *
-     * @param isInsert 是否 insert 语句
-     * @param prefix   前缀
+     * @param prefix 前缀
      * @return sql 脚本片段
      */
-    public String getAllSqlSet(boolean isInsert, String prefix) {
+    public String getAllSqlSet(String prefix) {
         String newPrefix = StringUtils.isEmpty(prefix) ? StringPool.EMPTY : prefix;
-        String allSqlSet = fieldList.stream().map(i -> i.getSqlSet(isInsert, newPrefix))
-            .collect(joining(StringPool.NEWLINE));
-        if (!isInsert) {
-            return allSqlSet;
-        }
-        if (idType.getKey() > 1) {
-            // 可带有填充功能
-            allSqlSet = getSqlSet(newPrefix) + allSqlSet;
-        }
-        return allSqlSet;
+        return fieldList.stream().map(i -> i.getSqlSet(newPrefix)).collect(joining(StringPool.NEWLINE));
     }
 }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/LambdaUtils.java

@@ -100,7 +100,7 @@ public final class LambdaUtils {
             if (tableInfo.getClazz() != clazz) {
                 saveCache(tableInfo.getClazz().getName(), tableInfo.getKeyProperty(), tableInfo.getKeyColumn());
             }
-            map.put(tableInfo.getKeyProperty(), tableInfo.getSqlSelect());
+            map.put(tableInfo.getKeyProperty(), tableInfo.getKeySqlSelect());
         }
         tableInfo.getFieldList().forEach(i -> {
             if (i.getClazz() != clazz) {

+ 16 - 9
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlScriptUtils.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.core.toolkit.sql;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 
 /**
  * <p>
@@ -27,27 +28,33 @@ import com.baomidou.mybatisplus.annotation.FieldStrategy;
  */
 public final class SqlScriptUtils {
 
+    /**
+     * 脚本符号: #{
+     */
+    public static final String HASH_LEFT_BRACE = StringPool.HASH + StringPool.LEFT_BRACE;
+
+    private SqlScriptUtils() {
+        // ignore
+    }
+
     /**
      * <p>
      * 获取 带 if 标签的 sql
      * </p>
      *
-     * @param sqlSet         set sql 片段
+     * @param sqlScript      sql 脚本片段
      * @param property       entity 属性
      * @param isCharSequence 是 CharSequence 类型否
      * @param fieldStrategy  验证逻辑
      * @return if 脚本
      */
-    public static String convertIf(String sqlSet, String property, boolean isCharSequence, FieldStrategy fieldStrategy) {
+    public static String convertIf(String sqlScript, String property, boolean isCharSequence, FieldStrategy fieldStrategy) {
         if (fieldStrategy == FieldStrategy.IGNORED) {
-            return sqlSet;
-        }
-        if (fieldStrategy == FieldStrategy.NOT_NULL) {
-            return String.format("<if test=\"%s != null\">%s</if>", property, sqlSet);
+            return sqlScript;
         }
-        if (isCharSequence) {
-            return String.format("<if test=\"%s != null and %s != ''\">%s</if>", property, property, sqlSet);
+        if (fieldStrategy == FieldStrategy.NOT_EMPTY && isCharSequence) {
+            return String.format("<if test=\"%s != null and %s != ''\">%s</if>", property, property, sqlScript);
         }
-        return String.format("<if test=\"%s != null\">%s</if>", property, sqlSet);
+        return String.format("<if test=\"%s != null\">%s</if>", property, sqlScript);
     }
 }

+ 13 - 2
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/EncryptTest.java

@@ -1,5 +1,7 @@
 package com.baomidou.mybatisplus.core.test;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.toolkit.EncryptUtils;
@@ -29,17 +31,26 @@ public class EncryptTest {
     @Test
     public void testTableInfoHelper() {
         TableInfo info = TableInfoHelper.initTableInfo(null, Xx.class);
-        System.out.println(info.getAllSqlSet(true, null));
+        System.out.println("----------- AllInsertSqlColumn -----------");
+        System.out.println(info.getAllInsertSqlColumn());
+        System.out.println("----------- AllInsertSqlProperty -----------");
+        System.out.println(info.getAllInsertSqlProperty());
+        System.out.println("----------- AllSqlSet -----------");
+        System.out.println(info.getAllSqlSet(null));
     }
 
     @Data
     public static class Xx {
         private Long id;
-        @TableField(exist = false)
+        @TableField(fill = FieldFill.INSERT)
         private String x1;
+        @TableField(fill = FieldFill.INSERT_UPDATE, strategy = FieldStrategy.NOT_EMPTY)
         private String x2;
+        @TableField(fill = FieldFill.UPDATE)
         private String x3;
+        @TableField(strategy = FieldStrategy.NOT_EMPTY)
         private String x4;
+        @TableField(strategy = FieldStrategy.IGNORED)
         private String x5;
     }
 }