소스 검색

Merge branch '3.0' of https://gitee.com/baomidou/mybatis-plus into 3.0

nieqiuqiu 6 년 전
부모
커밋
693c608745

+ 1 - 0
build.gradle.kts

@@ -58,6 +58,7 @@ val lib = mapOf(
     "jackson"                    to "com.fasterxml.jackson.core:jackson-databind:2.9.6",
     "jackson"                    to "com.fasterxml.jackson.core:jackson-databind:2.9.6",
     "tomcatjdbc"                 to "org.apache.tomcat:tomcat-jdbc:9.0.16",
     "tomcatjdbc"                 to "org.apache.tomcat:tomcat-jdbc:9.0.16",
     // datasource
     // datasource
+    "p6spy"                      to "p6spy:p6spy:3.8.1",
     "hikaricp"                   to "com.zaxxer:HikariCP:3.3.0",
     "hikaricp"                   to "com.zaxxer:HikariCP:3.3.0",
     "druid"                      to "com.alibaba:druid:1.1.13",
     "druid"                      to "com.alibaba:druid:1.1.13",
     "commons-dbcp2"              to "org.apache.commons:commons-dbcp2:2.5.0",
     "commons-dbcp2"              to "org.apache.commons:commons-dbcp2:2.5.0",

+ 4 - 12
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisConfiguration.java

@@ -16,7 +16,6 @@
 package com.baomidou.mybatisplus.core;
 package com.baomidou.mybatisplus.core;
 
 
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import org.apache.ibatis.binding.MapperRegistry;
 import org.apache.ibatis.binding.MapperRegistry;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.Log;
@@ -83,19 +82,12 @@ public class MybatisConfiguration extends Configuration {
     @Override
     @Override
     public void addMappedStatement(MappedStatement ms) {
     public void addMappedStatement(MappedStatement ms) {
         logger.debug("addMappedStatement: " + ms.getId());
         logger.debug("addMappedStatement: " + ms.getId());
-        if (GlobalConfigUtils.isRefresh(ms.getConfiguration())) {
+        if (mappedStatements.containsKey(ms.getId())) {
             /*
             /*
-             * 支持是否自动刷新 XML 变更内容,开发环境使用【 注:生产环境勿用!】
+             * 说明已加载了xml中的节点; 忽略mapper中的SqlProvider数据
              */
              */
-            mappedStatements.remove(ms.getId());
-        } else {
-            if (mappedStatements.containsKey(ms.getId())) {
-                /*
-                 * 说明已加载了xml中的节点; 忽略mapper中的SqlProvider数据
-                 */
-                logger.error("mapper[" + ms.getId() + "] is ignored, because it exists, maybe from xml file");
-                return;
-            }
+            logger.error("mapper[" + ms.getId() + "] is ignored, because it exists, maybe from xml file");
+            return;
         }
         }
         super.addMappedStatement(ms);
         super.addMappedStatement(ms);
     }
     }

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

@@ -15,8 +15,6 @@
  */
  */
 package com.baomidou.mybatisplus.core.conditions.interfaces;
 package com.baomidou.mybatisplus.core.conditions.interfaces;
 
 
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collection;
@@ -74,29 +72,6 @@ public interface Func<Children, R> extends Serializable {
         return in(true, column, coll);
         return in(true, column, coll);
     }
     }
 
 
-    /**
-     * ignore
-     */
-    default Children inOrThrow(R column, Collection<?> value) {
-        return inOrThrow(true, column, value);
-    }
-
-    /**
-     * 字段 IN (value.get(0), value.get(1), ...)
-     * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
-     *
-     * <li> 如果集合为 empty 则直接抛出异常 </li>
-     *
-     * @param condition 执行条件
-     * @param column    字段
-     * @param coll      数据集合
-     * @return children
-     */
-    default Children inOrThrow(boolean condition, R column, Collection<?> coll) {
-        Assert.notEmpty(coll, "coll could not be empty!");
-        return in(condition, column, coll);
-    }
-
     /**
     /**
      * 字段 IN (value.get(0), value.get(1), ...)
      * 字段 IN (value.get(0), value.get(1), ...)
      * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
      * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
@@ -110,29 +85,6 @@ public interface Func<Children, R> extends Serializable {
      */
      */
     Children in(boolean condition, R column, Collection<?> coll);
     Children in(boolean condition, R column, Collection<?> coll);
 
 
-    /**
-     * ignore
-     */
-    default Children inOrThrow(R column, Object... values) {
-        return inOrThrow(true, column, values);
-    }
-
-    /**
-     * 字段 IN (value.get(0), value.get(1), ...)
-     * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
-     *
-     * <li> 如果数组为 empty 则直接抛出异常 </li>
-     *
-     * @param condition 执行条件
-     * @param column    字段
-     * @param values    数据数组
-     * @return children
-     */
-    default Children inOrThrow(boolean condition, R column, Object... values) {
-        Assert.notEmpty(values, "values could not be empty!");
-        return in(condition, column, Arrays.stream(values).collect(toList()));
-    }
-
     /**
     /**
      * ignore
      * ignore
      */
      */
@@ -163,29 +115,6 @@ public interface Func<Children, R> extends Serializable {
         return notIn(true, column, coll);
         return notIn(true, column, coll);
     }
     }
 
 
