Browse Source

Merge remote-tracking branch 'origin/3.0' into 3.0

hubin 6 years ago
parent
commit
c8872ab767

+ 6 - 88
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -15,7 +15,6 @@
  */
  */
 package com.baomidou.mybatisplus.core.injector;
 package com.baomidou.mybatisplus.core.injector;
 
 
-import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
@@ -38,7 +37,6 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 import java.lang.reflect.WildcardType;
 import java.util.List;
 import java.util.List;
-import java.util.stream.Collectors;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -182,26 +180,7 @@ public abstract class AbstractMethod {
 
 
     /**
     /**
      * <p>
      * <p>
-     * 获取需要转义的SQL字段
-     * </p>
-     *
-     * @param dbType   数据库类型
-     * @param val      值
-     * @param isColumn val 是否是数据库字段
-     */
-    protected String sqlWordConvert(DbType dbType, String val, boolean isColumn) {
-        if (dbType == DbType.POSTGRE_SQL) {
-            if (isColumn && val.toLowerCase().equals(val)) {
-                return val;
-            }
-            return String.format("\"%s\"", val);
-        }
-        return val;
-    }
-
-    /**
-     * <p>
-     * 拼接字符串
+     * 拼接字符串 todo 看以后不需要就删了
      * </p>
      * </p>
      */
      */
     protected String joinStr(String... strings) {
     protected String joinStr(String... strings) {
@@ -219,7 +198,6 @@ public abstract class AbstractMethod {
      */
      */
     protected String sqlSelectColumns(TableInfo table, boolean entityWrapper) {
     protected String sqlSelectColumns(TableInfo table, boolean entityWrapper) {
         StringBuilder columns = new StringBuilder();
         StringBuilder columns = new StringBuilder();
-        DbType dbType = table.getDbType();
         if (null != table.getResultMap()) {
         if (null != table.getResultMap()) {
             /*
             /*
              * 存在 resultMap 映射返回
              * 存在 resultMap 映射返回
@@ -238,36 +216,7 @@ public abstract class AbstractMethod {
             if (entityWrapper) {
             if (entityWrapper) {
                 columns.append("<choose><when test=\"ew != null and ew.sqlSelect != null\">${ew.sqlSelect}</when><otherwise>");
                 columns.append("<choose><when test=\"ew != null and ew.sqlSelect != null\">${ew.sqlSelect}</when><otherwise>");
             }
             }
-            List<TableFieldInfo> fieldList = table.getFieldList();
-            int size = 0;
-            if (null != fieldList) {
-                size = fieldList.size();
-            }
-
-            // 主键处理
-            if (StringUtils.isNotEmpty(table.getKeyProperty())) {
-                if (table.isKeyRelated()) {
-                    columns.append(sqlWordConvert(dbType, table.getKeyColumn(), true))
-                        .append(" AS ").append(sqlWordConvert(dbType, table.getKeyProperty(), false));
-                } else {
-                    columns.append(sqlWordConvert(dbType, table.getKeyColumn(), true));
-                }
-                if (size >= 1) {
-                    // 判断其余字段是否存在
-                    columns.append(StringPool.COMMA);
-                }
-            }
-
-            if (size >= 1) {
-                // 字段处理
-                columns.append(fieldList.stream().filter(TableFieldInfo::isSelect).map(i -> {
-                    String v = sqlWordConvert(dbType, i.getColumn(), true);
-                    if (i.isRelated()) {
-                        v += (" AS " + sqlWordConvert(dbType, i.getProperty(), false));
-                    }
-                    return v;
-                }).collect(Collectors.joining(StringPool.COMMA)));
-            }
+            columns.append(table.getAllSqlSelect());
             if (entityWrapper) {
             if (entityWrapper) {
                 columns.append("</otherwise></choose>");
                 columns.append("</otherwise></choose>");
             }
             }
@@ -281,45 +230,14 @@ public abstract class AbstractMethod {
 
 
     /**
     /**
      * <p>
      * <p>
-     * SQL 设置selectObj sqlselect
+     * SQL 设置selectObj sql select
      * </p>
      * </p>
      *
      *
-     * @param table 是否为包装类型查询
-     * @return
+     * @param table 表信息
      */
      */
     protected String sqlSelectObjsColumns(TableInfo table) {
     protected String sqlSelectObjsColumns(TableInfo table) {
-        StringBuilder columns = new StringBuilder();
-        DbType dbType = table.getDbType();
-        /*
-         * 普通查询
-         */
-        columns.append("<choose><when test=\"ew != null and ew.sqlSelect != null\">${ew.sqlSelect}</when><otherwise>");
-        // 主键处理
-        if (StringUtils.isNotEmpty(table.getKeyProperty())) {
-            if (table.isKeyRelated()) {
-                columns.append(sqlWordConvert(dbType, table.getKeyColumn(), true))
-                    .append(" AS ").append(sqlWordConvert(dbType, table.getKeyProperty(), false));
-            } else {
-                columns.append(sqlWordConvert(dbType, table.getKeyColumn(), true));
-            }
-        } else {
-            // 表字段处理
-            List<TableFieldInfo> fieldList = table.getFieldList();
-            if (CollectionUtils.isNotEmpty(fieldList)) {
-                TableFieldInfo fieldInfo = fieldList.get(0);
-                // 匹配转换内容
-                String wordConvert = sqlWordConvert(dbType, fieldInfo.getProperty(), false);
-                if (fieldInfo.getColumn().equals(wordConvert)) {
-                    columns.append(wordConvert);
-                } else {
-                    // 字段属性不一致
-                    columns.append(sqlWordConvert(dbType, fieldInfo.getColumn(), true))
-                        .append(" AS ").append(wordConvert);
-                }
-            }
-        }
-        columns.append("</otherwise></choose>");
-        return columns.toString();
+        return "<choose><when test=\"ew != null and ew.sqlSelect != null\">${ew.sqlSelect}</when><otherwise>" +
+            table.getAllSqlSelect() + "</otherwise></choose>";
     }
     }
 
 
     /**
     /**

+ 42 - 17
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -15,20 +15,19 @@
  */
  */
 package com.baomidou.mybatisplus.core.metadata;
 package com.baomidou.mybatisplus.core.metadata;
 
 
-import java.lang.reflect.Field;
-
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.SqlCondition;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
-
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+import lombok.AccessLevel;
 import lombok.Data;
 import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
 
 
+import java.lang.reflect.Field;
+
 /**
 /**
  * <p>
  * <p>
  * 数据库表字段反射信息
  * 数据库表字段反射信息
@@ -95,10 +94,16 @@ public class TableFieldInfo {
      * 标记该字段属于哪个类
      * 标记该字段属于哪个类
      */
      */
     private Class<?> clazz;
     private Class<?> clazz;
+    /**
+     * 缓存 sql select
+     */
+    @Setter(AccessLevel.NONE)
+    @Getter(AccessLevel.NONE)
+    private String sqlSelect;
 
 
     /**
     /**
      * <p>
      * <p>
-     * 存在 TableField 注解构造函数
+     * 存在 TableField 注解时, 使用的构造函数
      * </p>
      * </p>
      */
      */
     public TableFieldInfo(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo, Field field,
     public TableFieldInfo(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo, Field field,
@@ -140,6 +145,11 @@ public class TableFieldInfo {
         this.select = tableField.select();
         this.select = tableField.select();
     }
     }
 
 
+    /**
+     * <p>
+     * 不存在 TableField 注解时, 使用的构造函数
+     * </p>
+     */
     public TableFieldInfo(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo, Field field) {
     public TableFieldInfo(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo, Field field) {
         this.property = field.getName();
         this.property = field.getName();
         this.el = field.getName();
         this.el = field.getName();
@@ -204,19 +214,34 @@ public class TableFieldInfo {
         return StringUtils.isNotEmpty(logicDeleteValue);
         return StringUtils.isNotEmpty(logicDeleteValue);
     }
     }
 
 
-    public void setCondition(String condition) {
-        this.condition = condition;
-    }
-
+    /**
+     * 全局配置开启字段 LIKE 并且为字符串类型字段
+     * 注入 LIKE 查询!!!
+     */
     public void setCondition(GlobalConfig.DbConfig dbConfig) {
     public void setCondition(GlobalConfig.DbConfig dbConfig) {
-        /**
-         * 全局配置开启字段 LIKE 并且为字符串类型字段
-         * 注入 LIKE 查询!!!
-         */
         if (null == this.condition || SqlCondition.EQUAL.equals(this.condition)) {
         if (null == this.condition || SqlCondition.EQUAL.equals(this.condition)) {
             if (dbConfig.isColumnLike() && StringUtils.isCharSequence(this.propertyType)) {
             if (dbConfig.isColumnLike() && StringUtils.isCharSequence(this.propertyType)) {
                 this.condition = dbConfig.getDbType().getLike();
                 this.condition = dbConfig.getDbType().getLike();
             }
             }
         }
         }
     }
     }
+
+    /**
+     * 获取 select sql 片段
+     *
+     * @param dbType 数据库类型
+     * @return sql 片段
+     */
+    public String getSqlSelect(DbType dbType) {
+        if (sqlSelect != null) {
+            return sqlSelect;
+        }
+        if (related) {
+            sqlSelect = SqlUtils.sqlWordConvert(dbType, getColumn(), true) + " AS " +
+                SqlUtils.sqlWordConvert(dbType, getProperty(), false);
+        } else {
+            sqlSelect = SqlUtils.sqlWordConvert(dbType, getColumn(), true);
+        }
+        return sqlSelect;
+    }
 }
 }

+ 61 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -20,14 +20,19 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+import lombok.AccessLevel;
 import lombok.Data;
 import lombok.Data;
+import lombok.Setter;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
 import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.Configuration;
 
 
 import java.util.List;
 import java.util.List;
 
 
+import static java.util.stream.Collectors.joining;
+
 /**
 /**
  * <p>
  * <p>
  * 数据库表反射信息
  * 数据库表反射信息
@@ -76,6 +81,7 @@ public class TableInfo {
     /**
     /**
      * 表字段信息列表
      * 表字段信息列表
      */
      */
+    @Setter(AccessLevel.NONE)
     private List<TableFieldInfo> fieldList;
     private List<TableFieldInfo> fieldList;
     /**
     /**
      * 命名空间
      * 命名空间
@@ -93,6 +99,16 @@ public class TableInfo {
      * 标记该字段属于哪个类
      * 标记该字段属于哪个类
      */
      */
     private Class<?> clazz;
     private Class<?> clazz;
+    /**
+     * 缓存包含主键及字段的 sql select
+     */
+    @Setter(AccessLevel.NONE)
+    private String allSqlSelect;
+    /**
+     * 缓存主键字段的 sql select
+     */
+    @Setter(AccessLevel.NONE)
+    private String sqlSelect;
 
 
     /**
     /**
      * <p>
      * <p>
@@ -121,10 +137,6 @@ public class TableInfo {
         }
         }
     }
     }
 
 
-    public void setFieldList(List<TableFieldInfo> fieldList) {
-        throw ExceptionUtils.mpe("you can't use this method to set fieldList !");
-    }
-
     public void setConfigMark(Configuration configuration) {
     public void setConfigMark(Configuration configuration) {
         Assert.notNull(configuration, "Error: You need Initialize MybatisConfiguration !");
         Assert.notNull(configuration, "Error: You need Initialize MybatisConfiguration !");
         this.configMark = configuration.toString();
         this.configMark = configuration.toString();
@@ -133,4 +145,48 @@ public class TableInfo {
     public boolean isLogicDelete() {
     public boolean isLogicDelete() {
         return logicDelete;
         return logicDelete;
     }
     }
+
+    /**
+     * 获取主键的 select sql 片段
+     *
+     * @return sql 片段
+     */
+    public String getSqlSelect() {
+        if (sqlSelect != null) {
+            return sqlSelect;
+        }
+        if (StringUtils.isNotEmpty(keyProperty)) {
+            if (keyRelated) {
+                sqlSelect = SqlUtils.sqlWordConvert(dbType, keyColumn, true) + " AS " +
+                    SqlUtils.sqlWordConvert(dbType, keyProperty, false);
+            } else {
+                sqlSelect = SqlUtils.sqlWordConvert(dbType, keyColumn, true);
+            }
+        } else {
+            sqlSelect = StringPool.EMPTY;
+        }
+        return sqlSelect;
+    }
+
+    /**
+     * 获取包含主键及字段的 select sql 片段
+     *
+     * @return sql 片段
+     */
+    public String getAllSqlSelect() {
+        if (allSqlSelect != null) {
+            return allSqlSelect;
+        }
+        String sqlSelect = getSqlSelect();
+        String fieldsSqlSelect = fieldList.stream().filter(TableFieldInfo::isSelect)
+            .map(i -> i.getSqlSelect(dbType)).collect(joining(StringPool.COMMA));
+        if (StringUtils.isNotEmpty(sqlSelect) && StringUtils.isNotEmpty(fieldsSqlSelect)) {
+            allSqlSelect = sqlSelect + StringPool.COMMA + fieldsSqlSelect;
+        } else if (StringUtils.isNotEmpty(fieldsSqlSelect)) {
+            allSqlSelect = fieldsSqlSelect;
+        } else {
+            allSqlSelect = sqlSelect;
+        }
+        return allSqlSelect;
+    }
 }
 }

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

@@ -16,16 +16,16 @@
  */
  */
 package com.baomidou.mybatisplus.core.toolkit;
 package com.baomidou.mybatisplus.core.toolkit;
 
 
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.toolkit.support.Property;
+import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
+
 import java.lang.ref.WeakReference;
 import java.lang.ref.WeakReference;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 
 
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.support.Property;
-import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
-
 /**
 /**
  * <p>
  * <p>
  * Lambda 工具类
  * Lambda 工具类
@@ -78,14 +78,11 @@ public final class LambdaUtils {
      *
      *
      * @param className 类名
      * @param className 类名
      * @param property  属性
      * @param property  属性
-     * @param column    字段
+     * @param sqlSelect 字段搜索
      */
      */
-    private static void saveCache(String className, String property, String column) {
-        Map<String, String> cacheMap = LAMBDA_CACHE.get(className);
-        if (cacheMap == null) {
-            cacheMap = new HashMap<>();
-        }
-        cacheMap.put(property, column);
+    private static void saveCache(String className, String property, String sqlSelect) {
+        Map<String, String> cacheMap = LAMBDA_CACHE.getOrDefault(className, new HashMap<>());
+        cacheMap.put(property, sqlSelect);
         LAMBDA_CACHE.put(className, cacheMap);
         LAMBDA_CACHE.put(className, cacheMap);
     }
     }
 
 
@@ -95,21 +92,21 @@ public final class LambdaUtils {
      * </p>
      * </p>
      *
      *
      * @param tableInfo 表信息
      * @param tableInfo 表信息
-     * @return
+     * @return 缓存 map
      */
      */
     private static Map<String, String> createLambdaMap(TableInfo tableInfo, Class clazz) {
     private static Map<String, String> createLambdaMap(TableInfo tableInfo, Class clazz) {
-        Map<String, String> map = new HashMap<>(16);
+        Map<String, String> map = new HashMap<>();
         if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
         if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
             if (tableInfo.getClazz() != clazz) {
             if (tableInfo.getClazz() != clazz) {
                 saveCache(tableInfo.getClazz().getName(), tableInfo.getKeyProperty(), tableInfo.getKeyColumn());
                 saveCache(tableInfo.getClazz().getName(), tableInfo.getKeyProperty(), tableInfo.getKeyColumn());
             }
             }
-            map.put(tableInfo.getKeyProperty(), tableInfo.getKeyColumn());
+            map.put(tableInfo.getKeyProperty(), tableInfo.getSqlSelect());
         }
         }
         tableInfo.getFieldList().forEach(i -> {
         tableInfo.getFieldList().forEach(i -> {
             if (i.getClazz() != clazz) {
             if (i.getClazz() != clazz) {
-                saveCache(i.getClazz().getName(), i.getProperty(), i.getColumn());
+                saveCache(i.getClazz().getName(), i.getProperty(), i.getSqlSelect(tableInfo.getDbType()));
             }
             }
-            map.put(i.getProperty(), i.getColumn());
+            map.put(i.getProperty(), i.getSqlSelect(tableInfo.getDbType()));
         });
         });
         return map;
         return map;
     }
     }
@@ -120,7 +117,7 @@ public final class LambdaUtils {
      * </p>
      * </p>
      *
      *
      * @param entityClassName 实体类名
      * @param entityClassName 实体类名
-     * @return
+     * @return 缓存 map
      */
      */
     public static Map<String, String> getColumnMap(String entityClassName) {
     public static Map<String, String> getColumnMap(String entityClassName) {
         return LAMBDA_CACHE.get(entityClassName);
         return LAMBDA_CACHE.get(entityClassName);

+ 28 - 20
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/StringUtils.java

@@ -42,16 +42,18 @@ public class StringUtils {
      * 字符串 is
      * 字符串 is
      */
      */
     public static final String IS = "is";
     public static final String IS = "is";
-
     /**
     /**
      * 下划线字符
      * 下划线字符
      */
      */
     public static final char UNDERLINE = '_';
     public static final char UNDERLINE = '_';
-
     /**
     /**
      * 占位符
      * 占位符
      */
      */
     public static final String PLACE_HOLDER = "{%s}";
     public static final String PLACE_HOLDER = "{%s}";
+    /**
+     * 验证字符串是否是数据库字段
+     */
+    private static final Pattern P_IS_CLOMUN = Pattern.compile("^\\w\\S*[\\w\\d]*$");
 
 
     private StringUtils() {
     private StringUtils() {
         // to do nothing
         // to do nothing
@@ -110,6 +112,18 @@ public class StringUtils {
         return !isEmpty(cs);
         return !isEmpty(cs);
     }
     }
 
 
+    /**
+     * <p>
+     * 判断字符串是否符合数据库字段的命名
+     * </p>
+     *
+     * @param str 字符串
+     * @return 判断结果
+     */
+    public static boolean isColumnName(String str) {
+        return P_IS_CLOMUN.matcher(str).matches();
+    }
+
     /**
     /**
      * <p>
      * <p>
      * 字符串驼峰转下划线格式
      * 字符串驼峰转下划线格式
@@ -144,9 +158,9 @@ public class StringUtils {
      */
      */
     public static String resolveFieldName(String getMethodName) {
     public static String resolveFieldName(String getMethodName) {
         if (getMethodName.startsWith("get")) {
         if (getMethodName.startsWith("get")) {
-            getMethodName = getMethodName.substring(3, getMethodName.length());
-        } else if (getMethodName.startsWith("is")) {
-            getMethodName = getMethodName.substring(2, getMethodName.length());
+            getMethodName = getMethodName.substring(3);
+        } else if (getMethodName.startsWith(IS)) {
+            getMethodName = getMethodName.substring(2);
         }
         }
         // 小写第一个字母
         // 小写第一个字母
         return StringUtils.firstToLowerCase(getMethodName);
         return StringUtils.firstToLowerCase(getMethodName);
@@ -192,10 +206,7 @@ public class StringUtils {
         if (isEmpty(param)) {
         if (isEmpty(param)) {
             return EMPTY;
             return EMPTY;
         }
         }
-        StringBuilder sb = new StringBuilder(param.length());
-        sb.append(param.substring(0, 1).toLowerCase());
-        sb.append(param.substring(1));
-        return sb.toString();
+        return param.substring(0, 1).toLowerCase() + param.substring(1);
     }
     }
 
 
     /**
     /**
@@ -307,7 +318,8 @@ public class StringUtils {
      * @return 单引号包含的原字符串的集合形式
      * @return 单引号包含的原字符串的集合形式
      */
      */
     public static String quotaMarkList(Collection<?> coll) {
     public static String quotaMarkList(Collection<?> coll) {
-        return coll.stream().map(StringUtils::quotaMark).collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
+        return coll.stream().map(StringUtils::quotaMark)
+            .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
     }
     }
 
 
     /**
     /**
@@ -334,11 +346,7 @@ public class StringUtils {
             return str;
             return str;
         }
         }
 
 
-        StringBuilder sb = new StringBuilder(strLen);
-        sb.append(concatStr);
-        sb.append(Character.toTitleCase(firstChar));
-        sb.append(str.substring(1));
-        return sb.toString();
+        return concatStr + Character.toTitleCase(firstChar) + str.substring(1);
     }
     }
 
 
     /**
     /**
@@ -647,11 +655,11 @@ public class StringUtils {
      * 是否为CharSequence类型
      * 是否为CharSequence类型
      * </p>
      * </p>
      *
      *
-     * @param cls
-     * @return
+     * @param clazz class
+     * @return true 为是 CharSequence 类型
      */
      */
-    public static Boolean isCharSequence(Class<?> cls) {
-        return cls != null && CharSequence.class.isAssignableFrom(cls);
+    public static boolean isCharSequence(Class<?> clazz) {
+        return clazz != null && CharSequence.class.isAssignableFrom(clazz);
     }
     }
 
 
     /**
     /**
@@ -700,7 +708,7 @@ public class StringUtils {
      * @param propertyCls
      * @param propertyCls
      * @return
      * @return
      */
      */
-    public static Boolean isBoolean(Class<?> propertyCls) {
+    public static boolean isBoolean(Class<?> propertyCls) {
         return propertyCls != null && (boolean.class.isAssignableFrom(propertyCls) || Boolean.class.isAssignableFrom(propertyCls));
         return propertyCls != null && (boolean.class.isAssignableFrom(propertyCls) || Boolean.class.isAssignableFrom(propertyCls));
     }
     }
 
 

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

@@ -38,7 +38,6 @@ import org.apache.ibatis.session.SqlSessionFactory;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.regex.Pattern;
 
 
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toList;
 
 
@@ -61,10 +60,6 @@ public class TableInfoHelper {
      * 默认表主键
      * 默认表主键
      */
      */
     private static final String DEFAULT_ID_NAME = "id";
     private static final String DEFAULT_ID_NAME = "id";
-    /**
-     * 验证字符串是否是数据库字段
-     */
-    private static final Pattern P = Pattern.compile("^\\w\\S*[\\w\\d]*$");
 
 
     /**
     /**
      * <p>
      * <p>
@@ -428,7 +423,7 @@ public class TableInfoHelper {
      * @return related
      * @return related
      */
      */
     public static boolean checkRelated(boolean underCamel, String property, String column) {
     public static boolean checkRelated(boolean underCamel, String property, String column) {
-        if (!P.matcher(column).matches()) {
+        if (!StringUtils.isColumnName(column)) {
             //首尾有转义符
             //首尾有转义符
             column = column.substring(1, column.length() - 1);
             column = column.substring(1, column.length() - 1);
         }
         }

+ 19 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlUtils.java

@@ -15,6 +15,7 @@
  */
  */
 package com.baomidou.mybatisplus.core.toolkit.sql;
 package com.baomidou.mybatisplus.core.toolkit.sql;
 
 
+import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -75,6 +76,24 @@ public class SqlUtils {
         return builder.toString();
         return builder.toString();
     }
     }
 
 
+    /**
+     * <p>
+     * 获取需要转义的SQL字段
+     * </p>
+     *
+     * @param dbType   数据库类型
+     * @param val      值
+     * @param isColumn val 是否是数据库字段
+     */
+    public static String sqlWordConvert(DbType dbType, String val, boolean isColumn) {
+        if (dbType == DbType.POSTGRE_SQL) {
+            if (isColumn && val.toLowerCase().equals(val)) {
+                return val;
+            }
+            return String.format("\"%s\"", val);
+        }
+        return val;
+    }
 
 
     /**
     /**
      * <p>
      * <p>

+ 38 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/TestXmlConfig.java

@@ -0,0 +1,38 @@
+package com.baomidou.mybatisplus.test.h2;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import com.baomidou.mybatisplus.test.h2.config.H2Db;
+import com.baomidou.mybatisplus.test.h2.entity.persistent.H2User;
+import com.baomidou.mybatisplus.test.h2.service.IH2UserService;
+
+/**
+ * 测试XML配置
+ * @author nieqiurong 2018/8/14 13:30.
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {"classpath:h2/spring-test-xml-h2.xml"})
+public class TestXmlConfig {
+
+    @Autowired
+    protected IH2UserService userService;
+
+    @BeforeClass
+    public static void initDB() throws SQLException, IOException {
+        H2Db.initH2User();
+    }
+
+    @Test
+    public void test() {
+        H2User user = userService.getById(101L);
+        Assert.assertNotNull(user);
+    }
+
+}

+ 29 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/config/MybatisXmlConfig.java

@@ -0,0 +1,29 @@
+package com.baomidou.mybatisplus.test.h2.config;
+
+import javax.sql.DataSource;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+
+/**
+ * @author nieqiurong 2018/8/14 13:18.
+ */
+@Configuration
+@MapperScan("com.baomidou.mybatisplus.test.h2.entity.mapper")
+public class MybatisXmlConfig {
+
+
+    @Bean("mybatisSqlSession")
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
+        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
+        sqlSessionFactory.setDataSource(dataSource);
+        sqlSessionFactory.setTypeAliasesPackage("com.baomidou.mybatisplus.test.h2.entity.persistent");
+        sqlSessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
+        return sqlSessionFactory.getObject();
+    }
+
+}

+ 38 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/reflection/ExampleObjectFactory.java

@@ -0,0 +1,38 @@
+package com.baomidou.mybatisplus.test.reflection;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 对象工厂
+ * @author nieqiurong 2018/8/14 13:12.
+ */
+public class ExampleObjectFactory extends DefaultObjectFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExampleObjectFactory.class);
+
+    public Object create(Class type) {
+        LOGGER.debug("生成一个对象 type = [" + type + "]");
+        return super.create(type);
+    }
+
+    @Override
+    public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
+        LOGGER.info("生成一个对象 type = [" + type + "], constructorArgTypes = [" + constructorArgTypes + "], constructorArgs = [" + constructorArgs + "]");
+        return super.create(type, constructorArgTypes, constructorArgs);
+    }
+
+    public void setProperties(Properties properties) {
+        LOGGER.debug("设置属性 properties = [" + properties + "]");
+        super.setProperties(properties);
+    }
+    public <T> boolean isCollection(Class<T> type) {
+        return Collection.class.isAssignableFrom(type);
+    }
+
+}

+ 12 - 0
mybatis-plus/src/test/resources/h2/spring-test-xml-h2.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+    <context:component-scan base-package="com.baomidou.mybatisplus.test.h2.service"/>
+
+    <bean class="com.baomidou.mybatisplus.test.h2.config.DBConfig"/>
+    <bean class="com.baomidou.mybatisplus.test.h2.config.MybatisXmlConfig"/>
+</beans>

+ 14 - 0
mybatis-plus/src/test/resources/mybatis-config.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration
+        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+
+    <settings>
+        <setting name="mapUnderscoreToCamelCase" value="true"/>
+    </settings>
+
+    <objectFactory type="com.baomidou.mybatisplus.test.reflection.ExampleObjectFactory">
+        <property name="someProperty" value="100"/>
+    </objectFactory>
+</configuration>