diff --git a/README.md b/README.md index a1edb62fa2fb136433d55d89f4873cca4867d568..b592a94e2e11dbe4f538bd071111010b315a2797 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# mybatis-enhance-actable-1.4.8.RELEASE +# mybatis-enhance-actable-1.4.9.RELEASE 官方文档:[ACTable官方文档地址](https://www.yuque.com/sunchenbin/actable/nfz097) @@ -8,6 +8,6 @@ ACTable技术交流QQ群:[746531106](https://jq.qq.com/?_wv=1027&k=xE4i0dWl) -A.C.Table是对Mybatis做的增强功能,支持SpringBoot以及传统的SpringMvc项目结构,简单配置即可,该框架是为了能够使习惯了hibernate框架的开发者能够快速的入手Mybatis, “A.C.Table” 本意是自动建表的意思,A.C.Table是一个基于Spring和Mybatis的Maven项目,增强了Mybatis的功能,过配置model注解的方式来创建表,修改表结构,并且实现了共通的CUDR功能提升开发效率,同时能够兼容tk.mybatis和mybatis-plus,如需使用依赖相关的pom依赖即可,目前仅支持Mysql,后续会扩展针对其他数据库的支持。 +A.C.Table是对Mybatis做的增强功能,实现了mybatis自动建表的能力,mybatis-enhance-actable支持SpringBoot以及传统的SpringMvc项目结构,简单配置即可,该框架是为了能够使习惯了hibernate框架的开发者能够快速的入手Mybatis, “A.C.Table” 本意是自动建表的意思,A.C.Table是一个基于Spring和Mybatis的Maven项目,增强了Mybatis的功能,过配置model注解的方式来创建表,修改表结构,并且实现了共通的CUDR功能提升开发效率,同时能够兼容tk.mybatis和mybatis-plus,如需使用依赖相关的pom依赖即可,目前仅支持Mysql,后续会扩展针对其他数据库的支持。 [Javadoc文档:https://apidoc.gitee.com/sunchenbin/mybatis-enhance](https://apidoc.gitee.com/sunchenbin/mybatis-enhance) diff --git a/mybatis-enhance-actable/README.md b/mybatis-enhance-actable/README.md index b4071f9793d0183c195605cda748e45042719a49..320490a438106d1e9216e41a7f6bb98299b0ac12 100644 --- a/mybatis-enhance-actable/README.md +++ b/mybatis-enhance-actable/README.md @@ -1,4 +1,4 @@ -# mybatis-enhance-actable-1.4.8.RELEASE +# mybatis-enhance-actable-1.4.9.RELEASE 官方文档:[ACTable官方文档地址](https://www.yuque.com/sunchenbin/actable/nfz097) @@ -16,13 +16,13 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 **基本使用规范** -1.需要依赖mybatis-enhance-actable-1.4.8.RELEASE.jar +1.需要依赖mybatis-enhance-actable-1.4.9.RELEASE.jar ``` com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable - 1.4.8.RELEASE + 1.4.9.RELEASE @@ -78,7 +78,7 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable - 1.4.8.RELEASE + 1.4.9.RELEASE @@ -115,7 +115,7 @@ A.C.Table是采用了Spring、Mybatis技术的Maven结构,详细介绍如下 com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable - 1.4.8.RELEASE + 1.4.9.RELEASE @@ -744,3 +744,6 @@ public class TestController{ actable.unique.prefix=自己定义的唯一约束前缀 67. 如果字段名中包含 ` 关键字会默认忽略掉,因为actable建表时自动给所有字段名增加过了,这个主要是为了避免字段名是数据库的关键字(版本1.4.8.RELEASE) 68. 修复66条自定义索引和唯一约束前缀的功能bug(版本1.4.8.RELEASE) +69. SysMysqlCreateTableManagerImpl.getAllFields方法改为public可被重写(版本1.4.9.RELEASE) +70. issues/I38G7Q:修复避免子类重写付类属性时创建重复字段报错的问题(版本1.4.9.RELEASE) +71. issues/I2CVCS:迭代优化actable.model.pack配置属性支持模糊扫描,支持类似com.bz.**.entity且支持配置多个路径英文逗号或者分号隔开(版本1.4.9.RELEASE) diff --git a/mybatis-enhance-actable/pom.xml b/mybatis-enhance-actable/pom.xml index caecf9129fe4251eec4a26b4f021448948d195f7..8297337c619345a972be2bb13e8a21b457d9119a 100644 --- a/mybatis-enhance-actable/pom.xml +++ b/mybatis-enhance-actable/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.gitee.sunchenbin.mybatis.actable mybatis-enhance-actable - 1.4.8.RELEASE + 1.4.9.RELEASE org.sonatype.oss diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java index d71dca34320d06c4f626adc393e27a7a1bcec149..7939092cd53c23c6e17c14553425ecda02e32617 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManager.java @@ -1,13 +1,17 @@ package com.gitee.sunchenbin.mybatis.actable.manager.system; +import java.util.List; + /** * * @author sunchenbin - * @version 2016年6月23日 下午6:07:21 + * @version 2016年6月23日 下午6:07:21 */ public interface SysMysqlCreateTableManager { public void createMysqlTable(); - + + public List getAllFields(Class clas); + } diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java index 9e0ba3e0e2400e6caf6cc99b3774b906df4f395a..535acbea4e85438b4678861bf3ef3322386c9be0 100644 --- a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/manager/system/SysMysqlCreateTableManagerImpl.java @@ -1,6 +1,8 @@ package com.gitee.sunchenbin.mybatis.actable.manager.system; +import com.baomidou.mybatisplus.annotation.TableName; import com.gitee.sunchenbin.mybatis.actable.annotation.Index; +import com.gitee.sunchenbin.mybatis.actable.annotation.Table; import com.gitee.sunchenbin.mybatis.actable.annotation.Unique; import com.gitee.sunchenbin.mybatis.actable.command.*; import com.gitee.sunchenbin.mybatis.actable.constants.Constants; @@ -9,6 +11,7 @@ import com.gitee.sunchenbin.mybatis.actable.constants.MySqlEngineConstant; import com.gitee.sunchenbin.mybatis.actable.constants.MySqlTypeConstant; import com.gitee.sunchenbin.mybatis.actable.dao.system.CreateMysqlTablesMapper; import com.gitee.sunchenbin.mybatis.actable.manager.util.ConfigurationUtil; +import com.gitee.sunchenbin.mybatis.actable.utils.ClassScaner; import com.gitee.sunchenbin.mybatis.actable.utils.ClassTools; import com.gitee.sunchenbin.mybatis.actable.utils.ColumnUtils; import org.slf4j.Logger; @@ -70,8 +73,11 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage return; } + // 拆成多个pack,支持多个 + String[] packs = pack.split(",|;"); + // 从包package中获取所有的Class - Set> classes = ClassTools.getClasses(pack); + Set classes = ClassScaner.scan(packs, Table.class, TableName.class, javax.persistence.Table.class); // 初始化用于存储各种操作表结构的容器 Map> baseTableMap = initTableMap(); @@ -556,7 +562,8 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage * 准备做为创建表依据的class * @return 表的全部字段 */ - private List getAllFields(Class clas) { + @Override + public List getAllFields(Class clas) { String idxPrefix = springContextUtil.getConfig(Constants.TABLE_INDEX_KEY); String uniPrefix = springContextUtil.getConfig(Constants.TABLE_UNIQUE_KEY); List fieldList = new ArrayList(); @@ -636,7 +643,15 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage Class clsSup = clas.getSuperclass(); List fieldList = new ArrayList(); fieldList.addAll(Arrays.asList(fields)); - fieldList.addAll(Arrays.asList(clsSup.getDeclaredFields())); + // 获取当前class的所有fields的name列表 + List fdNames = getFieldNames(fieldList); + for (Field pfd : Arrays.asList(clsSup.getDeclaredFields())){ + // 避免重载属性 + if (fdNames.contains(pfd.getName())){ + continue; + } + fieldList.add(pfd); + } fields = new Field[fieldList.size()]; int i = 0; for (Object field : fieldList.toArray()) { @@ -648,6 +663,14 @@ public class SysMysqlCreateTableManagerImpl implements SysMysqlCreateTableManage return fields; } + private List getFieldNames(List fieldList) { + List fdNames = new ArrayList(); + for (Field fd : fieldList){ + fdNames.add(fd.getName()); + } + return fdNames; + } + /** * 根据传入的map创建或修改表结构 * diff --git a/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassScaner.java b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassScaner.java new file mode 100644 index 0000000000000000000000000000000000000000..a740acd3052958341e28fa4671cf0c06712ac1ff --- /dev/null +++ b/mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassScaner.java @@ -0,0 +1,124 @@ +package com.gitee.sunchenbin.mybatis.actable.utils; + +import org.springframework.beans.factory.BeanDefinitionStoreException; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternUtils; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.core.type.filter.TypeFilter; +import org.springframework.util.StringUtils; +import org.springframework.util.SystemPropertyUtils; + +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +public class ClassScaner implements ResourceLoaderAware { + + //保存过滤规则要排除的注解 + private final List includeFilters = new LinkedList(); + private final List excludeFilters = new LinkedList(); + + private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); + private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver); + + public static Set scan(String[] basePackages, + Class... annotations) { + ClassScaner cs = new ClassScaner(); + + if(annotations != null && annotations.length > 0) { + for (Class anno : annotations) { + cs.addIncludeFilter(new AnnotationTypeFilter(anno)); + } + } + + Set classes = new HashSet(); + for (String s : basePackages) + classes.addAll(cs.doScan(s)); + return classes; + } + + public static Set scan(String basePackages, Class... annotations) { + return ClassScaner.scan(StringUtils.tokenizeToStringArray(basePackages, ",; \t\n"), annotations); + } + + public final ResourceLoader getResourceLoader() { + return this.resourcePatternResolver; + } + + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourcePatternResolver = ResourcePatternUtils + .getResourcePatternResolver(resourceLoader); + this.metadataReaderFactory = new CachingMetadataReaderFactory( + resourceLoader); + } + + public void addIncludeFilter(TypeFilter includeFilter) { + this.includeFilters.add(includeFilter); + } + + public void addExcludeFilter(TypeFilter excludeFilter) { + this.excludeFilters.add(0, excludeFilter); + } + + public void resetFilters(boolean useDefaultFilters) { + this.includeFilters.clear(); + this.excludeFilters.clear(); + } + + public Set doScan(String basePackage) { + Set classes = new HashSet(); + try { + String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + org.springframework.util.ClassUtils + .convertClassNameToResourcePath(SystemPropertyUtils + .resolvePlaceholders(basePackage)) + + "/**/*.class"; + Resource[] resources = this.resourcePatternResolver + .getResources(packageSearchPath); + + for (int i = 0; i < resources.length; i++) { + Resource resource = resources[i]; + if (resource.isReadable()) { + MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource); + if ((includeFilters.size() == 0 && excludeFilters.size() == 0) + || matches(metadataReader)) { + try { + classes.add(Class.forName(metadataReader + .getClassMetadata().getClassName())); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + } + } catch (IOException ex) { + throw new BeanDefinitionStoreException( + "I/O failure during classpath scanning", ex); + } + return classes; + } + + protected boolean matches(MetadataReader metadataReader) throws IOException { + for (TypeFilter tf : this.excludeFilters) { + if (tf.match(metadataReader, this.metadataReaderFactory)) { + return false; + } + } + for (TypeFilter tf : this.includeFilters) { + if (tf.match(metadataReader, this.metadataReaderFactory)) { + return true; + } + } + return false; + } +}