-    /**
-     * ignore
-     */
-    default Children notInOrThrow(R column, Collection<?> value) {
-        return notInOrThrow(true, column, value);
-    }
-
-    /**
-     * 字段 IN (value.get(0), value.get(1), ...)
-     * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
-     *
-     * <li> 如果集合为 empty 则直接抛出异常 </li>
-     *
-     * @param condition 执行条件
-     * @param column    字段
-     * @param coll      数据集合
-     * @return children
-     */
-    default Children notInOrThrow(boolean condition, R column, Collection<?> coll) {
-        Assert.notEmpty(coll, "coll could not be empty!");
-        return notIn(condition, column, coll);
-    }
-
     /**
     /**
      * 字段 NOT IN (value.get(0), value.get(1), ...)
      * 字段 NOT IN (value.get(0), value.get(1), ...)
      * <p>例: notIn("id", Arrays.asList(1, 2, 3, 4, 5))</p>
      * <p>例: notIn("id", Arrays.asList(1, 2, 3, 4, 5))</p>
@@ -204,29 +133,6 @@ public interface Func<Children, R> extends Serializable {
         return notIn(true, column, value);
         return notIn(true, column, value);
     }
     }
 
 
-    /**
-     * ignore
-     */
-    default Children notInOrThrow(R column, Object... values) {
-        return notInOrThrow(true, column, values);
-    }
-
-    /**
-     * 字段 IN (value.get(0), value.get(1), ...)
-     * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
-     *
-     * <li> 如果数组为 empty 则直接抛出异常 </li>
-     *
-     * @param condition 执行条件
-     * @param column    字段
-     * @param values    数据数组
-     * @return children
-     */
-    default Children notInOrThrow(boolean condition, R column, Object... values) {
-        Assert.notEmpty(values, "values could not be empty!");
-        return notIn(condition, column, Arrays.stream(values).collect(toList()));
-    }
-
     /**
     /**
      * 字段 NOT IN (v0, v1, ...)
      * 字段 NOT IN (v0, v1, ...)
      * <p>例: notIn("id", 1, 2, 3, 4, 5)</p>
      * <p>例: notIn("id", 1, 2, 3, 4, 5)</p>

+ 0 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java

@@ -48,12 +48,6 @@ public class GlobalConfig implements Serializable {
      * 是否开启 LOGO
      * 是否开启 LOGO
      */
      */
     private boolean banner = true;
     private boolean banner = true;
-    /**
-     * 是否刷新 mapper
-     * @deprecated since 2018-11-26
-     */
-    @Deprecated
-    private boolean refresh = false;
     /**
     /**
      * 缓存 Sql 解析初始化
      * 缓存 Sql 解析初始化
      */
      */

+ 29 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ClassUtils.java

