Quellcode durchsuchen

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

# Conflicts:
#	mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilder.java
#	mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableField.java
#	mybatis-plus/src/main/resources/template/entity.java.vm
nieqiurong vor 8 Jahren
Ursprung
Commit
ec5304728a
76 geänderte Dateien mit 1588 neuen und 623 gelöschten Zeilen
  1. 0 0
      CHANGELOG.md
  2. 36 2
      mybatis-plus/pom.xml
  3. 10 10
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/MybatisAbstractSQL.java
  4. 1 1
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/MybatisConfiguration.java
  5. 1 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/MybatisDefaultParameterHandler.java
  6. 23 12
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/activerecord/Model.java
  7. 9 5
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/annotations/TableField.java
  8. 42 17
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/entity/GlobalConfiguration.java
  9. 6 4
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/entity/TableFieldInfo.java
  10. 4 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/enums/SqlLike.java
  11. 2 2
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/enums/SqlMethod.java
  12. 6 6
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/AbstractGenerator.java
  13. 20 7
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/AutoGenerator.java
  14. 15 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/InjectionConfig.java
  15. 0 5
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/ConstVal.java
  16. 35 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/DataSourceConfig.java
  17. 55 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/FileOutConfig.java
  18. 41 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/ITypeConvert.java
  19. 53 3
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/StrategyConfig.java
  20. 20 181
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilder.java
  21. 59 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/MySqlTypeConvert.java
  22. 54 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/OracleTypeConvert.java
  23. 59 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/PostgreSqlTypeConvert.java
  24. 57 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvert.java
  25. 29 18
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableField.java
  26. 33 3
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableInfo.java
  27. 6 0
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/rules/DbColumnType.java
  28. 16 11
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/rules/NamingStrategy.java
  29. 71 46
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/AutoSqlInjector.java
  30. 46 11
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlHelper.java
  31. 1 7
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlPlus.java
  32. 7 5
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlRunner.java
  33. 4 39
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/PaginationInterceptor.java
  34. 1 3
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/PerformanceInterceptor.java
  35. 73 10
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/DialectFactory.java
  36. 1 1
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/service/IService.java
  37. 31 26
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/service/impl/ServiceImpl.java
  38. 20 14
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/spring/MybatisMapperRefresh.java
  39. 7 4
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/spring/MybatisSqlSessionFactoryBean.java
  40. 73 11
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/ReflectionKit.java
  41. 1 1
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/SqlFormatter.java
  42. 1 1
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/SqlUtils.java
  43. 69 3
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/StringUtils.java
  44. 14 31
      mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/TableInfoHelper.java
  45. 15 29
      mybatis-plus/src/main/resources/template/entity.java.vm
  46. 1 1
      mybatis-plus/src/main/resources/template/mapper.java.vm
  47. 5 2
      mybatis-plus/src/main/resources/template/mapper.xml.vm
  48. 1 1
      mybatis-plus/src/main/resources/template/service.java.vm
  49. 1 1
      mybatis-plus/src/main/resources/template/serviceImpl.java.vm
  50. 12 13
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/GlobalConfigurationTest.java
  51. 8 9
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/MybatisMapperRefreshTest.java
  52. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/activerecord/ActiveRecordTest.java
  53. 37 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/MyFieldTypeConvert.java
  54. 20 3
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/MysqlGenerator.java
  55. 30 16
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/PostgreSQLGenerator.java
  56. 30 14
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/SQLServerGenerator.java
  57. 11 8
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/CircularLabelsTest.java
  58. 2 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/NoXMLTest.java
  59. 53 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/ServiceImplTest.java
  60. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/SqlRunnerTest.java
  61. 1 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/TransactionalTest.java
  62. 2 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/URPTest.java
  63. 11 8
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/UserMapperTest.java
  64. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/NotPKMapper.java
  65. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/RoleMapper.java
  66. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/TestMapper.java
  67. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/UserMapper.java
  68. 31 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/service/IUserService.java
  69. 36 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/service/impl/UserServiceImpl.java
  70. 34 0
      mybatis-plus/src/test/resources/mybatis-config.xml
  71. 4 4
      mybatis-plus/src/test/resources/mysql-config.xml
  72. 5 5
      mybatis-plus/src/test/resources/mysql/RoleMapper.xml
  73. 2 2
      mybatis-plus/src/test/resources/mysql/UserMapper.xml
  74. 5 0
      mybatis-plus/src/test/resources/properties/jdbc.properties
  75. 98 0
      mybatis-plus/src/test/resources/spring/spring-jdbc.xml
  76. 15 0
      mybatis-plus/src/test/resources/spring/spring-servlet.xml

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
CHANGELOG.md


+ 36 - 2
mybatis-plus/pom.xml

@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>com.baomidou</groupId>
 	<artifactId>mybatis-plus</artifactId>
-	<version>2.0</version>
+	<version>2.0.2</version>
 	<packaging>jar</packaging>
 
 	<name>mybatis-plus</name>
@@ -47,6 +47,7 @@
 		<postgresql.version>9.4.1212</postgresql.version>
 		<servlet-api.version>2.5</servlet-api.version>
 		<spring.version>4.3.5.RELEASE</spring.version>
+		<aspectjweaver.version>1.8.9</aspectjweaver.version>
 		<mybatis-ehcache.version>1.1.0</mybatis-ehcache.version>
 		<junit.version>4.12</junit.version>
 		<velocity.version>1.7</velocity.version>
@@ -75,9 +76,10 @@
 			<version>${slf4j.version}</version>
 			<scope>provided</scope>
 		</dependency>
+		<!-- spring begin -->
 		<dependency>
 			<groupId>org.springframework</groupId>
-			<artifactId>spring-jdbc</artifactId>
+			<artifactId>spring-context</artifactId>
 			<version>${spring.version}</version>
 			<scope>provided</scope>
 		</dependency>
@@ -87,12 +89,44 @@
 			<version>${spring.version}</version>
 			<scope>provided</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-tx</artifactId>
