From e15f06d041593427eddfe6249b87db9f21e4e0a3 Mon Sep 17 00:00:00 2001 From: "chenbin.sun@baozun.com" Date: Wed, 24 Feb 2021 19:04:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?1.4.9=E8=BF=AD=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- mybatis-enhance-actable/README.md | 13 +- mybatis-enhance-actable/pom.xml | 2 +- .../system/SysMysqlCreateTableManager.java | 8 +- .../SysMysqlCreateTableManagerImpl.java | 29 +++- .../mybatis/actable/utils/ClassScaner.java | 124 ++++++++++++++++++ 6 files changed, 166 insertions(+), 12 deletions(-) create mode 100644 mybatis-enhance-actable/src/main/java/com/gitee/sunchenbin/mybatis/actable/utils/ClassScaner.java diff --git a/README.md b/README.md index a1edb62..222231f 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) diff --git a/mybatis-enhance-actable/README.md b/mybatis-enhance-actable/README.md index b4071f9..320490a 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 caecf91..8297337 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 d71dca3..7939092 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 9e0ba3e..535acbe 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 0000000..a740acd --- /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; + } +} -- Gitee From 93072cbaa99ce190296c76791ddc7d4fd8593b15 Mon Sep 17 00:00:00 2001 From: "chenbin.sun@baozun.com" Date: Thu, 25 Feb 2021 13:13:40 +0800 Subject: [PATCH 2/2] =?UTF-8?q?readme=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 222231f..b592a94 100644 --- a/README.md +++ b/README.md @@ -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) -- Gitee