@@ -32,6 +32,8 @@ import java.util.List;
  */
  */
 public final class ClassUtils {
 public final class ClassUtils {
 
 
+    private static final char PACKAGE_SEPARATOR = '.';
+
     /**
     /**
      * 代理 class 的名称
      * 代理 class 的名称
      */
      */
@@ -127,4 +129,31 @@ public final class ClassUtils {
         }
         }
     }
     }
 
 
+
+    /**
+     * Determine the name of the package of the given class,
+     * e.g. "java.lang" for the {@code java.lang.String} class.
+     *
+     * @param clazz the class
+     * @return the package name, or the empty String if the class
+     * is defined in the default package
+     */
+    public static String getPackageName(Class<?> clazz) {
+        Assert.notNull(clazz, "Class must not be null");
+        return getPackageName(clazz.getName());
+    }
+
+    /**
+     * Determine the name of the package of the given fully-qualified class name,
+     * e.g. "java.lang" for the {@code java.lang.String} class name.
+     *
+     * @param fqClassName the fully-qualified class name
+     * @return the package name, or the empty String if the class
+     * is defined in the default package
+     */
+    public static String getPackageName(String fqClassName) {
+        Assert.notNull(fqClassName, "Class name must not be null");
+        int lastDotIndex = fqClassName.lastIndexOf(PACKAGE_SEPARATOR);
+        return (lastDotIndex != -1 ? fqClassName.substring(0, lastDotIndex) : "");
+    }
 }
 }

+ 8 - 14
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/GlobalConfigUtils.java

@@ -16,15 +16,6 @@
  */
  */
 package com.baomidou.mybatisplus.core.toolkit;
 package com.baomidou.mybatisplus.core.toolkit;
 
 
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
-import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.session.SqlSessionFactory;
-
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
@@ -33,6 +24,14 @@ import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.SqlSessionFactory;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 /**
 /**
  * Mybatis全局缓存工具类
  * Mybatis全局缓存工具类
@@ -147,11 +146,6 @@ public class GlobalConfigUtils {
         return getGlobalConfig(configuration).getSuperMapperClass();
         return getGlobalConfig(configuration).getSuperMapperClass();
     }
     }
 
 
-    public static boolean isRefresh(Configuration configuration) {
-        return getGlobalConfig(configuration).isRefresh();
-    }
-
-
     public static Set<String> getMapperRegistryCache(Configuration configuration) {
     public static Set<String> getMapperRegistryCache(Configuration configuration) {
         return getGlobalConfig(configuration).getMapperRegistryCache();
         return getGlobalConfig(configuration).getMapperRegistryCache();
     }
     }

+ 1 - 0
mybatis-plus-extension/build.gradle.kts

@@ -12,6 +12,7 @@ dependencies {
     implementation("${lib["spring-context-support"]}")
     implementation("${lib["spring-context-support"]}")
     implementation("${lib["spring-jdbc"]}")
     implementation("${lib["spring-jdbc"]}")
     implementation("${lib["slf4j-api"]}")
     implementation("${lib["slf4j-api"]}")
+    implementation("${lib["p6spy"]}")
 
 
     testImplementation("${lib["spring-web"]}")
     testImplementation("${lib["spring-web"]}")
     testImplementation("${lib["javax.servlet-api"]}")
     testImplementation("${lib["javax.servlet-api"]}")

+ 23 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/p6spy/P6SpyLogger.java

@@ -0,0 +1,23 @@
+package com.baomidou.mybatisplus.extension.p6spy;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
+
+/**
+ * <p>
+ * P6spy SQL 打印策略
+ * </p>
+ *
+ * @author hubin
+ * @since 2019-02-20
+ */
+public class P6SpyLogger implements MessageFormattingStrategy {
+
+    @Override
+    public String formatMessage(int connectionId, String now, long elapsed, String category,
+                                String prepared, String sql, String url) {
+        return StringUtils.isNotEmpty(sql) ? new StringBuilder().append(" Consume Time:").append(elapsed).append(" ms ").append(now)
+            .append("\n Execute SQL:").append(sql.replaceAll("[\\s]+", " "))
+            .append("\n").toString() : null;
+    }
+}

+ 18 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/p6spy/StdoutLogger.java