+			<version>${spring.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+			<version>${spring.version}</version>
+			<scope>provided</scope>
+		</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
 			<artifactId>spring-context-support</artifactId>
 			<version>${spring.version}</version>
 			<scope>provided</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-test</artifactId>
+			<version>${spring.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>aspectjweaver</artifactId>
+			<version>${aspectjweaver.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<!-- spring end -->
+		<!--jsqlparser -->
+		<dependency>
+			<groupId>com.github.jsqlparser</groupId>
+			<artifactId>jsqlparser</artifactId>
+			<version>${jsqlparser.version}</version>
+			<scope>provided</scope>
+		</dependency>
 		<!--jsqlparser -->
 		<dependency>
 			<groupId>com.github.jsqlparser</groupId>

+ 10 - 10
mybatis-plus/src/main/java/com/baomidou/mybatisplus/MybatisAbstractSQL.java

@@ -15,13 +15,13 @@
  */
 package com.baomidou.mybatisplus;
 
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import com.baomidou.mybatisplus.toolkit.StringUtils;
-
 /**
  * <p>
  * 重定义 AbstractSQL ,实现标准TSQL的 查询条件自定义
@@ -107,20 +107,20 @@ public abstract class MybatisAbstractSQL<T> implements Serializable {
      * SQL连接器
      */
 	private static class SafeAppendable implements Serializable {
-        private final Appendable a;
+        private final Appendable appendable;
         private boolean empty = true;
 
-        public SafeAppendable(Appendable a) {
+        public SafeAppendable(Appendable appendable) {
             super();
-            this.a = a;
+            this.appendable = appendable;
         }
 
-        public SafeAppendable append(CharSequence s) {
+        public SafeAppendable append(CharSequence charSequence) {
             try {
-                if (empty && s.length() > 0) {
+                if (empty && charSequence.length() > 0) {
                     empty = false;
                 }
-                a.append(s);
+                appendable.append(charSequence);
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }
@@ -222,8 +222,8 @@ public abstract class MybatisAbstractSQL<T> implements Serializable {
             return builder.toString();
         }
 
-        public String sql(Appendable a) {
-            SafeAppendable builder = new SafeAppendable(a);
+        public String sql(Appendable appendable) {
+            SafeAppendable builder = new SafeAppendable(appendable);
             return buildSQL(builder);
         }
     }

+ 1 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/MybatisConfiguration.java

@@ -64,7 +64,7 @@ public class MybatisConfiguration extends Configuration {
 	@Override
 	public void addMappedStatement(MappedStatement ms) {
 		logger.debug(" addMappedStatement: " + ms.getId());
-		if (GlobalConfiguration.GlobalConfig(ms.getConfiguration()).isRefresh()) {
+		if (GlobalConfiguration.getGlobalConfig(ms.getConfiguration()).isRefresh()) {
 			/*
 			 * 支持是否自动刷新 XML 变更内容,开发环境使用【 注:生产环境勿用!】
 			 */

+ 1 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/MybatisDefaultParameterHandler.java

@@ -190,6 +190,7 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
 		return parameterObject;
 	}
 
+	@SuppressWarnings({ "rawtypes", "unchecked" })
 	@Override
 	public void setParameters(PreparedStatement ps) {
 		// 反射获取动态参数

+ 23 - 12
mybatis-plus/src/main/java/com/baomidou/mybatisplus/activerecord/Model.java

@@ -57,12 +57,18 @@ public abstract class Model<T extends Model> implements Serializable {
 	 * </p>
 	 */
 	public boolean insertOrUpdate() {
-		if (StringUtils.checkValNotNull(pkVal())) {
-			// update
-			return SqlHelper.retBool(sqlSession().update(sqlStatement(SqlMethod.UPDATE_BY_ID), this));
-		} else {
+		if (StringUtils.checkValNull(pkVal())) {
 			// insert
-			return SqlHelper.retBool(sqlSession().insert(sqlStatement(SqlMethod.INSERT_ONE), this));
+			return insert();
+		} else {
+			/*
+			 * 更新成功直接返回,失败执行插入逻辑
+			 */
+			boolean rlt = updateById();
+			if (!rlt) {
+				return insert();
+			}
+			return rlt;
 		}
 	}
 
@@ -271,11 +277,9 @@ public abstract class Model<T extends Model> implements Serializable {
 	 * @param wrapper
 	 * @return
 	 */
-	public Page<T> selectPage(Page<T> page, Wrapper wrapper) {
+	public Page<T> selectPage(Page<T> page, Wrapper<T> wrapper) {
 		Map<String, Object> map = new HashMap<String, Object>();
-		if (wrapper != null && StringUtils.isNotEmpty(page.getOrderByField())) {
-			wrapper.orderBy(page.getOrderByField());
-		}
+		SqlHelper.fillWrapper(page, wrapper);
 		map.put("ew", wrapper);
 		List<T> tl = sqlSession().selectList(sqlStatement(SqlMethod.SELECT_PAGE), map, page);
 		page.setRecords(tl);
@@ -292,6 +296,7 @@ public abstract class Model<T extends Model> implements Serializable {
 	 * @param args
 	 * @return
 	 */
+	@SuppressWarnings("unchecked")
 	public Page<T> selectPage(Page<T> page, String whereClause, Object... args) {
 		return selectPage(page, Condition.instance().where(whereClause, args));
 	}
@@ -339,7 +344,7 @@ public abstract class Model<T extends Model> implements Serializable {
 	 * 获取Session 默认自动提交
 	 * <p/>
 	 */
-	private SqlSession sqlSession() {
+	protected SqlSession sqlSession() {
 		return SqlHelper.sqlSession(getClass());
 	}
 
@@ -349,11 +354,17 @@ public abstract class Model<T extends Model> implements Serializable {
 	 * @param sqlMethod
 	 * @return
 	 */
-	private String sqlStatement(SqlMethod sqlMethod) {
+	protected String sqlStatement(SqlMethod sqlMethod) {
 		return sqlStatement(sqlMethod.getMethod());
 	}
 
-	private String sqlStatement(String sqlMethod) {
+	/**
+	 * 获取SqlStatement
+	 *
+	 * @param sqlMethod
+	 * @return
+	 */
+	protected String sqlStatement(String sqlMethod) {
 		return SqlHelper.table(getClass()).getSqlStatement(sqlMethod);
 	}
 

+ 9 - 5
mybatis-plus/src/main/java/com/baomidou/mybatisplus/annotations/TableField.java

@@ -34,21 +34,25 @@ import com.baomidou.mybatisplus.enums.FieldStrategy;
 @Target(ElementType.FIELD)
 public @interface TableField {
 
-	/*
+	/**
 	 * <p>
 	 * 字段值(驼峰命名方式,该值可无)
 	 * </p>
 	 */
 	String value() default "";
 
-	/*
+	/**
 	 * <p>
 	 * 当该Field为类对象时, 可使用#{对象.属性}来映射到数据表.
 	 * </p>
+	 * <p>
+	 * 支持:@TableField(el = "role, jdbcType=BIGINT)<br>
+	 * 支持:@TableField(el = "role, typeHandler=com.baomidou.xx.typehandler.PhoneTypeHandler")
+	 * </p>
 	 */
 	String el() default "";
 
-	/*
+	/**
 	 * <p>
 	 * 是否为数据库表字段
 	 * </p>
@@ -57,8 +61,8 @@ public @interface TableField {
 	 * </p>
 	 */
 	boolean exist() default true;
-	
-	/*
+
+	/**
 	 * <p>
 	 * 字段验证
 	 * </p>

+ 42 - 17
mybatis-plus/src/main/java/com/baomidou/mybatisplus/entity/GlobalConfiguration.java

@@ -30,7 +30,10 @@ import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionTemplate;
 
 import javax.sql.DataSource;
 import java.io.Serializable;
@@ -85,11 +88,15 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	private String identifierQuote;
 	// 缓存当前Configuration的SqlSessionFactory
 	private SqlSessionFactory sqlSessionFactory;
-
+	// 缓存已注入CRUD的Mapper信息
 	private Set<String> mapperRegistryCache = new ConcurrentSkipListSet<String>();
+	// 单例重用SqlSession
+	private SqlSession sqlSession;
+	// 批量SqlSession
+	private SqlSession sqlsessionBatch;
 
 	public GlobalConfiguration() {
-		// TODO
+		// 构造方法
 	}
 
 	public GlobalConfiguration(ISqlInjector sqlInjector) {
@@ -179,6 +186,8 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 
 	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
 		this.sqlSessionFactory = sqlSessionFactory;
+		this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
+		this.sqlsessionBatch = new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
 	}
 
 	public boolean isCapitalMode() {
@@ -203,6 +212,14 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 		}
 	}
 
+	public SqlSession getSqlSession() {
+		return sqlSession;
+	}
+
+	public SqlSession getSqlsessionBatch() {
+		return sqlsessionBatch;
+	}
+
 	@Override
 	protected GlobalConfiguration clone() throws CloneNotSupportedException {
 		return (GlobalConfiguration) super.clone();
@@ -216,7 +233,7 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	 */
 	public static SqlSessionFactory currentSessionFactory(Class<?> clazz) {
 		String configMark = TableInfoHelper.getTableInfo(clazz).getConfigMark();
-		GlobalConfiguration mybatisGlobalConfig = GlobalConfiguration.GlobalConfig(configMark);
+		GlobalConfiguration mybatisGlobalConfig = GlobalConfiguration.getGlobalConfig(configMark);
 		return mybatisGlobalConfig.getSqlSessionFactory();
 	}
 
@@ -257,7 +274,7 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	 * 标记全局设置 (统一所有入口)
 	 * </p>
 	 *
-	 * @param configuration
+	 * @param sqlSessionFactory
 	 * @return
 	 */
 	public SqlSessionFactory signGlobalConfig(SqlSessionFactory sqlSessionFactory) {
@@ -273,11 +290,11 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	 * @param configuration
 	 * @return
 	 */
-	public static GlobalConfiguration GlobalConfig(Configuration configuration) {
+	public static GlobalConfiguration getGlobalConfig(Configuration configuration) {
 		if (configuration == null) {
 			throw new MybatisPlusException("Error: You need Initialize MybatisConfiguration !");
 		}
-		return GlobalConfig(configuration.toString());
+		return getGlobalConfig(configuration.toString());
 	}
 
 	/**
@@ -286,7 +303,7 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	 * @param configMark
 	 * @return
 	 */
-	public static GlobalConfiguration GlobalConfig(String configMark) {
+	public static GlobalConfiguration getGlobalConfig(String configMark) {
 		GlobalConfiguration cache = GLOBAL_CONFIG.get(configMark);
 		if (cache == null) {
 			// 没有获取全局配置初始全局配置
@@ -298,20 +315,20 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	}
 
 	public static DBType getDbType(Configuration configuration) {
-		return GlobalConfig(configuration).getDbType();
+		return getGlobalConfig(configuration).getDbType();
 	}
 
 	public static IdType getIdType(Configuration configuration) {
-		return GlobalConfig(configuration).getIdType();
+		return getGlobalConfig(configuration).getIdType();
 	}
 
 	public static boolean isDbColumnUnderline(Configuration configuration) {
-		return GlobalConfig(configuration).isDbColumnUnderline();
+		return getGlobalConfig(configuration).isDbColumnUnderline();
 	}
 
 	public static ISqlInjector getSqlInjector(Configuration configuration) {
 		// fix #140
-		GlobalConfiguration globalConfiguration = GlobalConfig(configuration);
+		GlobalConfiguration globalConfiguration = getGlobalConfig(configuration);
 		ISqlInjector sqlInjector = globalConfiguration.getSqlInjector();
 		if (sqlInjector == null) {
 			sqlInjector = new AutoSqlInjector();
@@ -321,27 +338,35 @@ public class GlobalConfiguration implements Cloneable, Serializable {
 	}
 
 	public static IMetaObjectHandler getMetaObjectHandler(Configuration configuration) {
-		return GlobalConfig(configuration).getMetaObjectHandler();
+		return getGlobalConfig(configuration).getMetaObjectHandler();
 	}
 
 	public static FieldStrategy getFieldStrategy(Configuration configuration) {
-		return GlobalConfig(configuration).getFieldStrategy();
+		return getGlobalConfig(configuration).getFieldStrategy();
 	}
 
 	public static boolean isRefresh(Configuration configuration) {
-		return GlobalConfig(configuration).isRefresh();
+		return getGlobalConfig(configuration).isRefresh();
 	}
 
 	public static boolean isAutoSetDbType(Configuration configuration) {
-		return GlobalConfig(configuration).isAutoSetDbType();
+		return getGlobalConfig(configuration).isAutoSetDbType();
 	}
 
 	public static Set<String> getMapperRegistryCache(Configuration configuration) {
-		return GlobalConfig(configuration).getMapperRegistryCache();
+		return getGlobalConfig(configuration).getMapperRegistryCache();
 	}
 
 	public static String getIdentifierQuote(Configuration configuration) {
-		return GlobalConfig(configuration).getIdentifierQuote();
+		return getGlobalConfig(configuration).getIdentifierQuote();
+	}
+
+	public static SqlSession getSqlSession(Configuration configuration) {
+		return getGlobalConfig(configuration).getSqlSession();
+	}
+
+	public static SqlSession getSqlsessionBatch(Configuration configuration) {
+		return getGlobalConfig(configuration).getSqlsessionBatch();
 	}
 
 	/**

+ 6 - 4
mybatis-plus/src/main/java/com/baomidou/mybatisplus/entity/TableFieldInfo.java

@@ -61,19 +61,21 @@ public class TableFieldInfo {
 	 */
 	private FieldStrategy fieldStrategy = FieldStrategy.NOT_NULL;
 
+	/**
+	 * <p>
+	 * 存在 TableField 注解构造函数
+	 * </p>
+	 */
 	public TableFieldInfo(GlobalConfiguration globalConfig, String column, String property, String el,
 			FieldStrategy fieldStrategy, String propertyType) {
 		if (globalConfig.isDbColumnUnderline()) {
 			/* 开启字段下划线申明 */
 			this.related = true;
-			this.setColumn(globalConfig, StringUtils.camelToUnderline(column));
 		} else if (!column.equals(property)) {
 			/* 没有开启下划线申明 但是column与property不等的情况下设置related为true */
 			this.related = true;
-			this.setColumn(globalConfig, column);
-		} else {
-			this.setColumn(globalConfig, column);
 		}
+		this.setColumn(globalConfig, column);
 		this.property = property;
 		this.el = el;
 		/*

+ 4 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/enums/SqlLike.java

@@ -32,6 +32,10 @@ public enum SqlLike {
 	 * RIGHT
 	 */
 	RIGHT("right", "右边%"),
+	/**
+	 * CUSTOM
+	 */
+	CUSTOM("custom", "定制"),
 	/**
 	 * DEFAULT
 	 */

+ 2 - 2
mybatis-plus/src/main/java/com/baomidou/mybatisplus/enums/SqlMethod.java

@@ -33,7 +33,7 @@ public enum SqlMethod {
 	/**
 	 * 删除
 	 */
-	DELETE_BY_ID("deleteById", "根据ID 删除一条数据", "<script>DELETE FROM %s WHERE %s=#{%s}</script>"),
+	DELETE_BY_ID("deleteById", "根据ID 删除一条数据", "DELETE FROM %s WHERE %s=#{%s}"),
 	DELETE_BY_MAP("deleteByMap", "根据columnMap 条件删除记录", "<script>DELETE FROM %s %s</script>"),
 	DELETE("delete", "根据 entity 条件删除记录", "<script>DELETE FROM %s %s</script>"),
 	DELETE_BATCH_BY_IDS("deleteBatchIds", "根据ID集合,批量删除数据", "<script>DELETE FROM %s WHERE %s IN (%s)</script>"),
@@ -47,7 +47,7 @@ public enum SqlMethod {
 	/**
 	 * 查询
 	 */
-	SELECT_BY_ID("selectById", "根据ID 查询一条数据", "<script>SELECT %s FROM %s WHERE %s=#{%s}</script>"),
+	SELECT_BY_ID("selectById", "根据ID 查询一条数据", "SELECT %s FROM %s WHERE %s=#{%s}"),
 	SELECT_BY_MAP("selectByMap", "根据columnMap 查询一条数据", "<script>SELECT %s FROM %s %s</script>"),
 	SELECT_BATCH_BY_IDS("selectBatchIds", "根据ID集合,批量查询数据", "<script>SELECT %s FROM %s WHERE %s IN (%s)</script>"),
 	SELECT_ONE("selectOne", "查询满足条件一条数据", "<script>SELECT %s FROM %s %s</script>"),

+ 6 - 6
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/AbstractGenerator.java

@@ -59,7 +59,7 @@ public abstract class AbstractGenerator {
 
 	protected ConfigBuilder config;
 
-	protected InjectionConfig cfg;
+	protected InjectionConfig injectionConfig;
 
 	/**
 	 * 初始化配置
@@ -67,8 +67,8 @@ public abstract class AbstractGenerator {
 	protected void initConfig() {
 		if (null == config) {
 			config = new ConfigBuilder(packageInfo, dataSource, strategy, template, globalConfig);
-			if (null != cfg) {
-				cfg.setConfig(config);
+			if (null != injectionConfig) {
+				injectionConfig.setConfig(config);
 			}
 		}
 	}
@@ -122,11 +122,11 @@ public abstract class AbstractGenerator {
 	}
 
 	public InjectionConfig getCfg() {
-		return cfg;
+		return injectionConfig;
 	}
 
-	public void setCfg(InjectionConfig cfg) {
-		this.cfg = cfg;
+	public void setCfg(InjectionConfig injectionConfig) {
+		this.injectionConfig = injectionConfig;
 	}
 
 }

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

@@ -35,9 +35,11 @@ import org.apache.velocity.app.Velocity;
 import org.apache.velocity.app.VelocityEngine;
 
 import com.baomidou.mybatisplus.generator.config.ConstVal;
+import com.baomidou.mybatisplus.generator.config.FileOutConfig;
 import com.baomidou.mybatisplus.generator.config.TemplateConfig;
 import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 
 /**
@@ -107,21 +109,20 @@ public class AutoGenerator extends AbstractGenerator {
 		String superServiceImplClass = getSuperClassName(config.getSuperServiceImplClass());
 		String superControllerClass = getSuperClassName(config.getSuperControllerClass());
 		String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
-
+		VelocityContext ctx;
 		for (TableInfo tableInfo : tableList) {
-			VelocityContext ctx = new VelocityContext();
-			if (null != cfg) {
+			ctx = new VelocityContext();
+			if (null != injectionConfig) {
 				/**
 				 * 注入自定义配置
 				 */
-				cfg.initMap();
-				ctx.put("cfg", cfg.getMap());
+				injectionConfig.initMap();
+				ctx.put("cfg", injectionConfig.getMap());
 			}
 			/* ---------- 添加导入包 ---------- */
-			if (!tableInfo.getEntityName().toLowerCase().equals(tableInfo.getName().toLowerCase())) {
+			if (tableInfo.isConvert()) {
 				// 表注解
 				tableInfo.setImportPackages("com.baomidou.mybatisplus.annotations.TableName");
-				ctx.put("tabeAnnotation", true);
 			}
 			if (StringUtils.isNotEmpty(config.getSuperEntityClass())) {
 				// 父实体
@@ -220,6 +221,18 @@ public class AutoGenerator extends AbstractGenerator {
 			if (isCreate(controllerFile)) {
 				vmToFile(context, template.getController(), controllerFile);
 			}
+			if (injectionConfig != null) {
+				/**
+				 * 输出自定义文件内容
+				 */
+				List<FileOutConfig> focList = injectionConfig.getFileOutConfigList();
+				if (CollectionUtils.isNotEmpty(focList)) {
+					for (FileOutConfig foc : focList) {
+						vmToFile(context, foc.getTemplatePath(), foc.outputFile(tableInfo));
+					}
+				}
+			}
+
 		} catch (IOException e) {
 			logger.error("无法创建文件,请检查配置信息!", e);
 		}

+ 15 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/InjectionConfig.java

@@ -15,8 +15,10 @@
  */
 package com.baomidou.mybatisplus.generator;
 
+import java.util.List;
 import java.util.Map;
 
+import com.baomidou.mybatisplus.generator.config.FileOutConfig;
 import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
 
 /**
@@ -39,6 +41,11 @@ public abstract class InjectionConfig {
 	 */
 	private Map<String, Object> map;
 
+	/**
+	 * 自定义输出文件
+	 */
+	private List<FileOutConfig> fileOutConfigList;
+
 	/**
 	 * 注入自定义 Map 对象
 	 */
@@ -60,4 +67,12 @@ public abstract class InjectionConfig {
 		this.map = map;
 	}
 
+	public List<FileOutConfig> getFileOutConfigList() {
+		return fileOutConfigList;
+	}
+
+	public void setFileOutConfigList(List<FileOutConfig> fileOutConfigList) {
+		this.fileOutConfigList = fileOutConfigList;
+	}
+
 }

+ 0 - 5
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/ConstVal.java

@@ -57,11 +57,6 @@ public class ConstVal {
 	public static final String TEMPLATE_CONTROLLER = "/template/controller.java.vm";
 
 	public static final String ENTITY_NAME = File.separator + "%s" + JAVA_SUFFIX;
-//	public static final String MAPPER_NAME = File.separator + "%s" + MAPPER + JAVA_SUFFIX;
-//	public static final String XML_NAME = File.separator + "%s" + MAPPER + XML_SUFFIX;
-//	public static final String SERVICE_NAME = File.separator + "I%s" + SERIVCE + JAVA_SUFFIX;
-//	public static final String SERVICEIMPL_NAME = File.separator + "%s" + SERVICEIMPL + JAVA_SUFFIX;
-//	public static final String CONTROLLER_NAME = File.separator + "%s" + CONTROLLER + JAVA_SUFFIX;
 
 	// 配置使用classloader加载资源
 	public static final String VM_LOADPATH_KEY = "file.resource.loader.class";

+ 35 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/DataSourceConfig.java

@@ -20,6 +20,10 @@ import java.sql.DriverManager;
 import java.sql.SQLException;
 
 import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.converts.OracleTypeConvert;
+import com.baomidou.mybatisplus.generator.config.converts.PostgreSqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.converts.SqlServerTypeConvert;
 import com.baomidou.mybatisplus.generator.config.rules.DbType;
 
 /**
@@ -36,6 +40,10 @@ public class DataSourceConfig {
 	 * 数据库类型
 	 */
 	private DbType dbType;
+	/**
+	 * 类型转换
+	 */
+	private ITypeConvert typeConvert;
 	/**
 	 * 驱动连接的URL
 	 */
@@ -64,6 +72,8 @@ public class DataSourceConfig {
 				dbType = DbType.MYSQL;
 			} else if (driverName.contains("oracle")) {
 				dbType = DbType.ORACLE;
+			} else if (driverName.contains("postgresql")) {
+				dbType = DbType.POSTGRE_SQL;
 			} else {
 				throw new MybatisPlusException("Unknown type of database!");
 			}
@@ -75,6 +85,31 @@ public class DataSourceConfig {
 		this.dbType = dbType;
 	}
 
+	public ITypeConvert getTypeConvert() {
+		if (null == typeConvert) {
+			switch (getDbType()) {
+			case ORACLE:
+				typeConvert = new OracleTypeConvert();
+				break;
+			case SQL_SERVER:
+				typeConvert = new SqlServerTypeConvert();
+				break;
+			case POSTGRE_SQL:
+				typeConvert = new PostgreSqlTypeConvert();
+				break;
+			default:
+				// 默认 MYSQL
+				typeConvert = new MySqlTypeConvert();
+				break;
+			}
+		}
+		return typeConvert;
+	}
+
+	public void setTypeConvert(ITypeConvert typeConvert) {
+		this.typeConvert = typeConvert;
+	}
+
 	/**
 	 * 创建数据库连接对象
 	 *

+ 55 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/FileOutConfig.java

@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config;
+
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+
+/**
+ * <p>
+ * 输出文件配置
+ * </p>
+ *
+ * @author hubin
+ * @since 2017-01-18
+ */
+public abstract class FileOutConfig {
+	/**
+	 * 模板
+	 */
+	private String templatePath;
+
+	/**
+	 * 输出文件
+	 */
+	public abstract String outputFile(TableInfo tableInfo);
+
+	public FileOutConfig() {
+
+	}
+
+	public FileOutConfig(String templatePath) {
+		this.templatePath = templatePath;
+	}
+
+	public String getTemplatePath() {
+		return templatePath;
+	}
+
+	public void setTemplatePath(String templatePath) {
+		this.templatePath = templatePath;
+	}
+
+}

+ 41 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/ITypeConvert.java

@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2011-2016, hubin (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config;
+
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+
+/**
+ * <p>
+ * 数据库字段类型转换
+ * </p>
+ *
+ * @author hubin
+ * @date 2017-01-20
+ */
+public interface ITypeConvert {
+
+	/**
+	 * <p>
+	 * 执行类型转换
+	 * </p>
+	 * 
+	 * @param fieldType
+	 *            字段类型
+	 * @return
+	 */
+	DbColumnType processTypeConvert(String fieldType);
+
+}

+ 53 - 3
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/StrategyConfig.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.generator.config;
 
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
 
 /**
  * <p>
@@ -32,6 +33,11 @@ public class StrategyConfig {
 	 */
 	public static boolean DB_COLUMN_UNDERLINE = false;
 
+	/**
+	 * 是否大写命名
+	 */
+	private boolean isCapitalMode = false;
+
 	/**
 	 * 数据库表映射到实体的命名策略
 	 */
@@ -42,7 +48,7 @@ public class StrategyConfig {
 	/**
 	 * 表前缀
 	 */
-	private String tablePrefix;
+	private String[] tablePrefix;
 
 	/**
 	 * 自定义继承的Entity类全称,带包名
@@ -101,6 +107,50 @@ public class StrategyConfig {
 		DB_COLUMN_UNDERLINE = dbColumnUnderline;
 	}
 
+	/**
+	 * <p>
+	 * 大写命名、字段符合大写字母数字下划线命名
+	 * </p>
+	 * 
+	 * @param word
+	 *            待判断字符串
+	 * @return
+	 */
+	public boolean isCapitalModeNaming(String word) {
+		return isCapitalMode && StringUtils.isCapitalMode(word);
+	}
+
+	/**
+	 * <p>
+	 * 表名称包含指定前缀
+	 * </p>
+	 * 
+	 * @param tableName
+	 *            表名称
+	 * @return
+	 */
+	public boolean containsTablePrefix(String tableName) {
+		if (null != tableName) {
+			String[] tps = getTablePrefix();
+			if (null != tps) {
+				for (String tp : tps) {
+					if (tableName.contains(tp)) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	public boolean isCapitalMode() {
+		return isCapitalMode;
+	}
+
+	public void setCapitalMode(boolean isCapitalMode) {
+		this.isCapitalMode = isCapitalMode;
+	}
+
 	public NamingStrategy getNaming() {
 		return naming;
 	}
@@ -117,11 +167,11 @@ public class StrategyConfig {
 		this.fieldNaming = fieldNaming;
 	}
 
-	public String getTablePrefix() {
+	public String[] getTablePrefix() {
 		return tablePrefix;
 	}
 
-	public void setTablePrefix(String tablePrefix) {
+	public void setTablePrefix(String[] tablePrefix) {
 		this.tablePrefix = tablePrefix;
 	}
 

+ 20 - 181
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilder.java

@@ -16,12 +16,16 @@
 package com.baomidou.mybatisplus.generator.config.builder;
 
 import java.io.File;
-import java.math.BigDecimal;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import com.baomidou.mybatisplus.generator.config.ConstVal;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
@@ -78,6 +82,11 @@ public class ConfigBuilder {
 	 * 模板路径配置信息
 	 */
 	private TemplateConfig template;
+	
+	/**
+	 * 数据库配置
+	 */
+	private DataSourceConfig dataSourceConfig;
 
 	/**
 	 * 策略配置
@@ -117,6 +126,7 @@ public class ConfigBuilder {
 		} else {
 			handlerPackage(this.globalConfig.getOutputDir(), packageConfig);
 		}
+		this.dataSourceConfig = dataSourceConfig;
 		handlerDataSource(dataSourceConfig);
 		// 策略配置
 		if (null == strategyConfig) {
@@ -281,9 +291,9 @@ public class ConfigBuilder {
 	 * @param tablePrefix
 	 * @return 补充完整信息后的表
 	 */
-	private List<TableInfo> processTable(List<TableInfo> tableList, NamingStrategy strategy, String tablePrefix) {
+	private List<TableInfo> processTable(List<TableInfo> tableList, NamingStrategy strategy, String[] tablePrefix) {
 		for (TableInfo tableInfo : tableList) {
-			tableInfo.setEntityName(NamingStrategy.capitalFirst(processName(tableInfo.getName(), strategy, tablePrefix)));
+			tableInfo.setEntityName(strategyConfig, NamingStrategy.capitalFirst(processName(tableInfo.getName(), strategy, tablePrefix)));
 			if (StringUtils.isNotEmpty(globalConfig.getMapperName())) {
 				tableInfo.setMapperName(String.format(globalConfig.getMapperName(), tableInfo.getEntityName()));
 			} else {
@@ -332,11 +342,12 @@ public class ConfigBuilder {
 		try {
 			pstate = connection.prepareStatement(querySQL.getTableCommentsSql());
 			ResultSet results = pstate.executeQuery();
+			TableInfo tableInfo;
 			while (results.next()) {
 				String tableName = results.getString(querySQL.getTableName());
 				if (StringUtils.isNotEmpty(tableName)) {
 					String tableComment = results.getString(querySQL.getTableComment());
-					TableInfo tableInfo = new TableInfo();
+					tableInfo = new TableInfo();
 					if (isInclude) {
 						for (String includeTab : config.getInclude()) {
 							if (includeTab.equalsIgnoreCase(tableName)) {
@@ -404,16 +415,12 @@ public class ConfigBuilder {
 	 */
 	private List<TableField> getListFields(String tableName, NamingStrategy strategy) throws SQLException {
 		boolean havedId = false;
-
 		PreparedStatement pstate = connection.prepareStatement(String.format(querySQL.getTableFieldsSql(), tableName));
 		ResultSet results = pstate.executeQuery();
 
 		List<TableField> fieldList = new ArrayList<TableField>();
-		TableField field;
-		Set<String> javaType;
 		while (results.next()) {
-			field = new TableField();
-			javaType = new HashSet<String>();
+			TableField field = new TableField();
 			String key = results.getString(querySQL.getFieldKey());
 			// 避免多重主键设置,目前只取第一个找到ID,并放到list中的索引为0的位置
 			boolean isId = StringUtils.isNotEmpty(key) && key.toUpperCase().equals("PRI");
@@ -431,17 +438,8 @@ public class ConfigBuilder {
 				continue;
 			}
 			field.setType(results.getString(querySQL.getFieldType()));
-			field.setPropertyName(processName(field.getName(), strategy));
-			String propertyType = processFiledType(field.getType());
-			field.setPropertyType(propertyType);
-			if(propertyType!=null){
-				if(propertyType.equals(Date.class.getSimpleName())){
-					javaType.add(Date.class.getName());
-				}else if(propertyType.equals(BigDecimal.class.getSimpleName())){
-					javaType.add(BigDecimal.class.getName());
-				}
-			}
-			field.setJavaType(javaType);
+			field.setPropertyName(strategyConfig, processName(field.getName(), strategy));
+			field.setColumnType(dataSourceConfig.getTypeConvert().processTypeConvert(field.getType()));
 			field.setComment(results.getString(querySQL.getFieldComment()));
 			fieldList.add(field);
 		}
@@ -484,24 +482,6 @@ public class ConfigBuilder {
 		return parent + "." + subPackage;
 	}
 
-	/**
-	 * 处理字段类型
-	 *
-	 * @return 转换成JAVA包装类型
-	 */
-	private String processFiledType(String type) {
-		if (QuerySQL.MYSQL == querySQL) {
-			return processMySqlType(type);
-		} else if (QuerySQL.ORACLE == querySQL) {
-			return processOracleType(type);
-		} else if (QuerySQL.SQL_SERVER == querySQL) {
-			return processSQLServerType(type);
-		} else if (QuerySQL.POSTGRE_SQL == querySQL) {
-			return processPostgreSQL(type);
-		}
-		return null;
-	}
-
 	/**
 	 * 处理字段名称
 	 *
@@ -519,7 +499,7 @@ public class ConfigBuilder {
 	 * @param tablePrefix
 	 * @return 根据策略返回处理后的名称
 	 */
-	private String processName(String name, NamingStrategy strategy, String tablePrefix) {
+	private String processName(String name, NamingStrategy strategy, String[] tablePrefix) {
 		String propertyName = "";
 		if (strategy == NamingStrategy.remove_prefix_and_camel) {
 			propertyName = NamingStrategy.removePrefixAndCamel(name, tablePrefix);
@@ -533,147 +513,6 @@ public class ConfigBuilder {
 		return propertyName;
 	}
 
-	/**
-	 * <p>
-	 * Mysql 字段类型转换
-	 * </p>
-	 *
-	 * @param type
-	 *            字段类型
-	 * @return JAVA类型
-	 */
-	private String processMySqlType(String type) {
-		String t = type.toLowerCase();
-		if (t.contains("char") || t.contains("text")) {
-			return "String";
-		} else if (t.contains("bigint")) {
-			return "Long";
-		} else if (t.contains("int")) {
-			return "Integer";
-		} else if (t.contains("date") || t.contains("time") || t.contains("year")) {
-			return "Date";
-		} else if (t.contains("text")) {
-			return "String";
-		} else if (t.contains("bit")) {
-			return "Boolean";
-		} else if (t.contains("decimal")) {
-			return "BigDecimal";
-		} else if (t.contains("blob")) {
-			return "byte[]";
-		} else if (t.contains("float")) {
-			return "Float";
-		} else if (t.contains("double")) {
-			return "Double";
-		} else if (t.contains("json") || t.contains("enum")) {
-			return "String";
-		}
-		return "String";
-	}
-
-	/**
-	 * <p>
-	 * Oracle 字段类型转换
-	 * </p>
-	 *
-	 * @param type
-	 *            字段类型
-	 * @return JAVA类型
-	 */
-	private String processOracleType(String type) {
-		String t = type.toUpperCase();
-		if (t.contains("CHAR")) {
-			return "String";
-		} else if (t.contains("DATE") || t.contains("TIMESTAMP")) {
-			return "Date";
-		} else if (t.contains("NUMBER")) {
-			if (t.matches("NUMBER\\(+\\d{1}+\\)")) {
-				return "Integer";
-			} else if (t.matches("NUMBER\\(+\\d{2}+\\)")) {
-				return "Long";
-			}
-			return "Double";
-		} else if (t.contains("FLOAT")) {
-			return "Float";
-		} else if (t.contains("BLOB")) {
-			return "Object";
-		} else if (t.contains("RAW")) {
-			return "byte[]";
-		}
-		return "String";
-	}
-
-	/**
-	 * <p>
-	 * SQLServer 字段类型转换
-	 * </p>
-	 * 
-	 * @param type
-	 * @return
-	 */
-	private String processSQLServerType(String type) {
-		String t = type.toLowerCase();
-		if (t.contains("char") || t.contains("text") || t.contains("xml")) {
-			return "String";
-		} else if (t.contains("bigint")) {
-			return "Long";
-		} else if (t.contains("int")) {
-			return "Integer";
-		} else if (t.contains("date") || t.contains("time")) {
-			return "Date";
-		} else if (t.contains("text")) {
-			return "String";
-		} else if (t.contains("bit")) {
-			return "Boolean";
-		}else if (t.contains("decimal")||t.contains("numeric")){
-			return "Double";
-		}else if (t.contains("money")) {
-			return "BigDecimal";
-		} else if (t.contains("binary")||t.contains("image")) {
-			return "byte[]";
-		} else if (t.contains("float")||t.contains("real")) {
-			return "Float";
-		}
-		return "String";
-	}
-
-
-	/**
-	 * <p>
-	 * PostgreSQL 字段类型转换
-	 * </p>
-	 *
-	 * @param type
-	 *            字段类型
-	 * @return JAVA类型
-	 */
-	private String processPostgreSQL(String type) {
-		String t = type.toLowerCase();
-		if (t.contains("char") || t.contains("text")) {
-			return "String";
-		} else if (t.contains("bigint")) {
-			return "Long";
-		} else if (t.contains("int")) {
-			return "Integer";
-		} else if (t.contains("date") || t.contains("time") || t.contains("year")) {
-			return "Date";
-		} else if (t.contains("text")) {
-			return "String";
-		} else if (t.contains("bit")) {
-			return "Boolean";
-		} else if (t.contains("decimal")) {
-			return "BigDecimal";
-		} else if (t.contains("blob")) {
-			return "byte[]";
-		} else if (t.contains("float")) {
-			return "Float";
-		} else if (t.contains("double")) {
-			return "Double";
-		} else if (t.contains("json") || t.contains("enum")) {
-			return "String";
-		}
-		return "String";
-	}
-
 	/**
 	 * 获取当前的SQL类型
 	 *

+ 59 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/MySqlTypeConvert.java

@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011-2016, hubin (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config.converts;
+
+import com.baomidou.mybatisplus.generator.config.ITypeConvert;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+
+/**
+ * <p>
+ * MYSQL 数据库字段类型转换
+ * </p>
+ *
+ * @author hubin
+ * @date 2017-01-20
+ */
+public class MySqlTypeConvert implements ITypeConvert {
+
+	public DbColumnType processTypeConvert(String fieldType) {
+		String t = fieldType.toLowerCase();
+		if (t.contains("char") || t.contains("text")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("bigint")) {
+			return DbColumnType.LONG;
+		} else if (t.contains("int")) {
+			return DbColumnType.INTEGER;
+		} else if (t.contains("date") || t.contains("time") || t.contains("year")) {
+			return DbColumnType.DATE;
+		} else if (t.contains("text")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("bit")) {
+			return DbColumnType.BOOLEAN;
+		} else if (t.contains("decimal")) {
+			return DbColumnType.BIG_DECIMAL;
+		} else if (t.contains("blob")) {
+			return DbColumnType.BYTE_ARRAY;
+		} else if (t.contains("float")) {
+			return DbColumnType.FLOAT;
+		} else if (t.contains("double")) {
+			return DbColumnType.DOUBLE;
+		} else if (t.contains("json") || t.contains("enum")) {
+			return DbColumnType.STRING;
+		}
+		return DbColumnType.STRING;
+	}
+
+}

+ 54 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/OracleTypeConvert.java

@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2011-2016, hubin (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config.converts;
+
+import com.baomidou.mybatisplus.generator.config.ITypeConvert;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+
+/**
+ * <p>
+ * ORACLE 字段类型转换
+ * </p>
+ *
+ * @author hubin
+ * @date 2017-01-20
+ */
+public class OracleTypeConvert implements ITypeConvert {
+
+	public DbColumnType processTypeConvert(String fieldType) {
+		String t = fieldType.toUpperCase();
+		if (t.contains("CHAR")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("DATE") || t.contains("TIMESTAMP")) {
+			return DbColumnType.DATE;
+		} else if (t.contains("NUMBER")) {
+			if (t.matches("NUMBER\\(+\\d{1}+\\)")) {
+				return DbColumnType.INTEGER;
+			} else if (t.matches("NUMBER\\(+\\d{2}+\\)")) {
+				return DbColumnType.LONG;
+			}
+			return DbColumnType.DOUBLE;
+		} else if (t.contains("FLOAT")) {
+			return DbColumnType.FLOAT;
+		} else if (t.contains("BLOB")) {
+			return DbColumnType.OBJECT;
+		} else if (t.contains("RAW")) {
+			return DbColumnType.BYTE_ARRAY;
+		}
+		return DbColumnType.STRING;
+	}
+
+}

+ 59 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/PostgreSqlTypeConvert.java

@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2011-2016, hubin (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config.converts;
+
+import com.baomidou.mybatisplus.generator.config.ITypeConvert;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+
+/**
+ * <p>
+ * PostgreSQL 字段类型转换
+ * </p>
+ *
+ * @author hubin
+ * @date 2017-01-20
+ */
+public class PostgreSqlTypeConvert implements ITypeConvert {
+
+	public DbColumnType processTypeConvert(String fieldType) {
+		String t = fieldType.toLowerCase();
+		if (t.contains("char") || t.contains("text")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("bigint")) {
+			return DbColumnType.LONG;
+		} else if (t.contains("int")) {
+			return DbColumnType.INTEGER;
+		} else if (t.contains("date") || t.contains("time") || t.contains("year")) {
+			return DbColumnType.DATE;
+		} else if (t.contains("text")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("bit")) {
+			return DbColumnType.BOOLEAN;
+		} else if (t.contains("decimal")) {
+			return DbColumnType.BIG_DECIMAL;
+		} else if (t.contains("blob")) {
+			return DbColumnType.BYTE_ARRAY;
+		} else if (t.contains("float")) {
+			return DbColumnType.FLOAT;
+		} else if (t.contains("double")) {
+			return DbColumnType.DOUBLE;
+		} else if (t.contains("json") || t.contains("enum")) {
+			return DbColumnType.STRING;
+		}
+		return DbColumnType.STRING;
+	}
+
+}

+ 57 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvert.java

@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2011-2016, hubin (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config.converts;
+
+import com.baomidou.mybatisplus.generator.config.ITypeConvert;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+
+/**
+ * <p>
+ * SQLServer 字段类型转换
+ * </p>
+ *
+ * @author hubin
+ * @date 2017-01-20
+ */
+public class SqlServerTypeConvert implements ITypeConvert {
+
+	public DbColumnType processTypeConvert(String fieldType) {
+		String t = fieldType.toLowerCase();
+		if (t.contains("char") || t.contains("text") || t.contains("xml")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("bigint")) {
+			return DbColumnType.LONG;
+		} else if (t.contains("int")) {
+			return DbColumnType.INTEGER;
+		} else if (t.contains("date") || t.contains("time")) {
+			return DbColumnType.DATE;
+		} else if (t.contains("text")) {
+			return DbColumnType.STRING;
+		} else if (t.contains("bit")) {
+			return DbColumnType.BOOLEAN;
+		} else if (t.contains("decimal") || t.contains("numeric")) {
+			return DbColumnType.DOUBLE;
+		} else if (t.contains("money")) {
+			return DbColumnType.BIG_DECIMAL;
+		} else if (t.contains("binary") || t.contains("image")) {
+			return DbColumnType.BYTE_ARRAY;
+		} else if (t.contains("float") || t.contains("real")) {
+			return DbColumnType.FLOAT;
+		}
+		return DbColumnType.STRING;
+	}
+
+}

+ 29 - 18
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableField.java

@@ -17,8 +17,7 @@ package com.baomidou.mybatisplus.generator.config.po;
 
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
-
-import java.util.Set;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
 
 /**
  * <p>
@@ -29,13 +28,38 @@ import java.util.Set;
  * @since 2016-12-03
  */
 public class TableField {
+	private boolean convert;
 	private boolean keyFlag;
 	private String name;
 	private String type;
 	private String propertyName;
 	private DbColumnType columnType;
 	private String comment;
-	private Set<String> javaType;
+
+	public boolean isConvert() {
+		return convert;
+	}
+
+	public void setConvert(boolean convert) {
+		this.convert = convert;
+	}
+
+	protected void setConvert(StrategyConfig strategyConfig) {
+		if (strategyConfig.isCapitalModeNaming(name)) {
+			this.convert = false;
+		} else {
+			// 转换字段
+			if (StrategyConfig.DB_COLUMN_UNDERLINE) {
+				// 包含大写处理
+				if (StringUtils.containsUpperCase(name)) {
+					this.convert = true;
+				}
+			} else if (!name.equalsIgnoreCase(propertyName)) {
+				this.convert = true;
+			}
+		}
+	}
+
 	public boolean isKeyFlag() {
 		return keyFlag;
 	}
@@ -64,8 +88,9 @@ public class TableField {
 		return propertyName;
 	}
 
-	public void setPropertyName(String propertyName) {
+	public void setPropertyName(StrategyConfig strategyConfig, String propertyName) {
 		this.propertyName = propertyName;
+		this.setConvert(strategyConfig);
 	}
 
 	public DbColumnType getColumnType() {
@@ -91,22 +116,8 @@ public class TableField {
 		this.comment = comment;
 	}
 
-	public boolean isConvert() {
-		if (StrategyConfig.DB_COLUMN_UNDERLINE) {
-			return false;
-		}
-		return !name.equalsIgnoreCase(propertyName);
-	}
-
 	public String getCapitalName() {
 		return propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
 	}
 
-	public Set<String> getJavaType() {
-		return javaType;
-	}
-
-	public void setJavaType(Set<String> javaType) {
-		this.javaType = javaType;
-	}
 }

+ 33 - 3
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableInfo.java

@@ -21,6 +21,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
 import com.baomidou.mybatisplus.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 
@@ -33,7 +34,7 @@ import com.baomidou.mybatisplus.toolkit.StringUtils;
  * @since 2016/8/30
  */
 public class TableInfo {
-
+	private boolean convert;
 	private String name;
 	private String comment;
 
@@ -48,6 +49,34 @@ public class TableInfo {
 	private List<String> importPackages = new ArrayList<String>();
 	private String fieldNames;
 
+	public boolean isConvert() {
+		return convert;
+	}
+
+	public void setConvert(boolean convert) {
+		this.convert = convert;
+	}
+
+	protected void setConvert(StrategyConfig strategyConfig) {
+		if (strategyConfig.containsTablePrefix(name)) {
+			// 包含前缀
+			this.convert = true;
+		} else if (strategyConfig.isCapitalModeNaming(name)) {
+			// 包含
+			this.convert = false;
+		} else {
+			// 转换字段
+			if (StrategyConfig.DB_COLUMN_UNDERLINE) {
+				// 包含大写处理
+				if (StringUtils.containsUpperCase(name)) {
+					this.convert = true;
+				}
+			} else if (!entityName.equalsIgnoreCase(name)) {
+				this.convert = true;
+			}
+		}
+	}
+
 	public String getName() {
 		return name;
 	}
@@ -75,8 +104,9 @@ public class TableInfo {
 		return entityName;
 	}
 
-	public void setEntityName(String entityName) {
+	public void setEntityName(StrategyConfig strategyConfig, String entityName) {
 		this.entityName = entityName;
+		this.setConvert(strategyConfig);
 	}
 
 	public String getMapperName() {
@@ -140,7 +170,7 @@ public class TableInfo {
 				}
 			}
 			if (!pkgSet.isEmpty()) {
-				this.importPackages = Arrays.asList(pkgSet.toArray(new String[] {}));
+				this.importPackages = new ArrayList<String>(Arrays.asList(pkgSet.toArray(new String[] {})));
 			}
 		}
 	}

+ 6 - 0
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/rules/DbColumnType.java

@@ -31,8 +31,14 @@ public enum DbColumnType {
 	DOUBLE("Double", null),
 	BOOLEAN("Boolean", null),
 	BYTE_ARRAY("byte[]", null),
+	CHARACTER("Character", null),
 	OBJECT("Object", null),
 	DATE("Date", "java.util.Date"),
+	TIME("Time", "java.sql.Time"),
+	BLOB("Blob", "java.sql.Blob"),
+	CLOB("Clob", "java.sql.Clob"),
+	TIMESTAMP("Timestamp", "java.sql.Timestamp"),
+	BIG_INTEGER("BigInteger", "java.math.BigInteger"),
 	BIG_DECIMAL("BigDecimal", "java.math.BigDecimal");
 
 	/** 类型 */

+ 16 - 11
mybatis-plus/src/main/java/com/baomidou/mybatisplus/generator/config/rules/NamingStrategy.java

@@ -48,9 +48,14 @@ public enum NamingStrategy {
 			// 没必要转换
 			return "";
 		}
+		String tempName = name;
 		StringBuilder result = new StringBuilder();
+		// 大写数字下划线组成转为小写
+		if (StringUtils.isCapitalMode(name)) {
+			tempName = name.toLowerCase();
+		}
 		// 用下划线将原始字符串分割
-		String camels[] = name.toLowerCase().split(ConstVal.UNDERLINE);
+		String camels[] = tempName.split(ConstVal.UNDERLINE);
 		for (String camel : camels) {
 			// 跳过原始字符串中开头、结尾的下换线或双重下划线
 			if (StringUtils.isEmpty(camel)) {
@@ -92,20 +97,20 @@ public enum NamingStrategy {
 	 * @param prefix
 	 * @return
 	 */
-	public static String removePrefix(String name, String prefix) {
+	public static String removePrefix(String name, String[] prefix) {
 		if (StringUtils.isEmpty(name)) {
 			return "";
 		}
-		int idx = name.indexOf(ConstVal.UNDERLINE);
-		if (prefix != null && !"".equals(prefix.trim())) {
-			if (name.toLowerCase().matches("^" + prefix.toLowerCase() + ".*")) { // 判断是否有匹配的前缀,然后截取前缀
-				idx = prefix.length() - 1;
+		if (null != prefix) {
+			for (String pf : prefix) {
+				if (name.toLowerCase().matches("^" + pf.toLowerCase() + ".*")) {
+					// 判断是否有匹配的前缀,然后截取前缀
+					// 删除前缀
+					return name.substring(pf.length());
+				}
 			}
 		}
-		if (idx == -1) {
-			return name;
-		}
-		return name.substring(idx + 1);
+		return name;
 	}
 
 	/**
@@ -115,7 +120,7 @@ public enum NamingStrategy {
 	 * @param tablePrefix
 	 * @return
 	 */
-	public static String removePrefixAndCamel(String name, String tablePrefix) {
+	public static String removePrefixAndCamel(String name, String[] tablePrefix) {
 		return underlineToCamel(removePrefix(name, tablePrefix));
 	}
 

+ 71 - 46
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/AutoSqlInjector.java

@@ -15,14 +15,15 @@
  */
 package com.baomidou.mybatisplus.mapper;
 
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
+import com.baomidou.mybatisplus.entity.GlobalConfiguration;
+import com.baomidou.mybatisplus.entity.TableFieldInfo;
+import com.baomidou.mybatisplus.entity.TableInfo;
+import com.baomidou.mybatisplus.enums.FieldStrategy;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.enums.SqlMethod;
+import com.baomidou.mybatisplus.toolkit.SqlReservedWords;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
@@ -36,17 +37,16 @@ import org.apache.ibatis.mapping.SqlCommandType;
 import org.apache.ibatis.mapping.SqlSource;
 import org.apache.ibatis.mapping.StatementType;
 import org.apache.ibatis.scripting.LanguageDriver;
+import org.apache.ibatis.scripting.defaults.RawSqlSource;
 import org.apache.ibatis.session.Configuration;
 
-import com.baomidou.mybatisplus.entity.GlobalConfiguration;
-import com.baomidou.mybatisplus.entity.TableFieldInfo;
-import com.baomidou.mybatisplus.entity.TableInfo;
-import com.baomidou.mybatisplus.enums.FieldStrategy;
-import com.baomidou.mybatisplus.enums.IdType;
-import com.baomidou.mybatisplus.enums.SqlMethod;
-import com.baomidou.mybatisplus.toolkit.SqlReservedWords;
-import com.baomidou.mybatisplus.toolkit.StringUtils;
-import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * <p>
@@ -83,8 +83,8 @@ public class AutoSqlInjector implements ISqlInjector {
 	public void inject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass) {
 		this.configuration = builderAssistant.getConfiguration();
 		this.builderAssistant = builderAssistant;
-		this.languageDriver = configuration.getDefaultScriptingLanuageInstance();
-		GlobalConfiguration globalCache = GlobalConfiguration.GlobalConfig(configuration);
+		this.languageDriver = configuration.getDefaultScriptingLanguageInstance();
+		GlobalConfiguration globalCache = GlobalConfiguration.getGlobalConfig(configuration);
 		/*
 		 * 驼峰设置 PLUS 配置 > 原始配置
 		 */
@@ -113,7 +113,7 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * <p>
 	 * 注入SQL
 	 * </p>
-	 * 
+	 *
 	 * @param builderAssistant
 	 * @param mapperClass
 	 * @param modelClass
@@ -168,6 +168,12 @@ public class AutoSqlInjector implements ISqlInjector {
 		// to do nothing
 	}
 
+	/**
+	 * 避免扫描到BaseMapper
+	 * 
+	 * @param mapperClass
+	 * @return
+	 */
 	protected Class<?> extractModelClass(Class<?> mapperClass) {
 		if (mapperClass == BaseMapper.class) {
 			logger.warn(" Current Class is BaseMapper ");
@@ -286,18 +292,19 @@ public class AutoSqlInjector implements ISqlInjector {
 	 */
 	protected void injectDeleteByIdSql(boolean batch, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
 		SqlMethod sqlMethod = SqlMethod.DELETE_BY_ID;
-		String sql = null;
+		SqlSource sqlSource = null;
 		if (batch) {
 			sqlMethod = SqlMethod.DELETE_BATCH_BY_IDS;
 			StringBuilder ids = new StringBuilder();
 			ids.append("\n<foreach item=\"item\" index=\"index\" collection=\"list\" separator=\",\">");
 			ids.append("#{item}");
 			ids.append("\n</foreach>");
-			sql = String.format(sqlMethod.getSql(), table.getTableName(), table.getKeyColumn(), ids.toString());
+			String sql = String.format(sqlMethod.getSql(), table.getTableName(), table.getKeyColumn(), ids.toString());
+			sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
 		} else {
-			sql = String.format(sqlMethod.getSql(), table.getTableName(), table.getKeyColumn(), table.getKeyColumn());
+			String sql = String.format(sqlMethod.getSql(), table.getTableName(), table.getKeyColumn(), table.getKeyColumn());
+			sqlSource = new RawSqlSource(configuration, sql, Object.class);
 		}
-		SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
 		this.addDeleteMappedStatement(mapperClass, sqlMethod.getMethod(), sqlSource);
 	}
 
@@ -357,8 +364,8 @@ public class AutoSqlInjector implements ISqlInjector {
 			sqlSource = languageDriver.createSqlSource(configuration, String.format(sqlMethod.getSql(),
 					sqlSelectColumns(table, false), table.getTableName(), table.getKeyColumn(), ids.toString()), modelClass);
 		} else {
-			sqlSource = languageDriver.createSqlSource(configuration, String.format(sqlMethod.getSql(), sqlSelectColumns(table, false),
-					table.getTableName(), table.getKeyColumn(), table.getKeyProperty()), modelClass);
+			sqlSource = new RawSqlSource(configuration, String.format(sqlMethod.getSql(), sqlSelectColumns(table, false),
+					table.getTableName(), table.getKeyColumn(), table.getKeyProperty()), Object.class);
 		}
 		this.addSelectMappedStatement(mapperClass, sqlMethod.getMethod(), sqlSource, modelClass, table);
 	}
@@ -527,7 +534,7 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * @return
 	 */
 	protected String sqlWordConvert(String convertStr) {
-		GlobalConfiguration globalConfig = GlobalConfiguration.GlobalConfig(configuration);
+		GlobalConfiguration globalConfig = GlobalConfiguration.getGlobalConfig(configuration);
 		return SqlReservedWords.convert(globalConfig, convertStr);
 	}
 
@@ -561,27 +568,45 @@ public class AutoSqlInjector implements ISqlInjector {
 			if (entityWrapper) {
 				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(table.getKeyColumn()).append(" AS ").append(sqlWordConvert(table.getKeyProperty()));
 				} else {
 					columns.append(sqlWordConvert(table.getKeyProperty()));
 				}
-				columns.append(",");
+				if (_size >= 1) {
+					// 判断其余字段是否存在
+					columns.append(",");
+				}
 			}
 
-			List<TableFieldInfo> fieldList = table.getFieldList();
-			int _size = fieldList.size();
-			int i = 0;
-			Iterator<TableFieldInfo> iterator = fieldList.iterator();
-			while (iterator.hasNext()) {
-				TableFieldInfo fieldInfo = iterator.next();
-				columns.append(fieldInfo.getColumn());
-				columns.append(" AS ").append(sqlWordConvert(fieldInfo.getProperty()));
-				if (i + 1 < _size) {
-					columns.append(",");
+			if (_size >= 1) {
+				// 字段处理
+				int i = 0;
+				Iterator<TableFieldInfo> iterator = fieldList.iterator();
+				while (iterator.hasNext()) {
+					TableFieldInfo fieldInfo = iterator.next();
+					// 匹配转换内容
+					String wordConvert = sqlWordConvert(fieldInfo.getProperty());
+					if (fieldInfo.getColumn().equals(wordConvert)) {
+						columns.append(wordConvert);
+					} else {
+						// 字段属性不一致
+						columns.append(fieldInfo.getColumn());
+						columns.append(" AS ").append(wordConvert);
+					}
+					if (i + 1 < _size) {
+						columns.append(",");
+					}
+					i++;
 				}
-				i++;
 			}
 			if (entityWrapper) {
 				columns.append("</otherwise></choose>");
@@ -634,7 +659,6 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * </p>
 	 */
 	protected String sqlWhereByMap() {
-
 		StringBuilder where = new StringBuilder();
 		where.append("\n<if test=\"cm!=null and !cm.isEmpty\">");
 		where.append("\n<where>");
@@ -680,7 +704,7 @@ public class AutoSqlInjector implements ISqlInjector {
 				return "";
 			}
 			// 查询策略,使用全局策略
-			fieldStrategy = GlobalConfiguration.GlobalConfig(configuration).getFieldStrategy();
+			fieldStrategy = GlobalConfiguration.getGlobalConfig(configuration).getFieldStrategy();
 		}
 
 		// 关闭标签
@@ -697,11 +721,10 @@ public class AutoSqlInjector implements ISqlInjector {
 		// 验证逻辑
 		if (fieldStrategy == FieldStrategy.NOT_EMPTY) {
 			String propertyType = fieldInfo.getPropertyType();
-			// 如果是Date类型
-			if ("java.util.Date".equals(propertyType) || "java.sql.Date".equals(propertyType)) {
-				return String.format("\n\t<if test=\"%s!=null \">", property, property);
-			} else {
+			if (StringUtils.isCharSequence(propertyType)) {
 				return String.format("\n\t<if test=\"%s!=null and %s!=''\">", property, property);
+			} else {
+				return String.format("\n\t<if test=\"%s!=null \">", property, property);
 			}
 		} else {
 			// FieldStrategy.NOT_NULL
@@ -787,7 +810,7 @@ public class AutoSqlInjector implements ISqlInjector {
 	// --------------------------------------------------------SqlRunner------------------------------------------------------------
 	public void injectSqlRunner(Configuration configuration) {
 		this.configuration = configuration;
-		this.languageDriver = configuration.getDefaultScriptingLanuageInstance();
+		this.languageDriver = configuration.getDefaultScriptingLanguageInstance();
 		initSelect();
 		initInsert();
 		initUpdate();
@@ -814,6 +837,7 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * @param resultType
 	 *            返回的结果类型
 	 */
+	@SuppressWarnings("serial")
 	private void createSelectMappedStatement(String mappedStatement, SqlSource sqlSource, final Class<?> resultType) {
 		MappedStatement ms = new MappedStatement.Builder(configuration, mappedStatement, sqlSource, SqlCommandType.SELECT)
 				.resultMaps(new ArrayList<ResultMap>() {
@@ -835,6 +859,7 @@ public class AutoSqlInjector implements ISqlInjector {
 	 * @param sqlCommandType
 	 *            执行的sqlCommandType
 	 */
+	@SuppressWarnings("serial")
 	private void createUpdateMappedStatement(String mappedStatement, SqlSource sqlSource, SqlCommandType sqlCommandType) {
 		MappedStatement ms = new MappedStatement.Builder(configuration, mappedStatement, sqlSource, sqlCommandType).resultMaps(
 				new ArrayList<ResultMap>() {

+ 46 - 11
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlHelper.java

@@ -18,12 +18,15 @@ package com.baomidou.mybatisplus.mapper;
 import com.baomidou.mybatisplus.entity.GlobalConfiguration;
 import com.baomidou.mybatisplus.entity.TableInfo;
 import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 
 import java.util.List;
 
@@ -31,7 +34,7 @@ import java.util.List;
  * <p>
  * SQL 辅助类
  * </p>
- * 
+ *
  * @author hubin
  * @Date 2016-11-06
  */
@@ -55,20 +58,42 @@ public class SqlHelper {
 	 * <p>
 	 * 批量操作 SqlSession
 	 * </p>
-	 * 
+	 *
 	 * @param clazz
 	 *            实体类
 	 * @return SqlSession
 	 */
 	public static SqlSession sqlSessionBatch(Class<?> clazz) {
-		return GlobalConfiguration.currentSessionFactory(clazz).openSession(ExecutorType.BATCH, false);
+		SqlSession sqlSession = getSqlSession(clazz, true);
+		return (sqlSession != null) ? sqlSession : GlobalConfiguration.currentSessionFactory(clazz).openSession(
+				ExecutorType.BATCH, false);
+	}
+
+	/**
+	 * 获取sqlSessionå
+	 *
+	 * @param clazz
+	 * @param isBatch
+	 * @return
+	 */
+	private static SqlSession getSqlSession(Class<?> clazz, boolean isBatch) {
+		SqlSession session = null;
+		try {
+			SqlSessionFactory sqlSessionFactory = GlobalConfiguration.currentSessionFactory(clazz);
+			Configuration configuration = sqlSessionFactory.getConfiguration();
+			GlobalConfiguration globalConfiguration = GlobalConfiguration.getGlobalConfig(configuration);
+			session = isBatch ? globalConfiguration.getSqlsessionBatch() : globalConfiguration.getSqlSession();
+		} catch (Exception e) {
+			// ignored
+		}
+		return session;
 	}
 
 	/**
 	 * <p>
 	 * 获取Session
 	 * </p>
-	 * 
+	 *
 	 * @param clazz
 	 *            实体类
 	 * @param autoCommit
@@ -76,12 +101,13 @@ public class SqlHelper {
 	 * @return SqlSession
 	 */
 	public static SqlSession sqlSession(Class<?> clazz, boolean autoCommit) {
-		return GlobalConfiguration.currentSessionFactory(clazz).openSession(autoCommit);
+		SqlSession sqlSession = getSqlSession(clazz, false);
+		return (sqlSession != null) ? sqlSession : GlobalConfiguration.currentSessionFactory(clazz).openSession(autoCommit);
 	}
 
 	/**
 	 * 获取TableInfo
-	 * 
+	 *
 	 * @return TableInfo
 	 */
 	public static TableInfo table(Class<?> clazz) {
@@ -102,10 +128,7 @@ public class SqlHelper {
 	 * @return boolean
 	 */
 	public static boolean retBool(Integer result) {
-		if (null == result) {
-			return false;
-		}
-		return result >= 1;
+		return (null == result) ? false : result >= 1;
 	}
 
 	/**
@@ -124,7 +147,7 @@ public class SqlHelper {
 	 * <p>
 	 * 从list中取第一条数据返回对应List中泛型的单个结果
 	 * </p>
-	 * 
+	 *
 	 * @param list
 	 * @param <E>
 	 * @return
@@ -140,4 +163,16 @@ public class SqlHelper {
 		return null;
 	}
 
+	/**
+	 * 填充Wrapper
+	 *
+	 * @param page
+	 * @param wrapper
+	 */
+	public static void fillWrapper(Page<?> page, Wrapper<?> wrapper) {
+		if (null != wrapper) {
+			wrapper.orderBy(page.getOrderByField(), page.isAsc());
+			wrapper.allEq(page.getCondition());
+		}
+	}
 }

+ 1 - 7
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlPlus.java

@@ -251,13 +251,7 @@ public class SqlPlus extends MybatisAbstractSQL<SqlPlus> {
 	 */
 	private void handerIn(String column, String value, boolean isNot) {
 		if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(value)) {
-			StringBuilder inSql = new StringBuilder();
-			inSql.append(column);
-			if (isNot) {
-				inSql.append(" NOT");
-			}
-			inSql.append(" IN (").append(value).append(")");
-			WHERE(inSql.toString());
+			handerIn(column, StringUtils.splitWorker(value, ",", -1, false), isNot);
 		}
 	}
 

+ 7 - 5
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/SqlRunner.java

@@ -16,7 +16,6 @@
 package com.baomidou.mybatisplus.mapper;
 
 import com.baomidou.mybatisplus.entity.GlobalConfiguration;
-import com.baomidou.mybatisplus.entity.TableInfo;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 import org.apache.ibatis.session.SqlSession;
@@ -38,6 +37,7 @@ public class SqlRunner {
 
 	// 默认FACTORY
 	public static SqlSessionFactory FACTORY;
+
 	public static final String INSERT = "com.baomidou.mybatisplus.mapper.SqlRunner.Insert";
 	public static final String DELETE = "com.baomidou.mybatisplus.mapper.SqlRunner.Delete";
 	public static final String UPDATE = "com.baomidou.mybatisplus.mapper.SqlRunner.Update";
@@ -48,16 +48,17 @@ public class SqlRunner {
 
 	// 单例Query
 	public static final SqlRunner DEFAULT = new SqlRunner();
+
 	private SqlSessionFactory sqlSessionFactory;
 
+	private Class<?> clazz;
+
 	public SqlRunner() {
 		this.sqlSessionFactory = FACTORY;
 	}
 
 	public SqlRunner(Class<?> clazz) {
-		TableInfo tableInfo = SqlHelper.table(clazz);
-		GlobalConfiguration globalConfiguration = GlobalConfiguration.GlobalConfig(tableInfo.getConfigMark());
-		this.sqlSessionFactory = globalConfiguration.getSqlSessionFactory();
+		this.clazz = clazz;
 	}
 
 	public boolean insert(String sql, Object... args) {
@@ -97,6 +98,7 @@ public class SqlRunner {
 		return SqlHelper.getObject(selectList(sql, args));
 	}
 
+	@SuppressWarnings({ "unchecked", "rawtypes" })
 	public Page<Map<String, Object>> selectPage(Page page, String sql, Object... args) {
 		if (null == page) {
 			return null;
@@ -134,7 +136,7 @@ public class SqlRunner {
 	 * <p/>
 	 */
 	private SqlSession sqlSession() {
-		return sqlSessionFactory.openSession(true);
+		return (clazz != null) ? SqlHelper.sqlSession(clazz) : GlobalConfiguration.getSqlSession(FACTORY.getConfiguration());
 	}
 
 }

+ 4 - 39
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/PaginationInterceptor.java

@@ -17,9 +17,7 @@ package com.baomidou.mybatisplus.plugins;
 
 import com.baomidou.mybatisplus.MybatisDefaultParameterHandler;
 import com.baomidou.mybatisplus.entity.CountOptimize;
-import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.plugins.pagination.DialectFactory;
-import com.baomidou.mybatisplus.plugins.pagination.IDialect;
 import com.baomidou.mybatisplus.plugins.pagination.Pagination;
 import com.baomidou.mybatisplus.toolkit.IOUtils;
 import com.baomidou.mybatisplus.toolkit.SqlUtils;
@@ -52,9 +50,7 @@ import java.util.Properties;
  * @author hubin
  * @Date 2016-01-23
  */
-@Intercepts({
-		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class,
-				ResultHandler.class }),
+@Intercepts({@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }),
 		@Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) })
 public class PaginationInterceptor implements Interceptor {
 
@@ -80,9 +76,6 @@ public class PaginationInterceptor implements Interceptor {
 				return invocation.proceed();
 			}
 
-			/* 定义数据库方言 */
-			IDialect dialect = getiDialect();
-
 			/*
 			 * <p> 禁用内存分页 </p> <p> 内存分页会查询所有结果出来处理(这个很吓人的),如果结果变化频繁这个数据还会不准。
 			 * </p>
@@ -111,9 +104,10 @@ public class PaginationInterceptor implements Interceptor {
 							page.isOptimizeCount());
 					orderBy = countOptimize.isOrderBy();
 				}
+
 				/* 执行 SQL */
 				String buildSql = SqlUtils.concatOrderBy(originalSql, page, orderBy);
-				originalSql = dialect.buildPaginationSql(buildSql, page.getOffsetCurrent(), page.getSize());
+				originalSql = DialectFactory.buildPaginationSql(page, buildSql, dialectType, dialectClazz);
 			}
 
 			/**
@@ -151,9 +145,9 @@ public class PaginationInterceptor implements Interceptor {
 			if (rowBounds instanceof Pagination) {
 				Connection connection = null;
 				try {
-					connection = mappedStatement.getConfiguration().getEnvironment().getDataSource().getConnection();
 					Pagination page = (Pagination) rowBounds;
 					if (page.isSearchCount()) {
+						connection = mappedStatement.getConfiguration().getEnvironment().getDataSource().getConnection();
 						/*
 						 * COUNT 查询,去掉 ORDER BY 优化执行 SQL
 						 */
@@ -175,35 +169,6 @@ public class PaginationInterceptor implements Interceptor {
 
 	}
 
-	/**
-	 * 获取数据库方言
-	 *
-	 * @return
-	 * @throws Exception
-	 */
-	private IDialect getiDialect() throws Exception {
-		IDialect dialect = null;
-		if (StringUtils.isNotEmpty(dialectType)) {
-			dialect = DialectFactory.getDialectByDbtype(dialectType);
-		} else {
-			if (StringUtils.isNotEmpty(dialectClazz)) {
-				try {
-					Class<?> clazz = Class.forName(dialectClazz);
-					if (IDialect.class.isAssignableFrom(clazz)) {
-						dialect = (IDialect) clazz.newInstance();
-					}
-				} catch (ClassNotFoundException e) {
-					throw new MybatisPlusException("Class :" + dialectClazz + " is not found");
-				}
-			}
-		}
-		/* 未配置方言则抛出异常 */
-		if (dialect == null) {
-			throw new MybatisPlusException("The value of the dialect property in mybatis configuration.xml is not defined.");
-		}
-		return dialect;
-	}
-
 	/**
 	 * 查询总记录条数
 	 *

+ 1 - 3
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/PerformanceInterceptor.java

@@ -48,9 +48,7 @@ import com.baomidou.mybatisplus.toolkit.SystemClock;
  * @author hubin
  * @Date 2016-07-07
  */
-@Intercepts({
-		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class,
-				ResultHandler.class }),
+@Intercepts({@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }),
 		@Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
 public class PerformanceInterceptor implements Interceptor {
 

+ 73 - 10
mybatis-plus/src/main/java/com/baomidou/mybatisplus/plugins/pagination/DialectFactory.java

@@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.plugins.pagination.dialects.PostgreDialect;
 import com.baomidou.mybatisplus.plugins.pagination.dialects.SQLServer2005Dialect;
 import com.baomidou.mybatisplus.plugins.pagination.dialects.SQLServerDialect;
 import com.baomidou.mybatisplus.plugins.pagination.dialects.SQLiteDialect;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
 
 /**
  * <p>
@@ -37,6 +38,67 @@ import com.baomidou.mybatisplus.plugins.pagination.dialects.SQLiteDialect;
  */
 public class DialectFactory {
 
+	// 数据库方言
+	private static IDialect dialect = null;
+
+	/**
+	 * <p>
+	 * 生成翻页执行 SQL
+	 * </p>
+	 * 
+	 * @param page
+	 *            翻页对象
+	 * @param buildSql
+	 *            执行 SQL
+	 * @param dialectType
+	 *            方言类型
+	 * @param dialectClazz
+	 *            自定义方言实现类
+	 * @return
+	 * @throws Exception
+	 */
+	public static String buildPaginationSql(Pagination page, String buildSql, String dialectType, String dialectClazz)
+			throws Exception {
+		if (null == dialect) {
+			dialect = getiDialect(dialectType, dialectClazz);
+		}
+		return dialect.buildPaginationSql(buildSql, page.getOffset(), page.getLimit());
+	}
+
+	/**
+	 * <p>
+	 * 获取数据库方言
+	 * </p>
+	 * 
+	 * @param dialectType
+	 *            方言类型
+	 * @param dialectClazz
+	 *            自定义方言实现类
+	 * @return
+	 * @throws Exception
+	 */
+	private static IDialect getiDialect(String dialectType, String dialectClazz) throws Exception {
+		if (StringUtils.isNotEmpty(dialectType)) {
+			dialect = getDialectByDbtype(dialectType);
+		} else {
+			if (StringUtils.isNotEmpty(dialectClazz)) {
+				try {
+					Class<?> clazz = Class.forName(dialectClazz);
+					if (IDialect.class.isAssignableFrom(clazz)) {
+						dialect = (IDialect) clazz.newInstance();
+					}
+				} catch (ClassNotFoundException e) {
+					throw new MybatisPlusException("Class :" + dialectClazz + " is not found");
+				}
+			}
+		}
+		/* 未配置方言则抛出异常 */
+		if (dialect == null) {
+			throw new MybatisPlusException("The value of the dialect property in mybatis configuration.xml is not defined.");
+		}
+		return dialect;
+	}
+
 	/**
 	 * <p>
 	 * 根据数据库类型选择不同分页方言
@@ -47,28 +109,29 @@ public class DialectFactory {
 	 * @return
 	 * @throws Exception
 	 */
-	public static IDialect getDialectByDbtype(String dbtype) throws Exception {
+	private static IDialect getDialectByDbtype(String dbtype) throws Exception {
 		if (DBType.MYSQL.getDb().equalsIgnoreCase(dbtype)) {
-			return new MySqlDialect();
+			dialect = new MySqlDialect();
 		} else if (DBType.ORACLE.getDb().equalsIgnoreCase(dbtype)) {
-			return new OracleDialect();
+			dialect = new OracleDialect();
 		} else if (DBType.DB2.getDb().equalsIgnoreCase(dbtype)) {
-			return new DB2Dialect();
+			dialect = new DB2Dialect();
 		} else if (DBType.H2.getDb().equalsIgnoreCase(dbtype)) {
-			return new H2Dialect();
+			dialect = new H2Dialect();
 		} else if (DBType.SQLSERVER.getDb().equalsIgnoreCase(dbtype)) {
-			return new SQLServerDialect();
+			dialect = new SQLServerDialect();
 		} else if (DBType.SQLSERVER2005.getDb().equalsIgnoreCase(dbtype)) {
-			return new SQLServer2005Dialect();
+			dialect = new SQLServer2005Dialect();
 		} else if (DBType.POSTGRE.getDb().equalsIgnoreCase(dbtype)) {
-			return new PostgreDialect();
+			dialect = new PostgreDialect();
 		} else if (DBType.HSQL.getDb().equalsIgnoreCase(dbtype)) {
-			return new HSQLDialect();
+			dialect = new HSQLDialect();
 		} else if (DBType.SQLITE.getDb().equalsIgnoreCase(dbtype)) {
-			return new SQLiteDialect();
+			dialect = new SQLiteDialect();
 		} else {
 			throw new MybatisPlusException("The database is not supported!dbtype:" + dbtype);
 		}
+		return dialect;
 	}
 
 }

+ 1 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/service/IService.java

@@ -45,7 +45,7 @@ public interface IService<T> {
 
 	/**
 	 * <p>
-	 * 插入(批量),该方法不适合 Oracle
+	 * 插入(批量)
 	 * </p>
 	 *
 	 * @param entityList

+ 31 - 26
mybatis-plus/src/main/java/com/baomidou/mybatisplus/service/impl/ServiceImpl.java

@@ -15,8 +15,17 @@
  */
 package com.baomidou.mybatisplus.service.impl;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.session.SqlSession;
+import org.springframework.beans.factory.annotation.Autowired;
+
 import com.baomidou.mybatisplus.entity.TableInfo;
-import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.enums.SqlMethod;
 import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.baomidou.mybatisplus.mapper.SqlHelper;
@@ -28,14 +37,6 @@ import com.baomidou.mybatisplus.toolkit.MapUtils;
 import com.baomidou.mybatisplus.toolkit.ReflectionKit;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
-import org.apache.ibatis.session.SqlSession;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
 
 /**
  * <p>
@@ -66,6 +67,16 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
 		return SqlHelper.sqlSessionBatch(currentModleClass());
 	}
 
+	/**
+	 * 获取SqlStatement
+	 *
+	 * @param sqlMethod
+	 * @return
+	 */
+	protected String sqlStatement(SqlMethod sqlMethod) {
+		return SqlHelper.table(currentModleClass()).getSqlStatement(sqlMethod.getMethod());
+	}
+
 	/**
 	 * <p>
 	 * 判断数据库操作是否成功
@@ -100,16 +111,14 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
 				if (StringUtils.checkValNull(idVal)) {
 					return insert(entity);
 				} else {
-					/* 特殊处理 INPUT 主键策略逻辑 */
-					if (IdType.INPUT == tableInfo.getIdType()) {
-						T entityValue = selectById((Serializable) idVal);
-						if (null != entityValue) {
-							return updateById(entity);
-						} else {
-							return insert(entity);
-						}
+					/*
+					 * 更新成功直接返回,失败执行插入逻辑
+					 */
+					boolean rlt = updateById(entity);
+					if (!rlt) {
+						return insert(entity);
 					}
-					return updateById(entity);
+					return rlt;
 				}
 			} else {
 				throw new MybatisPlusException("Error:  Can not execute. Could not find @TableId.");
@@ -166,7 +175,7 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
 		try {
 			int size = entityList.size();
 			for (int i = 0; i < size; i++) {
-				baseMapper.insert(entityList.get(i));
+				batchSqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE), entityList.get(i));
 				if (i % batchSize == 0) {
 					batchSqlSession.flushStatements();
 				}
@@ -215,7 +224,7 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
 		try {
 			int size = entityList.size();
 			for (int i = 0; i < size; i++) {
-				baseMapper.updateById(entityList.get(i));
+				batchSqlSession.update(sqlStatement(SqlMethod.UPDATE_BY_ID), entityList.get(i));
 				if (i % 30 == 0) {
 					batchSqlSession.flushStatements();
 				}
@@ -275,17 +284,13 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
 
 	@SuppressWarnings({ "rawtypes", "unchecked" })
 	public Page<Map<String, Object>> selectMapsPage(Page page, Wrapper<T> wrapper) {
-		if (null != wrapper) {
-			wrapper.orderBy(page.getOrderByField(), page.isAsc());
-		}
+		SqlHelper.fillWrapper(page, wrapper);
 		page.setRecords(baseMapper.selectMapsPage(page, wrapper));
 		return page;
 	}
 
 	public Page<T> selectPage(Page<T> page, Wrapper<T> wrapper) {
-		if (null != wrapper) {
-			wrapper.orderBy(page.getOrderByField(), page.isAsc());
-		}
+		SqlHelper.fillWrapper(page, wrapper);
 		page.setRecords(baseMapper.selectPage(page, wrapper));
 		return page;
 	}

+ 20 - 14
mybatis-plus/src/main/java/com/baomidou/mybatisplus/spring/MybatisMapperRefresh.java

@@ -38,7 +38,12 @@ import org.springframework.util.ResourceUtils;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * <p>
@@ -83,7 +88,7 @@ public class MybatisMapperRefresh implements Runnable {
 	private static Map<String, List<Resource>> jarMapper = new HashMap<String, List<Resource>>();
 
 	public MybatisMapperRefresh(Resource[] mapperLocations, SqlSessionFactory sqlSessionFactory, int delaySeconds,
-								int sleepSeconds, boolean enabled) {
+			int sleepSeconds, boolean enabled) {
 		this.mapperLocations = mapperLocations;
 		this.sqlSessionFactory = sqlSessionFactory;
 		this.delaySeconds = delaySeconds;
@@ -102,7 +107,7 @@ public class MybatisMapperRefresh implements Runnable {
 	}
 
 	public void run() {
-		final GlobalConfiguration mybatisGlobalCache = GlobalConfiguration.GlobalConfig(configuration);
+		final GlobalConfiguration globalConfig = GlobalConfiguration.getGlobalConfig(configuration);
 		/*
 		 * 启动 XML 热加载
 		 */
@@ -145,7 +150,7 @@ public class MybatisMapperRefresh implements Runnable {
 							for (String filePath : fileSet) {
 								File file = new File(filePath);
 								if (file != null && file.isFile() && file.lastModified() > beforeTime) {
-									mybatisGlobalCache.setRefresh(true);
+									globalConfig.setRefresh(true);
 									List<Resource> removeList = jarMapper.get(filePath);
 									if (removeList != null && !removeList.isEmpty()) {// 如果是jar包中的xml,将刷新jar包中存在的所有xml,后期再修改加载jar中修改过后的xml
 										for (Resource resource : removeList) {
@@ -156,10 +161,10 @@ public class MybatisMapperRefresh implements Runnable {
 									}
 								}
 							}
-							if (mybatisGlobalCache.isRefresh()) {
+							if (globalConfig.isRefresh()) {
 								beforeTime = SystemClock.now();
 							}
-							mybatisGlobalCache.setRefresh(true);
+							globalConfig.setRefresh(true);
 						} catch (Exception exception) {
 							exception.printStackTrace();
 						}
@@ -239,20 +244,21 @@ public class MybatisMapperRefresh implements Runnable {
 			String id = resultMapNode.getStringAttribute("id", resultMapNode.getValueBasedIdentifier());
 			configuration.getResultMapNames().remove(id);
 			configuration.getResultMapNames().remove(namespace + "." + id);
-			clearResultMap(resultMapNode,namespace);
+			clearResultMap(resultMapNode, namespace);
 		}
 	}
 
-	private void clearResultMap(XNode xNode,String namespace){
+	private void clearResultMap(XNode xNode, String namespace) {
 		for (XNode resultChild : xNode.getChildren()) {
-			if ("association".equals(resultChild.getName())
-					|| "collection".equals(resultChild.getName())
+			if ("association".equals(resultChild.getName()) || "collection".equals(resultChild.getName())
 					|| "case".equals(resultChild.getName())) {
 				if (resultChild.getStringAttribute("select") == null) {
-					configuration.getResultMapNames().remove(resultChild.getStringAttribute("id",resultChild.getValueBasedIdentifier()));
-					configuration.getResultMapNames().remove(namespace+"."+resultChild.getStringAttribute("id",resultChild.getValueBasedIdentifier()));
-					if(resultChild.getChildren()!=null&&!resultChild.getChildren().isEmpty()){
-						clearResultMap(resultChild,namespace);
+					configuration.getResultMapNames().remove(
+							resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
+					configuration.getResultMapNames().remove(
+							namespace + "." + resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
+					if (resultChild.getChildren() != null && !resultChild.getChildren().isEmpty()) {
+						clearResultMap(resultChild, namespace);
 					}
 				}
 			}

+ 7 - 4
mybatis-plus/src/main/java/com/baomidou/mybatisplus/spring/MybatisSqlSessionFactoryBean.java

@@ -284,7 +284,7 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
 
 	/**
 	 * Set a customized MyBatis configuration.
-	 * 
+	 *
 	 * @param configuration
 	 *            MyBatis configuration
 	 * @since 1.3.0
@@ -518,7 +518,7 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
 		}
 
 		if (this.databaseIdProvider != null) {// fix #64 set databaseId before
-												// parse mapper xmls
+			// parse mapper xmls
 			try {
 				configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource));
 			} catch (SQLException e) {
@@ -556,11 +556,15 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
 		SqlRunner.FACTORY = sqlSessionFactory;
 		// TODO 缓存 sqlSessionFactory
 		globalConfig.setSqlSessionFactory(sqlSessionFactory);
+		// TODO 设置全局参数属性
+		globalConfig.signGlobalConfig(sqlSessionFactory);
+
 		if (!isEmpty(this.mapperLocations)) {
 			for (Resource mapperLocation : this.mapperLocations) {
 				if (mapperLocation == null) {
 					continue;
 				}
+
 				try {
 					// TODO
 					MybatisXMLMapperBuilder xmlMapperBuilder = new MybatisXMLMapperBuilder(mapperLocation.getInputStream(),
@@ -581,8 +585,7 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
 				LOGGER.debug("Property 'mapperLocations' was not specified or no matching resources found");
 			}
 		}
-		// TODO 设置全局参数属性
-		return globalConfig.signGlobalConfig(sqlSessionFactory);
+		return sqlSessionFactory;
 	}
 
 	/**

+ 73 - 11
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/ReflectionKit.java

@@ -18,14 +18,21 @@ package com.baomidou.mybatisplus.toolkit;
 import com.baomidou.mybatisplus.entity.TableFieldInfo;
 import com.baomidou.mybatisplus.entity.TableInfo;
 import com.baomidou.mybatisplus.enums.FieldStrategy;
+import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -36,6 +43,7 @@ import java.util.List;
  * @Date 2016-09-22
  */
 public class ReflectionKit {
+
 	private static final Log logger = LogFactory.getLog(ReflectionKit.class);
 
 	/**
@@ -70,19 +78,23 @@ public class ReflectionKit {
 	 * @return Object
 	 */
 	public static Object getMethodValue(Class<?> cls, Object entity, String str) {
-		Object obj = null;
+		Map<String, Field> fieldMaps = getFieldMap(cls);
 		try {
-			Field field = cls.getDeclaredField(str);
-			Method method = cls.getMethod(getMethodCapitalize(field, str));
-			obj = method.invoke(entity);
+			if (MapUtils.isEmpty(fieldMaps)) {
+				throw new MybatisPlusException(
+						String.format("Error: NoSuchField in %s for %s.  Cause:", cls.getSimpleName(), str));
+			}
+			Method method = cls.getMethod(getMethodCapitalize(fieldMaps.get(str), str));
+			return method.invoke(entity);
 		} catch (NoSuchMethodException e) {
-			logger.warn(String.format("Warn: No such method. in %s.  Cause:", cls.getSimpleName()) + e);
+			throw new MybatisPlusException(String.format("Error: NoSuchMethod in %s.  Cause:", cls.getSimpleName()) + e);
 		} catch (IllegalAccessException e) {
-			logger.warn(String.format("Warn: Cannot execute a private method. in %s.  Cause:", cls.getSimpleName()) + e);
-		} catch (Exception e) {
-			logger.warn("Warn: Unexpected exception on getMethodValue.  Cause:" + e);
+			throw new MybatisPlusException(String.format("Error: Cannot execute a private method. in %s.  Cause:",
+					cls.getSimpleName())
+					+ e);
+		} catch (InvocationTargetException e) {
+			throw new MybatisPlusException("Error: InvocationTargetException on getMethodValue.  Cause:" + e);
 		}
-		return obj;
 	}
 
 	/**
@@ -115,8 +127,7 @@ public class ReflectionKit {
 		Class<?> cls = bean.getClass();
 		TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
 		if (null == tableInfo) {
-			logger.warn("Warn: Could not find @TableId.");
-			return false;
+			throw new MybatisPlusException(String.format("Error: Could Not find %s in TableInfo Cache. ", cls.getSimpleName()));
 		}
 		boolean result = false;
 		List<TableFieldInfo> fieldList = tableInfo.getFieldList();
@@ -173,4 +184,55 @@ public class ReflectionKit {
 		return (Class) params[index];
 	}
 
+	/**
+	 * 获取该类的所有属性列表
+	 *
+	 * @param clazz
+	 *            反射类
+	 * @return
+	 */
+	public static Map<String, Field> getFieldMap(Class<?> clazz) {
+		List<Field> fieldList = getFieldList(clazz);
+		Map<String, Field> fieldMap = Collections.emptyMap();
+		if (CollectionUtils.isNotEmpty(fieldList)) {
+			fieldMap = new LinkedHashMap<String, Field>();
+			for (Field field : fieldList) {
+				fieldMap.put(field.getName(), field);
+			}
+		}
+		return fieldMap;
+	}
+
+	/**
+	 * 获取该类的所有属性列表
+	 *
+	 * @param clazz
+	 *            反射类
+	 * @return
+	 */
+	public static List<Field> getFieldList(Class<?> clazz) {
+		if (null == clazz) {
+			return null;
+		}
+		List<Field> fieldList = new LinkedList<Field>();
+		Field[] fields = clazz.getDeclaredFields();
+		for (Field field : fields) {
+			/* 过滤静态属性 */
+			if (Modifier.isStatic(field.getModifiers())) {
+				continue;
+			}
+			/* 过滤 transient关键字修饰的属性 */
+			if (Modifier.isTransient(field.getModifiers())) {
+				continue;
+			}
+			fieldList.add(field);
+		}
+		/* 处理父类字段 */
+		Class<?> superClass = clazz.getSuperclass();
+		if (superClass.equals(Object.class)) {
+			return fieldList;
+		}
+		fieldList.addAll(getFieldList(superClass));
+		return fieldList;
+	}
 }

+ 1 - 1
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/SQLFormatter.java → mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/SqlFormatter.java

@@ -21,7 +21,7 @@ import java.util.StringTokenizer;
  * @author Gavin King
  * @author Steve Ebersole
  */
-public class SQLFormatter {
+public class SqlFormatter {
 
 	private static final Set<String> BEGIN_CLAUSES = new HashSet<String>();
 	private static final Set<String> END_CLAUSES = new HashSet<String>();

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

@@ -28,7 +28,7 @@ import com.baomidou.mybatisplus.plugins.pagination.Pagination;
  * @Date 2016-11-13
  */
 public class SqlUtils {
-	private final static SQLFormatter sqlFormatter = new SQLFormatter();
+	private final static SqlFormatter sqlFormatter = new SqlFormatter();
 	public static final String SQL_BASE_COUNT = "SELECT COUNT(1) FROM ( %s ) TOTAL";
 
 	/**

+ 69 - 3
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/StringUtils.java

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.toolkit;
 
+import com.baomidou.mybatisplus.enums.SqlLike;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -23,8 +25,6 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import com.baomidou.mybatisplus.enums.SqlLike;
-
 /**
  * <p>
  * String 工具类
@@ -241,7 +241,7 @@ public class StringUtils {
 	 */
 	public static String quotaMark(Object obj) {
 		String srcStr = String.valueOf(obj);
-		if (obj instanceof String) {
+		if (obj instanceof CharSequence) {
 			// fix #79
 			return StringEscape.escapeString(srcStr);
 		}
@@ -266,6 +266,9 @@ public class StringUtils {
 		case RIGHT:
 			builder.append(str).append("%");
 			break;
+		case CUSTOM:
+			builder.append(str);
+			break;
 		default:
 			builder.append("%").append(str).append("%");
 		}
@@ -369,6 +372,41 @@ public class StringUtils {
 		return !checkValNotNull(object);
 	}
 
+	/**
+	 * <p>
+	 * 包含大写字母
+	 * </p>
+	 * 
+	 * @param word
+	 *            待判断字符串
+	 * @return
+	 */
+	public static boolean containsUpperCase(String word) {
+		for (int i = 0; i < word.length(); i++) {
+			char c = word.charAt(i);
+			if (Character.isUpperCase(c)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * <p>
+	 * 是否为大写命名
+	 * </p>
+	 * 
+	 * @param word
+	 *            待判断字符串
+	 * @return
+	 */
+	public static boolean isCapitalMode(String word) {
+		if (null == word) {
+			return false;
+		}
+		return word.matches("^[0-9A-Z/_]+$");
+	}
+
 	/**
 	 * <p>
 	 * Check if a String ends with a specified suffix.
@@ -602,4 +640,32 @@ public class StringUtils {
 		return list;
 	}
 
+	/**
+	 * 是否为CharSequence类型
+	 *
+	 * @param cls
+	 * @return
+	 */
+	public static Boolean isCharSequence(Class<?> cls) {
+		if (cls != null) {
+			return CharSequence.class.isAssignableFrom(cls);
+		}
+		return false;
+	}
+
+	/**
+	 * 是否为CharSequence类型
+	 *
+	 * @param propertyType
+	 * @return
+	 */
+	public static Boolean isCharSequence(String propertyType) {
+		Class<?> cls = null;
+		try {
+			cls = Class.forName(propertyType);
+		} catch (ClassNotFoundException e) {
+			//
+		}
+		return isCharSequence(cls);
+	}
 }

+ 14 - 31
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/TableInfoHelper.java

@@ -32,9 +32,8 @@ import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.SqlSessionFactory;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
 import java.util.ArrayList;
-import java.util.LinkedList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -50,7 +49,6 @@ import java.util.concurrent.ConcurrentHashMap;
 public class TableInfoHelper {
 
 	private static final Log logger = LogFactory.getLog(TableInfoHelper.class);
-
 	/**
 	 * 缓存反射类表信息
 	 */
@@ -92,7 +90,7 @@ public class TableInfoHelper {
 		if (null != builderAssistant) {
 			tableInfo.setCurrentNamespace(builderAssistant.getCurrentNamespace());
 			tableInfo.setConfigMark(builderAssistant.getConfiguration());
-			globalCache = GlobalConfiguration.GlobalConfig(builderAssistant.getConfiguration());
+			globalCache = GlobalConfiguration.getGlobalConfig(builderAssistant.getConfiguration());
 		} else {
 			// 兼容测试场景
 			globalCache = GlobalConfiguration.DEFAULT;
@@ -331,34 +329,19 @@ public class TableInfoHelper {
 	 * @return
 	 */
 	private static List<Field> getAllFields(Class<?> clazz) {
-		List<Field> result = new LinkedList<Field>();
-		Field[] fields = clazz.getDeclaredFields();
-		for (Field field : fields) {
-
-			/* 过滤静态属性 */
-			if (Modifier.isStatic(field.getModifiers())) {
-				continue;
-			}
-
-			/* 过滤 transient关键字修饰的属性 */
-			if (Modifier.isTransient(field.getModifiers())) {
-				continue;
-			}
-
-			/* 过滤注解非表字段属性 */
-			TableField tableField = field.getAnnotation(TableField.class);
-			if (tableField == null || tableField.exist()) {
-				result.add(field);
+		List<Field> fieldList = ReflectionKit.getFieldList(clazz);
+		if (CollectionUtils.isNotEmpty(fieldList)) {
+			Iterator<Field> iterator = fieldList.iterator();
+			while (iterator.hasNext()) {
+				Field field = iterator.next();
+				/* 过滤注解非表字段属性 */
+				TableField tableField = field.getAnnotation(TableField.class);
+				if (tableField != null && !tableField.exist()) {
+					iterator.remove();
+				}
 			}
 		}
-
-		/* 处理父类字段 */
-		Class<?> superClass = clazz.getSuperclass();
-		if (superClass.equals(Object.class)) {
-			return result;
-		}
-		result.addAll(getAllFields(superClass));
-		return result;
+		return fieldList;
 	}
 
 	/**
@@ -369,7 +352,7 @@ public class TableInfoHelper {
 	 */
 	public static void initSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
 		Configuration configuration = sqlSessionFactory.getConfiguration();
-		GlobalConfiguration globalConfig = GlobalConfiguration.GlobalConfig(configuration);
+		GlobalConfiguration globalConfig = GlobalConfiguration.getGlobalConfig(configuration);
 		// SqlRunner
 		SqlRunner.FACTORY = sqlSessionFactory;
 		if (globalConfig == null) {

+ 15 - 29
mybatis-plus/src/main/resources/template/entity.java.vm

@@ -1,43 +1,31 @@
 package ${package.Entity};
 
-#if(${superEntityClassPackage})
-import ${superEntityClassPackage};
-#end
-#foreach($field in ${table.fields})
-#foreach($javaType in ${field.javaType})
-import ${javaType}
-#end
-#end
 #if(${activeRecord})
 import com.baomidou.mybatisplus.activerecord.Model;
 #end
-#if(!${dbColumnUnderline})
-import com.baomidou.mybatisplus.annotations.TableId;
-import com.baomidou.mybatisplus.annotations.TableField;
-#end
-#if(${tabeAnnotation})
-import com.baomidou.mybatisplus.annotations.TableName;
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
 #end
 import java.io.Serializable;
+
+
 /**
- #if("$!table.comment" != "")* <p>
+ * <p>
  * ${table.comment}
  * </p>
- #end*
+ *
  * @author ${author}
  * @since ${date}
  */
-#if(${tabeAnnotation})
+#if(${table.convert})
 @TableName("${table.name}")
 #end
 #if(${superEntityClass})
-public class ${entity} extends ${superEntityClass} {
-#else
-#if(${activeRecord})
+public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
 public class ${entity} extends Model<${entity}> {
 #else
 public class ${entity} implements Serializable {
-#end
 #end
 
     private static final long serialVersionUID = 1L;
@@ -47,17 +35,15 @@ public class ${entity} implements Serializable {
 #set($keyPropertyName=${field.propertyName})
 #end
 #if("$!field.comment" != "")
-	/**
-	 * ${field.comment}
-	 */
+    /**
+     * ${field.comment}
+     */
 #end
+#if(${field.convert})
 #if(${field.keyFlag})
-	@TableId#if(${field.convert})(value="${field.name}")
-#end
-
+	@TableId("${field.name}")
 #else
-#if(${field.convert})
-	@TableField(value="${field.name}")
+	@TableField("${field.name}")
 #end
 #end
 	private ${field.propertyType} ${field.propertyName};

+ 1 - 1
mybatis-plus/src/main/resources/template/mapper.java.vm

@@ -5,7 +5,7 @@ import ${superMapperClassPackage};
 
 /**
  * <p>
- * Mapper接口
+  * ${table.comment} Mapper 接口
  * </p>
  *
  * @author ${author}

+ 5 - 2
mybatis-plus/src/main/resources/template/mapper.xml.vm

@@ -10,9 +10,12 @@
 	<!-- 通用查询映射结果 -->
 	<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
 #foreach($field in ${table.fields})
-#if(${field.keyFlag})
+#if(${field.keyFlag})##生成主键排在第一位
 		<id column="${field.name}" property="${field.propertyName}" />
-#else
+#end
+#end
+#foreach($field in ${table.fields})
+#if(!${field.keyFlag})##生成普通字段
 		<result column="${field.name}" property="${field.propertyName}" />
 #end
 #end

+ 1 - 1
mybatis-plus/src/main/resources/template/service.java.vm

@@ -5,7 +5,7 @@ import ${superServiceClassPackage};
 
 /**
  * <p>
- * ${table.comment}  服务类
+ * ${table.comment} 服务类
  * </p>
  *
  * @author ${author}

+ 1 - 1
mybatis-plus/src/main/resources/template/serviceImpl.java.vm

@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
 
 /**
  * <p>
- * ${table.comment}  服务实现类
+ * ${table.comment} 服务实现类
  * </p>
  *
  * @author ${author}

+ 12 - 13
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/GlobalConfigurationTest.java

@@ -15,24 +15,23 @@
  */
 package com.baomidou.mybatisplus.test;
 
-import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
-import com.baomidou.mybatisplus.entity.GlobalConfiguration;
-import com.baomidou.mybatisplus.mapper.Condition;
-import com.baomidou.mybatisplus.test.mysql.NotPKMapper;
-import com.baomidou.mybatisplus.test.mysql.TestMapper;
-import com.baomidou.mybatisplus.test.mysql.entity.NotPK;
-import com.baomidou.mybatisplus.test.mysql.entity.Test;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.UUID;
+
 import org.apache.commons.dbcp2.BasicDataSource;
 import org.apache.ibatis.session.RowBounds;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.junit.Assert;
 
-import java.io.InputStream;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
+import com.baomidou.mybatisplus.entity.GlobalConfiguration;
+import com.baomidou.mybatisplus.mapper.Condition;
+import com.baomidou.mybatisplus.test.mysql.entity.NotPK;
+import com.baomidou.mybatisplus.test.mysql.entity.Test;
+import com.baomidou.mybatisplus.test.mysql.mapper.NotPKMapper;
+import com.baomidou.mybatisplus.test.mysql.mapper.TestMapper;
 
 /**
  * <p>
@@ -47,6 +46,7 @@ public class GlobalConfigurationTest {
 	/**
 	 * 全局配置测试
 	 */
+	@SuppressWarnings("unchecked")
 	public static void main(String[] args) {
         GlobalConfiguration global = GlobalConfiguration.defaults();
         global.setAutoSetDbType(true);
@@ -66,7 +66,6 @@ public class GlobalConfigurationTest {
 		SqlSessionFactory sessionFactory = factoryBuilder.build(inputStream);
 		SqlSession session = sessionFactory.openSession(false);
 		TestMapper testMapper = session.getMapper(TestMapper.class);
-        List<Map<String, Object>> list = testMapper.selectMaps(null);
         Test test = new Test();
 		test.setCreateTime(new Date());
 		// 开启全局校验字符串会忽略空字符串

+ 8 - 9
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/MybatisMapperRefreshTest.java

@@ -15,22 +15,21 @@
  */
 package com.baomidou.mybatisplus.test;
 
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
-
 import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
 import com.baomidou.mybatisplus.entity.GlobalConfiguration;
 import com.baomidou.mybatisplus.plugins.pagination.Pagination;
 import com.baomidou.mybatisplus.spring.MybatisMapperRefresh;
 import com.baomidou.mybatisplus.test.mysql.MySqlInjector;
-import com.baomidou.mybatisplus.test.mysql.UserMapper;
 import com.baomidou.mybatisplus.test.mysql.UserMapperTest;
+import com.baomidou.mybatisplus.test.mysql.mapper.UserMapper;
 import com.baomidou.mybatisplus.toolkit.SystemClock;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+
+import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * <p>

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/activerecord/ActiveRecordTest.java

@@ -24,8 +24,8 @@ import org.apache.ibatis.session.SqlSessionFactory;
 
 import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
 import com.baomidou.mybatisplus.plugins.Page;
-import com.baomidou.mybatisplus.test.mysql.TestMapper;
 import com.baomidou.mybatisplus.test.mysql.entity.Test;
+import com.baomidou.mybatisplus.test.mysql.mapper.TestMapper;
 import com.baomidou.mybatisplus.toolkit.IdWorker;
 import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 

+ 37 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/MyFieldTypeConvert.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2011-2016, hubin (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.test.generator;
+
+import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+
+/**
+ * <p>
+ * 测试字段类型转换
+ * </p>
+ *
+ * @author hubin
+ * @date 2017-01-20
+ */
+public class MyFieldTypeConvert extends MySqlTypeConvert {
+
+	@Override
+	public DbColumnType processTypeConvert(String fieldType) {
+		System.out.println("转换类型:" + fieldType);
+		return super.processTypeConvert(fieldType);
+	}
+
+}

+ 20 - 3
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/MysqlGenerator.java

@@ -15,15 +15,19 @@
  */
 package com.baomidou.mybatisplus.test.generator;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.FileOutConfig;
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.PackageConfig;
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.rules.DbType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 
@@ -49,7 +53,7 @@ public class MysqlGenerator {
 		GlobalConfig gc = new GlobalConfig();
 		gc.setOutputDir("/home/nieqiurong/");
 		gc.setFileOverride(true);
-		gc.setActiveRecord(true);
+		gc.setActiveRecord(true);// 开启 activeRecord 模式
 		gc.setEnableCache(false);// XML 二级缓存
 		gc.setBaseResultMap(true);// XML ResultMap
 		gc.setBaseColumnList(false);// XML columList
@@ -66,6 +70,7 @@ public class MysqlGenerator {
 		// 数据源配置
 		DataSourceConfig dsc = new DataSourceConfig();
 		dsc.setDbType(DbType.MYSQL);
+		dsc.setTypeConvert(new MyFieldTypeConvert());
 		dsc.setDriverName("com.mysql.jdbc.Driver");
 		dsc.setUsername("nieqiurong");
 		dsc.setPassword("nieqiurong");
@@ -74,9 +79,10 @@ public class MysqlGenerator {
 
 		// 策略配置
 		StrategyConfig strategy = new StrategyConfig();
+		// strategy.setCapitalMode(true);// 全局大写命名
 		// strategy.setDbColumnUnderline(true);//全局下划线命名
-		strategy.setTablePrefix("bmd_");// 此处可以修改为您的表前缀
-		strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
+		strategy.setTablePrefix(new String[] { "bmd_", "mp_" });// 此处可以修改为您的表前缀
+		strategy.setNaming(NamingStrategy.remove_prefix_and_camel);// 表名生成策略
 		// strategy.setInclude(new String[] { "user" }); // 需要生成的表
 		// strategy.setExclude(new String[]{"test"}); // 排除生成的表
 		// 字段名生成策略
@@ -104,6 +110,8 @@ public class MysqlGenerator {
 		// 包配置
 		PackageConfig pc = new PackageConfig();
 		pc.setModuleName("test");
+		pc.setParent("com.baomidou");// 自定义包路径
+		pc.setController("controller");// 这里是控制器包名,默认 web
 		mpg.setPackageInfo(pc);
 
 		// 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
@@ -115,6 +123,15 @@ public class MysqlGenerator {
 				this.setMap(map);
 			}
 		};
+		List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
+		focList.add(new FileOutConfig("/template/entity.java.vm") {
+			@Override
+			public String outputFile(TableInfo tableInfo) {
+				// 自定义输入文件名称
+				return "D://my_" + tableInfo.getEntityName() + ".java";
+			}
+		});
+		cfg.setFileOutConfigList(focList);
 		mpg.setCfg(cfg);
 
 		// 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy

+ 30 - 16
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/PostgreSQLGenerator.java

@@ -1,14 +1,18 @@
 package com.baomidou.mybatisplus.test.generator;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.FileOutConfig;
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.PackageConfig;
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.rules.DbType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 
@@ -24,7 +28,7 @@ public class PostgreSQLGenerator {
         GlobalConfig gc = new GlobalConfig();
         gc.setOutputDir("D://");
         gc.setFileOverride(true);
-        gc.setActiveRecord(true);
+        gc.setActiveRecord(true);// 开启 activeRecord 模式
         gc.setEnableCache(false);// XML 二级缓存
         gc.setBaseResultMap(true);// XML ResultMap
         gc.setBaseColumnList(false);// XML columList
@@ -49,9 +53,10 @@ public class PostgreSQLGenerator {
 
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
-        // strategy.setDbColumnUnderline(true);//全局下划线命名
-        strategy.setTablePrefix("bmd_");// 此处可以修改为您的表前缀
-        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
+		// strategy.setCapitalMode(true);// 全局大写命名
+		// strategy.setDbColumnUnderline(true);//全局下划线命名
+        strategy.setTablePrefix(new String[]{"bmd_", "mp_"});// 此处可以修改为您的表前缀
+        strategy.setNaming(NamingStrategy.remove_prefix_and_camel);// 表名生成策略
         // strategy.setInclude(new String[] { "user" }); // 需要生成的表
         // strategy.setExclude(new String[]{"test"}); // 排除生成的表
         // 字段名生成策略
@@ -79,20 +84,29 @@ public class PostgreSQLGenerator {
         // 包配置
         PackageConfig pc = new PackageConfig();
         pc.setModuleName("test");
-        pc.setParent("com.baomidou");
-		pc.setController("controller");
+        pc.setParent("com.baomidou");//自定义包路径
+		pc.setController("controller");//这里是控制器包名,默认 web
         mpg.setPackageInfo(pc);
 
-        // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
-        InjectionConfig cfg = new InjectionConfig() {
-            @Override
-            public void initMap() {
-                Map<String, Object> map = new HashMap<String, Object>();
-                map.put("abc", this.getConfig().getGlobalConfig().getAuthor());
-                this.setMap(map);
-            }
-        };
-        mpg.setCfg(cfg);
+		// 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
+		InjectionConfig cfg = new InjectionConfig() {
+			@Override
+			public void initMap() {
+				Map<String, Object> map = new HashMap<String, Object>();
+				map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
+				this.setMap(map);
+			}
+		};
+		List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
+		focList.add(new FileOutConfig("/template/entity.java.vm") {
+			@Override
+			public String outputFile(TableInfo tableInfo) {
+				// 自定义输入文件名称
+				return "D://my_" + tableInfo.getEntityName() + ".java";
+			}
+		});
+		cfg.setFileOutConfigList(focList);
+		mpg.setCfg(cfg);
 
         // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
         // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:

+ 30 - 14
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/generator/SQLServerGenerator.java

@@ -3,13 +3,17 @@ package com.baomidou.mybatisplus.test.generator;
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.FileOutConfig;
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.PackageConfig;
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.rules.DbType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -24,7 +28,7 @@ public class SQLServerGenerator {
         GlobalConfig gc = new GlobalConfig();
         gc.setOutputDir("D://");
         gc.setFileOverride(true);
-        gc.setActiveRecord(true);
+        gc.setActiveRecord(true);// 开启 activeRecord 模式
         gc.setEnableCache(false);// XML 二级缓存
         gc.setBaseResultMap(true);// XML ResultMap
         gc.setBaseColumnList(false);// XML columList
@@ -49,9 +53,10 @@ public class SQLServerGenerator {
 
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
-        // strategy.setDbColumnUnderline(true);//全局下划线命名
-        strategy.setTablePrefix("bmd_");// 此处可以修改为您的表前缀
-        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
+		// strategy.setCapitalMode(true);// 全局大写命名
+		// strategy.setDbColumnUnderline(true);//全局下划线命名
+        strategy.setTablePrefix(new String[]{"bmd_", "mp_"});// 此处可以修改为您的表前缀
+        strategy.setNaming(NamingStrategy.remove_prefix_and_camel);// 表名生成策略
         // strategy.setInclude(new String[] { "user" }); // 需要生成的表
         // strategy.setExclude(new String[]{"test"}); // 排除生成的表
         // 字段名生成策略
@@ -79,18 +84,29 @@ public class SQLServerGenerator {
         // 包配置
         PackageConfig pc = new PackageConfig();
         pc.setModuleName("test");
+        pc.setParent("com.baomidou");//自定义包路径
+        pc.setController("controller");//这里是控制器包名,默认 web
         mpg.setPackageInfo(pc);
 
-        // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
-        InjectionConfig cfg = new InjectionConfig() {
-            @Override
-            public void initMap() {
-                Map<String, Object> map = new HashMap<String, Object>();
-                map.put("abc", this.getConfig().getGlobalConfig().getAuthor());
-                this.setMap(map);
-            }
-        };
-        mpg.setCfg(cfg);
+		// 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
+		InjectionConfig cfg = new InjectionConfig() {
+			@Override
+			public void initMap() {
+				Map<String, Object> map = new HashMap<String, Object>();
+				map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
+				this.setMap(map);
+			}
+		};
+		List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
+		focList.add(new FileOutConfig("/template/entity.java.vm") {
+			@Override
+			public String outputFile(TableInfo tableInfo) {
+				// 自定义输入文件名称
+				return "D://my_" + tableInfo.getEntityName() + ".java";
+			}
+		});
+		cfg.setFileOutConfigList(focList);
+		mpg.setCfg(cfg);
 
         // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
         // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:

+ 11 - 8
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/CircularLabelsTest.java

@@ -15,18 +15,21 @@
  */
 package com.baomidou.mybatisplus.test.mysql;
 
-import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
-import com.baomidou.mybatisplus.plugins.Page;
-import com.baomidou.mybatisplus.test.mysql.entity.Test;
-import com.baomidou.mybatisplus.test.mysql.entity.User;
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-
 import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+
+import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.test.mysql.entity.Test;
+import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.mysql.mapper.TestMapper;
+import com.baomidou.mybatisplus.test.mysql.mapper.UserMapper;
+
 /**
  * <p>
  * 循环标签 查询分页失效 测试类
@@ -48,7 +51,7 @@ public class CircularLabelsTest {
 		SqlSessionFactory sessionFactory = mf.build(in);
 		SqlSession session = sessionFactory.openSession();
 		UserMapper userMapper = session.getMapper(UserMapper.class);
-		Page page = new Page(1, 6);
+		Page<User> page = new Page<User>(1, 6);
 		List<User> users = userMapper.forSelect(page, Arrays.asList(new String[] { "1", "2", "3" }));
 		System.out.println(users.toString());
 		System.out.println(page);

+ 2 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/NoXMLTest.java

@@ -18,6 +18,7 @@ package com.baomidou.mybatisplus.test.mysql;
 import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.test.mysql.entity.Test;
+import com.baomidou.mybatisplus.test.mysql.mapper.TestMapper;
 import com.baomidou.mybatisplus.toolkit.IdWorker;
 import org.apache.ibatis.session.RowBounds;
 import org.apache.ibatis.session.SqlSession;
@@ -53,7 +54,7 @@ public class NoXMLTest {
 		testMapper.insert(new Test(IdWorker.getId(), "Caratacus"));
 		List<Map<String, Object>> list = testMapper.selectMaps(null);
 		List<Map<String, Object>> list1 = testMapper.selectMapsPage(RowBounds.DEFAULT, null);
-		List<Map<String, Object>> list2 = testMapper.selectMapsPage(new Page(1, 5), null);
+		List<Map<String, Object>> list2 = testMapper.selectMapsPage(new Page<Object>(1, 5), null);
 		System.out.println(list);
 		System.out.println(list1);
 		System.out.println(list2);

+ 53 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/ServiceImplTest.java

@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.test.mysql;
+
+import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.mysql.service.IUserService;
+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 java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * Service层测试
+ * </p>
+ * 
+ * @author hubin
+ * @date 2017-01-30
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration({ "classpath:spring/spring-servlet.xml" })
+public class ServiceImplTest {
+	@Autowired
+	private IUserService userService;
+
+	@Test
+	public void testInsertBatch() throws IOException {
+		List<User> userList = new ArrayList<User>();
+		for (int i = 0; i < 10; i++) {
+			userList.add(new User("u-" + i, i, i));
+		}
+		boolean batchResult = userService.insertBatch(userList);
+		System.err.println("batchResult: " + batchResult);
+	}
+}

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/SqlRunnerTest.java

@@ -69,7 +69,7 @@ public class SqlRunnerTest {
 			maps1 = null;
 		}
 		Assert.assertNull(maps1);
-		Page<Map<String, Object>> mapPage = SqlRunner.db().selectPage(new Page(1, 5), "select * from test ");
+		Page<Map<String, Object>> mapPage = SqlRunner.db().selectPage(new Page<Object>(1, 5), "select * from test ");
 		System.out.println(mapPage);
 		int i = SqlRunner.db().selectCount("select count(0) from test ");
 		System.out.println("count:" + i);

+ 1 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/TransactionalTest.java

@@ -22,6 +22,7 @@ import org.apache.ibatis.session.SqlSessionFactory;
 
 import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
 import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.mysql.mapper.UserMapper;
 import com.baomidou.mybatisplus.toolkit.IdWorker;
 
 /**

+ 2 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/URPTest.java

@@ -26,6 +26,8 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.test.mysql.entity.PhoneNumber;
 import com.baomidou.mybatisplus.test.mysql.entity.Role;
 import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.mysql.mapper.RoleMapper;
+import com.baomidou.mybatisplus.test.mysql.mapper.UserMapper;
 import com.baomidou.mybatisplus.toolkit.IdWorker;
 
 /**

+ 11 - 8
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/UserMapperTest.java

@@ -15,6 +15,15 @@
  */
 package com.baomidou.mybatisplus.test.mysql;
 
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+
 import com.baomidou.mybatisplus.MybatisSessionFactoryBuilder;
 import com.baomidou.mybatisplus.entity.GlobalConfiguration;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -22,15 +31,8 @@ import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.plugins.pagination.Pagination;
 import com.baomidou.mybatisplus.test.mysql.entity.Role;
 import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.mysql.mapper.UserMapper;
 import com.baomidou.mybatisplus.toolkit.IdWorker;
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 /**
  * <p>
@@ -85,6 +87,7 @@ public class UserMapperTest {
 		 */
 		gc.setMetaObjectHandler(new MyMetaObjectHandler());
 		// gc.setCapitalMode(true);
+		gc.setDbColumnUnderline(true);
 		mf.setGlobalConfig(gc);
 
 		SqlSessionFactory sessionFactory = mf.build(in);

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/NotPKMapper.java → mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/NotPKMapper.java

@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.baomidou.mybatisplus.test.mysql;
+package com.baomidou.mybatisplus.test.mysql.mapper;
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.baomidou.mybatisplus.test.mysql.entity.NotPK;

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/RoleMapper.java → mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/RoleMapper.java

@@ -1,4 +1,4 @@
-package com.baomidou.mybatisplus.test.mysql;
+package com.baomidou.mybatisplus.test.mysql.mapper;
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.baomidou.mybatisplus.test.mysql.entity.Role;

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/TestMapper.java → mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/TestMapper.java

@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.baomidou.mybatisplus.test.mysql;
+package com.baomidou.mybatisplus.test.mysql.mapper;
 
 import org.apache.ibatis.annotations.Insert;
 

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/UserMapper.java → mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/mapper/UserMapper.java

@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.baomidou.mybatisplus.test.mysql;
+package com.baomidou.mybatisplus.test.mysql.mapper;
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.baomidou.mybatisplus.test.mysql.entity.User;

+ 31 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/service/IUserService.java

@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.test.mysql.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.baomidou.mybatisplus.test.mysql.entity.User;
+
+/**
+ * <p>
+ * Service层测试
+ * </p>
+ * 
+ * @author hubin
+ * @date 2017-01-30
+ */
+public interface IUserService extends IService<User> {
+
+}

+ 36 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/service/impl/UserServiceImpl.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.test.mysql.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.test.mysql.entity.User;
+import com.baomidou.mybatisplus.test.mysql.mapper.UserMapper;
+import com.baomidou.mybatisplus.test.mysql.service.IUserService;
+
+/**
+ * <p>
+ * Service层测试
+ * </p>
+ * 
+ * @author hubin
+ * @date 2017-01-30
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
+
+}

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

@@ -0,0 +1,34 @@
+<?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>
+    <!-- 
+     | 全局配置设置
+     |
+     | 可配置选项                                        默认值, 描述
+     |
+     | aggressiveLazyLoading     true, 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
+     | multipleResultSetsEnabled true, 允许和不允许单条语句返回多个数据集(取决于驱动需求)
+     | useColumnLabel            true, 使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。
+     | useGeneratedKeys          false, 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。
+     | autoMappingBehavior       PARTIAL, 指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。
+     | defaultExecutorType       SIMPLE, 配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。
+     | defaultStatementTimeout   null, 设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时
+     | -->
+    <settings>
+        <!-- 这个配置使全局的映射器启用或禁用缓存 -->
+        <setting name="cacheEnabled" value="true" />
+        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
+        <setting name="lazyLoadingEnabled" value="true" />
+		<setting name="multipleResultSetsEnabled" value="true" />
+		<setting name="useColumnLabel" value="true" />
+		<setting name="defaultExecutorType" value="REUSE" />
+		<setting name="defaultStatementTimeout" value="25000" />
+	</settings>
+
+	<!-- 查询对象别名配置 -->
+	<typeAliases>
+		<!-- 
+		<typeAlias alias="userVo" type="xxx.vo.UserVo" />
+		 -->
+	</typeAliases>
+</configuration>

+ 4 - 4
mybatis-plus/src/test/resources/mysql-config.xml

@@ -109,10 +109,10 @@
      | -->
     <mappers>
         <mapper resource="mysql/RoleMapper.xml"/>
-        <mapper class="com.baomidou.mybatisplus.test.mysql.UserMapper"/>
-        <mapper class="com.baomidou.mybatisplus.test.mysql.NotPKMapper"/>
+        <mapper class="com.baomidou.mybatisplus.test.mysql.mapper.UserMapper"/>
+        <mapper class="com.baomidou.mybatisplus.test.mysql.mapper.NotPKMapper"/>
         <mapper resource="mysql/UserMapper.xml"/>
-        <mapper class="com.baomidou.mybatisplus.test.mysql.RoleMapper"/>
-        <mapper class="com.baomidou.mybatisplus.test.mysql.TestMapper"/>
+        <mapper class="com.baomidou.mybatisplus.test.mysql.mapper.RoleMapper"/>
+        <mapper class="com.baomidou.mybatisplus.test.mysql.mapper.TestMapper"/>
     </mappers>
 </configuration>

+ 5 - 5
mybatis-plus/src/test/resources/mysql/RoleMapper.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.baomidou.mybatisplus.test.mysql.RoleMapper">
-    
-    <resultMap id="RoleMap" type="Role" autoMapping="true">
-        <id property="id" column="id"/>
-    </resultMap>
+<mapper namespace="com.baomidou.mybatisplus.test.mysql.mapper.RoleMapper">
+
+	<resultMap id="RoleMap" type="Role" autoMapping="true">
+		<id property="id" column="id" />
+	</resultMap>
 </mapper>

+ 2 - 2
mybatis-plus/src/test/resources/mysql/UserMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.baomidou.mybatisplus.test.mysql.UserMapper">
+<mapper namespace="com.baomidou.mybatisplus.test.mysql.mapper.UserMapper">
 
     <!-- ehcache 缓存配置, 输出日志 http://www.mybatis.org/ehcache-cache/ -->
     <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
@@ -39,6 +39,6 @@
                 typeHandler="com.baomidou.mybatisplus.test.mysql.typehandler.PhoneTypeHandler"/>
 
         <!-- 级联查询 -->
-        <association column="role" property="role" select="com.baomidou.mybatisplus.test.mysql.RoleMapper.selectById"/>
+        <association column="role" property="role" select="com.baomidou.mybatisplus.test.mysql.mapper.RoleMapper.selectById"/>
     </resultMap>
 </mapper>

+ 5 - 0
mybatis-plus/src/test/resources/properties/jdbc.properties

@@ -0,0 +1,5 @@
+jdbc.driver=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://localhost:3306/mybatis-plus?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+jdbc.username=root
+jdbc.password=521
+validationQuery=SELECT 1

+ 98 - 0
mybatis-plus/src/test/resources/spring/spring-jdbc.xml

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
+	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
+	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
+	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
+
+	<!-- 加载配置文件 -->
+	<context:property-placeholder location="classpath:properties/jdbc.properties" />
+
+	<!-- 数据库连接池 -->
+	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
+		destroy-method="close">
+		<property name="url" value="${jdbc.url}" />
+		<property name="username" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
+		<property name="driverClassName" value="${jdbc.driver}" />
+		<!-- 初始化连接大小 -->
+		<property name="initialSize" value="0" />
+		<!-- 连接池最大使用连接数量 -->
+		<property name="maxActive" value="20" />
+		<!-- 连接池最大空闲 -->
+		<property name="maxIdle" value="20" />
+		<!-- 连接池最小空闲 -->
+		<property name="minIdle" value="0" />
+		<!-- 获取连接最大等待时间 -->
+		<property name="maxWait" value="60000" />
+		<property name="validationQuery" value="${validationQuery}" />
+		<property name="testOnBorrow" value="false" />
+		<property name="testOnReturn" value="false" />
+		<property name="testWhileIdle" value="true" />
+		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
+		<property name="timeBetweenEvictionRunsMillis" value="60000" />
+		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
+		<property name="minEvictableIdleTimeMillis" value="25200000" />
+		<!-- 打开removeAbandoned功能 -->
+		<property name="removeAbandoned" value="true" />
+		<!-- 1800秒,也就是30分钟 -->
+		<property name="removeAbandonedTimeout" value="1800" />
+		<!-- 关闭abanded连接时输出错误日志 -->
+		<property name="logAbandoned" value="true" />
+		<!-- 监控数据库 -->
+		<property name="filters" value="stat" />
+	</bean>
+
+	<!-- 事务管理器 -->
+	<bean id="transactionManager"
+		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+		<!-- 数据源 -->
+		<property name="dataSource" ref="dataSource" />
+	</bean>
+
+	<!-- 通知 -->
+	<tx:advice id="txAdvice" transaction-manager="transactionManager">
+		<tx:attributes>
+			<!-- 传播行为 -->
+			<tx:method name="save*" propagation="REQUIRED" />
+			<tx:method name="insert*" propagation="REQUIRED" />
+			<tx:method name="add*" propagation="REQUIRED" />
+			<tx:method name="create*" propagation="REQUIRED" />
+			<tx:method name="delete*" propagation="REQUIRED" />
+			<tx:method name="update*" propagation="REQUIRED" />
+			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
+			<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
+			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
+		</tx:attributes>
+	</tx:advice>
+	<!-- 切面 -->
+	<aop:config>
+		<aop:advisor advice-ref="txAdvice"
+			pointcut="execution(* com.baomidou.*.service.*.*.*(..))" />
+	</aop:config>
+
+	<!-- MyBatis SqlSessionFactoryBean 配置 -->
+	<bean id="sqlSessionFactory"
+		class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
+		<property name="dataSource" ref="dataSource" />
+		<property name="configLocation" value="classpath:mybatis-config.xml" />
+		<property name="typeAliasesPackage" value="com.baomidou.mybatisplus.test.mysql.entity" />
+		<property name="mapperLocations" value="classpath:mysql/*Mapper.xml" />
+		<property name="plugins">
+			<array>
+				<!-- 分页插件配置 -->
+				<bean id="paginationInterceptor"
+					class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
+					<property name="dialectType" value="mysql" />
+				</bean>
+			</array>
+		</property>
+	</bean>
+
+	<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+		<property name="basePackage" value="com.baomidou.mybatisplus.test.mysql.mapper" />
+	</bean>
+</beans>

+ 15 - 0
mybatis-plus/src/test/resources/spring/spring-servlet.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:mvc="http://www.springframework.org/schema/mvc"
+	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  
+           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
+
+	<context:component-scan base-package="com.baomidou.mybatisplus.test.mysql" />
+
+	<mvc:default-servlet-handler />
+
+	<import resource="classpath:spring/spring-jdbc.xml"/>
+</beans>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.