@@ -0,0 +1,18 @@
+package com.baomidou.mybatisplus.extension.p6spy;
+
+/**
+ * <p>
+ * 输出 SQL 日志
+ * </p>
+ *
+ * @author hubin
+ * @since 2019-02-20
+ */
+public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger {
+
+    @Override
+    public void logText(String text) {
+        // 打印红色 SQL 日志
+        System.err.println(text);
+    }
+}

+ 5 - 13
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/spring/MybatisMapperRefresh.java

@@ -15,8 +15,6 @@
  */
  */
 package com.baomidou.mybatisplus.extension.spring;
 package com.baomidou.mybatisplus.extension.spring;
 
 
-import com.baomidou.mybatisplus.core.config.GlobalConfig;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.SystemClock;
 import com.baomidou.mybatisplus.core.toolkit.SystemClock;
 import org.apache.ibatis.binding.MapperRegistry;
 import org.apache.ibatis.binding.MapperRegistry;
@@ -41,7 +39,6 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
 import java.util.*;
 import java.util.*;
 
 
-
 /**
 /**
  * 切莫用于生产环境(后果自负)
  * 切莫用于生产环境(后果自负)
  * <p>Mybatis 映射文件热加载(发生变动后自动重新加载).</p>
  * <p>Mybatis 映射文件热加载(发生变动后自动重新加载).</p>
@@ -101,7 +98,6 @@ public class MybatisMapperRefresh implements Runnable {
 
 
     @Override
     @Override
     public void run() {
     public void run() {
-        final GlobalConfig globalConfig = GlobalConfigUtils.getGlobalConfig(configuration);
         /*
         /*
          * 启动 XML 热加载
          * 启动 XML 热加载
          */
          */
@@ -144,7 +140,6 @@ public class MybatisMapperRefresh implements Runnable {
                         for (String filePath : fileSet) {
                         for (String filePath : fileSet) {
                             File file = new File(filePath);
                             File file = new File(filePath);
                             if (file.isFile() && file.lastModified() > beforeTime) {
                             if (file.isFile() && file.lastModified() > beforeTime) {
-                                globalConfig.setRefresh(true);
                                 List<Resource> removeList = JAR_MAPPER.get(filePath);
                                 List<Resource> removeList = JAR_MAPPER.get(filePath);
                                 if (removeList != null && !removeList.isEmpty()) {
                                 if (removeList != null && !removeList.isEmpty()) {
                                     for (Resource resource : removeList) {
                                     for (Resource resource : removeList) {
@@ -155,10 +150,7 @@ public class MybatisMapperRefresh implements Runnable {
                                 }
                                 }
                             }
                             }
                         }
                         }
-                        if (globalConfig.isRefresh()) {
-                            beforeTime = SystemClock.now();
-                        }
-                        globalConfig.setRefresh(true);
+                        beforeTime = SystemClock.now();
                     } catch (Exception exception) {
                     } catch (Exception exception) {
                         exception.printStackTrace();
                         exception.printStackTrace();
                     }
                     }
@@ -214,7 +206,7 @@ public class MybatisMapperRefresh implements Runnable {
     /**
     /**
      * 清理parameterMap
      * 清理parameterMap
      *
      *
-     * @param list ignore
+     * @param list      ignore
      * @param namespace ignore
      * @param namespace ignore
      */
      */
     private void cleanParameterMap(List<XNode> list, String namespace) {
     private void cleanParameterMap(List<XNode> list, String namespace) {
@@ -227,7 +219,7 @@ public class MybatisMapperRefresh implements Runnable {
     /**
     /**
      * 清理resultMap
      * 清理resultMap
      *
      *
-     * @param list ignore
+     * @param list      ignore
      * @param namespace ignore
      * @param namespace ignore
      */
      */
     private void cleanResultMap(List<XNode> list, String namespace) {
     private void cleanResultMap(List<XNode> list, String namespace) {
@@ -259,7 +251,7 @@ public class MybatisMapperRefresh implements Runnable {
     /**
     /**
      * 清理selectKey
      * 清理selectKey
      *
      *
-     * @param list ignore
+     * @param list      ignore
      * @param namespace ignore
      * @param namespace ignore
      */
      */
     private void cleanKeyGenerators(List<XNode> list, String namespace) {
     private void cleanKeyGenerators(List<XNode> list, String namespace) {
@@ -273,7 +265,7 @@ public class MybatisMapperRefresh implements Runnable {
     /**
     /**
      * 清理sql节点缓存
      * 清理sql节点缓存
      *
      *
-     * @param list ignore
+     * @param list      ignore
      * @param namespace ignore
      * @param namespace ignore
      */
      */
     private void cleanSqlElement(List<XNode> list, String namespace) {
     private void cleanSqlElement(List<XNode> list, String namespace) {

+ 0 - 5
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/spring/MybatisSqlSessionFactoryBean.java

@@ -602,11 +602,6 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
         globalConfig.signGlobalConfig(sqlSessionFactory);
         globalConfig.signGlobalConfig(sqlSessionFactory);
 
 
         if (!isEmpty(this.mapperLocations)) {
         if (!isEmpty(this.mapperLocations)) {
-            if (GlobalConfigUtils.isRefresh(configuration)) {
-                // TODO 设置自动刷新配置 减少配置
-                new MybatisMapperRefresh(this.mapperLocations, sqlSessionFactory, 2,
-                    2, true);
-            }
             for (Resource mapperLocation : this.mapperLocations) {
             for (Resource mapperLocation : this.mapperLocations) {
                 if (mapperLocation == null) {
                 if (mapperLocation == null) {
                     continue;
                     continue;

+ 7 - 6
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/PackageHelper.java

@@ -15,7 +15,10 @@
  */
  */
 package com.baomidou.mybatisplus.extension.toolkit;
 package com.baomidou.mybatisplus.extension.toolkit;
 
 
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.core.io.support.ResourcePatternResolver;
 import org.springframework.core.io.support.ResourcePatternResolver;
@@ -24,9 +27,7 @@ import org.springframework.core.type.classreading.MetadataReader;
 import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.util.ClassUtils;
 import org.springframework.util.ClassUtils;
 
 
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 
 
 /**
 /**
  * 包扫描辅助类
  * 包扫描辅助类
@@ -62,12 +63,12 @@ public class PackageHelper {
                 for (Resource resource : resources) {
                 for (Resource resource : resources) {
                     if (resource.isReadable()) {
                     if (resource.isReadable()) {
                         metadataReader = metadataReaderFactory.getMetadataReader(resource);
                         metadataReader = metadataReaderFactory.getMetadataReader(resource);
-                        set.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
+                        set.add(ClassUtils.getPackageName(metadataReader.getClassMetadata().getClassName()));
                     }
                     }
                 }
                 }
             }
             }
             if (!set.isEmpty()) {
             if (!set.isEmpty()) {
-                return set.toArray(new String[] {});
+                return set.toArray(new String[]{});
             }
             }
             return new String[0];
             return new String[0];
         } catch (Exception e) {
         } catch (Exception e) {

+ 7 - 1
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/AutoGenerator.java

@@ -145,10 +145,16 @@ public class AutoGenerator {
                 // 乐观锁注解
                 // 乐观锁注解
                 tableInfo.setImportPackages(Version.class.getCanonicalName());
                 tableInfo.setImportPackages(Version.class.getCanonicalName());
             }
             }
+            boolean importSerializable = true;
             if (StringUtils.isNotEmpty(config.getSuperEntityClass())) {
             if (StringUtils.isNotEmpty(config.getSuperEntityClass())) {
                 // 父实体
                 // 父实体
                 tableInfo.setImportPackages(config.getSuperEntityClass());
                 tableInfo.setImportPackages(config.getSuperEntityClass());
-            } else {
+                importSerializable = false;
+            }
+            if (config.getGlobalConfig().isActiveRecord()) {
+                importSerializable = true;
+            }
+            if (importSerializable) {
                 tableInfo.setImportPackages(Serializable.class.getCanonicalName());
                 tableInfo.setImportPackages(Serializable.class.getCanonicalName());
             }
             }
             // Boolean类型is前缀处理
             // Boolean类型is前缀处理