diff --git a/pom.xml b/pom.xml index e4a0a9e..954d560 100644 --- a/pom.xml +++ b/pom.xml @@ -18,8 +18,8 @@ 17 1.18.34 - 1.9.6 - 1.9.6.034-beta + 1.10.8 + 1.10.8.110 5.8.26 3.3.2 2.0.51 diff --git a/src/main/java/com/cool/CoolApplication.java b/src/main/java/com/cool/CoolApplication.java index 2ce3ff1..b5fac06 100644 --- a/src/main/java/com/cool/CoolApplication.java +++ b/src/main/java/com/cool/CoolApplication.java @@ -1,9 +1,9 @@ package com.cool; import com.cool.core.util.PathUtils; -import com.tangzc.autotable.springboot.EnableAutoTable; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.dromara.autotable.springboot.EnableAutoTable; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.SpringApplication; diff --git a/src/main/java/com/cool/core/autotable/CustomJavaTypeToDatabaseTypeConverter.java b/src/main/java/com/cool/core/autotable/CustomJavaTypeToDatabaseTypeConverter.java index 181e708..897daf3 100644 --- a/src/main/java/com/cool/core/autotable/CustomJavaTypeToDatabaseTypeConverter.java +++ b/src/main/java/com/cool/core/autotable/CustomJavaTypeToDatabaseTypeConverter.java @@ -1,15 +1,15 @@ package com.cool.core.autotable; -import com.tangzc.autotable.annotation.ColumnType; -import com.tangzc.autotable.core.constants.DatabaseDialect; -import com.tangzc.autotable.core.converter.DatabaseTypeAndLength; -import com.tangzc.autotable.core.converter.JavaTypeToDatabaseTypeConverter; -import com.tangzc.autotable.core.strategy.pgsql.data.PgsqlDefaultTypeEnum; -import com.tangzc.autotable.core.utils.StringUtils; -import com.tangzc.autotable.core.utils.TableBeanUtils; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; +import org.dromara.autotable.annotation.ColumnType; +import org.dromara.autotable.core.constants.DatabaseDialect; +import org.dromara.autotable.core.converter.DatabaseTypeAndLength; +import org.dromara.autotable.core.converter.JavaTypeToDatabaseTypeConverter; +import org.dromara.autotable.core.strategy.pgsql.data.PgsqlDefaultTypeEnum; +import org.dromara.autotable.core.utils.StringUtils; +import org.dromara.autotable.core.utils.TableBeanUtils; import org.springframework.stereotype.Component; @Component diff --git a/src/main/java/com/cool/core/base/BaseEntity.java b/src/main/java/com/cool/core/base/BaseEntity.java index 72366a3..08f153f 100644 --- a/src/main/java/com/cool/core/base/BaseEntity.java +++ b/src/main/java/com/cool/core/base/BaseEntity.java @@ -6,12 +6,12 @@ import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.core.activerecord.Model; import com.mybatisflex.core.query.QueryWrapper; -import com.tangzc.autotable.annotation.Ignore; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import java.io.Serializable; import java.util.Date; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Ignore; /** * 基础实体类 diff --git a/src/main/java/com/cool/core/init/CoolPluginInit.java b/src/main/java/com/cool/core/init/CoolPluginInit.java index 36ca4ff..846be54 100644 --- a/src/main/java/com/cool/core/init/CoolPluginInit.java +++ b/src/main/java/com/cool/core/init/CoolPluginInit.java @@ -3,8 +3,8 @@ package com.cool.core.init; import com.cool.core.plugin.service.CoolPluginService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** @@ -13,12 +13,12 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class CoolPluginInit implements ApplicationRunner { +public class CoolPluginInit { final private CoolPluginService coolPluginService; - @Override - public void run(ApplicationArguments args) { + @EventListener(ApplicationReadyEvent.class) + public void run() { coolPluginService.init(); } } diff --git a/src/main/java/com/cool/core/init/DBFromJsonInit.java b/src/main/java/com/cool/core/init/DBFromJsonInit.java index fc29c9a..7498ad1 100644 --- a/src/main/java/com/cool/core/init/DBFromJsonInit.java +++ b/src/main/java/com/cool/core/init/DBFromJsonInit.java @@ -24,9 +24,9 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.event.EventListener; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.stereotype.Component; @@ -37,7 +37,7 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class DBFromJsonInit implements ApplicationRunner { +public class DBFromJsonInit { final private BaseSysConfService baseSysConfService; @@ -50,8 +50,8 @@ public class DBFromJsonInit implements ApplicationRunner { @Value("${cool.initData}") private boolean initData; - @Override - public void run(ApplicationArguments args) { + @EventListener(ApplicationReadyEvent.class) + public void run() { if (!initData) { return; } diff --git a/src/main/java/com/cool/core/init/IDGenInit.java b/src/main/java/com/cool/core/init/IDGenInit.java index 617e059..446e59a 100644 --- a/src/main/java/com/cool/core/init/IDGenInit.java +++ b/src/main/java/com/cool/core/init/IDGenInit.java @@ -3,8 +3,8 @@ package com.cool.core.init; import com.cool.core.leaf.IDGenService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** @@ -13,12 +13,12 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class IDGenInit implements ApplicationRunner { +public class IDGenInit { final private IDGenService idGenService; - @Override - public void run(ApplicationArguments args) { + @EventListener(ApplicationReadyEvent.class) + public void run() { idGenService.init(); } } diff --git a/src/main/java/com/cool/core/leaf/segment/entity/LeafAllocEntity.java b/src/main/java/com/cool/core/leaf/segment/entity/LeafAllocEntity.java index d9b36bf..a78caba 100644 --- a/src/main/java/com/cool/core/leaf/segment/entity/LeafAllocEntity.java +++ b/src/main/java/com/cool/core/leaf/segment/entity/LeafAllocEntity.java @@ -12,7 +12,7 @@ import lombok.Setter; @Table(value = "leaf_alloc", comment = "唯一id分配") public class LeafAllocEntity extends BaseEntity { - @UniIndex + @UniIndex(name = "uk_key") @ColumnDefine(comment = "业务key ,比如orderId", length = 20, notNull = true) private String key; diff --git a/src/main/java/com/cool/core/util/DatabaseDialectUtils.java b/src/main/java/com/cool/core/util/DatabaseDialectUtils.java index e49432e..6cdeb80 100644 --- a/src/main/java/com/cool/core/util/DatabaseDialectUtils.java +++ b/src/main/java/com/cool/core/util/DatabaseDialectUtils.java @@ -1,6 +1,6 @@ package com.cool.core.util; import com.cool.core.exception.CoolPreconditions; -import com.tangzc.autotable.core.constants.DatabaseDialect; +import org.dromara.autotable.core.constants.DatabaseDialect; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.SQLException; diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysConfEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysConfEntity.java index 50343bf..73ffbb1 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysConfEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysConfEntity.java @@ -1,13 +1,12 @@ package com.cool.modules.base.entity.sys; import com.cool.core.base.BaseEntity; -import com.tangzc.autotable.annotation.enums.IndexTypeEnum; - -import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; +import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; +import org.dromara.autotable.annotation.enums.IndexTypeEnum; /** * 系统配置 diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysLogEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysLogEntity.java index 32a2f4a..9c9dc18 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysLogEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysLogEntity.java @@ -2,12 +2,12 @@ package com.cool.modules.base.entity.sys; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; -import com.mybatisflex.core.handler.Fastjson2TypeHandler; -import com.tangzc.autotable.annotation.Index; -import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import com.mybatisflex.annotation.Table; +import com.mybatisflex.core.handler.Fastjson2TypeHandler; +import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysMenuEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysMenuEntity.java index c404785..96c4ca4 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysMenuEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysMenuEntity.java @@ -3,11 +3,11 @@ package com.cool.modules.base.entity.sys; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import java.util.List; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysParamEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysParamEntity.java index 7edf81e..d5f1001 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysParamEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysParamEntity.java @@ -2,10 +2,10 @@ package com.cool.modules.base.entity.sys; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysRoleEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysRoleEntity.java index 2623fce..5119e90 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysRoleEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysRoleEntity.java @@ -4,12 +4,12 @@ import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Table; import com.mybatisflex.core.handler.Fastjson2TypeHandler; -import com.tangzc.autotable.annotation.Index; -import com.tangzc.autotable.annotation.enums.IndexTypeEnum; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import java.util.List; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; +import org.dromara.autotable.annotation.enums.IndexTypeEnum; @Getter @Setter diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserEntity.java index 03fad92..9a3d5e0 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserEntity.java @@ -3,11 +3,11 @@ package com.cool.modules.base.entity.sys; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; -import com.tangzc.autotable.annotation.enums.IndexTypeEnum; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; +import org.dromara.autotable.annotation.enums.IndexTypeEnum; @Getter @Setter diff --git a/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserRoleEntity.java b/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserRoleEntity.java index 5f18e38..c8ffc67 100644 --- a/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserRoleEntity.java +++ b/src/main/java/com/cool/modules/base/entity/sys/BaseSysUserRoleEntity.java @@ -2,10 +2,10 @@ package com.cool.modules.base.entity.sys; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/com/cool/modules/base/service/sys/impl/BaseCodingServiceImpl.java b/src/main/java/com/cool/modules/base/service/sys/impl/BaseCodingServiceImpl.java index eace8ce..ab742dc 100644 --- a/src/main/java/com/cool/modules/base/service/sys/impl/BaseCodingServiceImpl.java +++ b/src/main/java/com/cool/modules/base/service/sys/impl/BaseCodingServiceImpl.java @@ -4,10 +4,6 @@ import com.cool.core.exception.CoolPreconditions; import com.cool.modules.base.dto.sys.CodeContentDto; import com.cool.modules.base.service.sys.BaseCodingService; import com.google.googlejavaformat.java.Formatter; -import com.google.googlejavaformat.java.FormatterException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -16,6 +12,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; @Service public class BaseCodingServiceImpl implements BaseCodingService { @@ -81,7 +79,7 @@ public class BaseCodingServiceImpl implements BaseCodingService { public String formatContent(String content) { Formatter formatter = new Formatter(); try { -// return formatter.formatSource(content); + return formatter.formatSource(content); } catch (Exception ignored) { } return content; diff --git a/src/main/java/com/cool/modules/base/service/sys/impl/BaseSysUserServiceImpl.java b/src/main/java/com/cool/modules/base/service/sys/impl/BaseSysUserServiceImpl.java index 6b74046..dc213f0 100644 --- a/src/main/java/com/cool/modules/base/service/sys/impl/BaseSysUserServiceImpl.java +++ b/src/main/java/com/cool/modules/base/service/sys/impl/BaseSysUserServiceImpl.java @@ -26,8 +26,8 @@ import com.cool.modules.base.service.sys.BaseSysUserService; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.update.UpdateChain; -import com.tangzc.autotable.core.constants.DatabaseDialect; import lombok.RequiredArgsConstructor; +import org.dromara.autotable.core.constants.DatabaseDialect; import org.springframework.stereotype.Service; /** diff --git a/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java b/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java index b8f1274..1905432 100644 --- a/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java +++ b/src/main/java/com/cool/modules/plugin/entity/PluginInfoEntity.java @@ -6,13 +6,13 @@ import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Table; import com.mybatisflex.core.handler.Fastjson2TypeHandler; import com.mybatisflex.core.handler.JacksonTypeHandler; -import com.tangzc.autotable.annotation.Ignore; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import com.tangzc.mybatisflex.autotable.annotation.UniIndex; import java.util.Map; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Ignore; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/com/cool/modules/recycle/entity/RecycleDataEntity.java b/src/main/java/com/cool/modules/recycle/entity/RecycleDataEntity.java index 0704e01..1536870 100644 --- a/src/main/java/com/cool/modules/recycle/entity/RecycleDataEntity.java +++ b/src/main/java/com/cool/modules/recycle/entity/RecycleDataEntity.java @@ -4,13 +4,13 @@ import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Table; import com.mybatisflex.core.handler.Fastjson2TypeHandler; -import com.tangzc.autotable.annotation.Ignore; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import java.util.List; import java.util.Map; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Ignore; +import org.dromara.autotable.annotation.Index; /** * 数据回收站 软删除的时候数据会回收到该表 diff --git a/src/main/java/com/cool/modules/space/entity/SpaceInfoEntity.java b/src/main/java/com/cool/modules/space/entity/SpaceInfoEntity.java index 2cd9684..c2de212 100644 --- a/src/main/java/com/cool/modules/space/entity/SpaceInfoEntity.java +++ b/src/main/java/com/cool/modules/space/entity/SpaceInfoEntity.java @@ -3,11 +3,11 @@ package com.cool.modules.space.entity; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Ignore; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Ignore; +import org.dromara.autotable.annotation.Index; /** * 文件空间信息 diff --git a/src/main/java/com/cool/modules/task/entity/TaskLogEntity.java b/src/main/java/com/cool/modules/task/entity/TaskLogEntity.java index a8057b2..6dd0dd2 100644 --- a/src/main/java/com/cool/modules/task/entity/TaskLogEntity.java +++ b/src/main/java/com/cool/modules/task/entity/TaskLogEntity.java @@ -2,12 +2,11 @@ package com.cool.modules.task.entity; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Column; -import com.tangzc.autotable.annotation.Index; -import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import com.mybatisflex.annotation.Table; - +import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/com/cool/modules/task/event/TaskEvent.java b/src/main/java/com/cool/modules/task/event/TaskEvent.java index 0ce78a7..1ec2012 100644 --- a/src/main/java/com/cool/modules/task/event/TaskEvent.java +++ b/src/main/java/com/cool/modules/task/event/TaskEvent.java @@ -3,8 +3,8 @@ package com.cool.modules.task.event; import com.cool.modules.task.service.TaskInfoService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** @@ -13,12 +13,12 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class TaskEvent implements ApplicationRunner { +public class TaskEvent { final private TaskInfoService taskInfoService; - @Override - public void run(ApplicationArguments args) throws Exception { + @EventListener(ApplicationReadyEvent.class) + public void run() throws Exception { taskInfoService.init(); log.info("初始化任务"); } diff --git a/src/main/java/com/cool/modules/user/entity/UserAddressEntity.java b/src/main/java/com/cool/modules/user/entity/UserAddressEntity.java index f0b0c77..2297a4f 100644 --- a/src/main/java/com/cool/modules/user/entity/UserAddressEntity.java +++ b/src/main/java/com/cool/modules/user/entity/UserAddressEntity.java @@ -2,10 +2,10 @@ package com.cool.modules.user.entity; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; /** * 用户模块-收货地址 diff --git a/src/main/java/com/cool/modules/user/entity/UserWxEntity.java b/src/main/java/com/cool/modules/user/entity/UserWxEntity.java index 7789984..4737c8c 100644 --- a/src/main/java/com/cool/modules/user/entity/UserWxEntity.java +++ b/src/main/java/com/cool/modules/user/entity/UserWxEntity.java @@ -2,11 +2,11 @@ package com.cool.modules.user.entity; import com.cool.core.base.BaseEntity; import com.mybatisflex.annotation.Table; -import com.tangzc.autotable.annotation.Index; import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine; import com.tangzc.mybatisflex.autotable.annotation.UniIndex; import lombok.Getter; import lombok.Setter; +import org.dromara.autotable.annotation.Index; @Getter @Setter diff --git a/src/main/java/org/dromara/autotable/core/strategy/mysql/builder/CreateTableSqlBuilder.java b/src/main/java/org/dromara/autotable/core/strategy/mysql/builder/CreateTableSqlBuilder.java new file mode 100644 index 0000000..394befd --- /dev/null +++ b/src/main/java/org/dromara/autotable/core/strategy/mysql/builder/CreateTableSqlBuilder.java @@ -0,0 +1,144 @@ +package org.dromara.autotable.core.strategy.mysql.builder; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.dromara.autotable.annotation.enums.IndexTypeEnum; +import org.dromara.autotable.core.strategy.IndexMetadata; +import org.dromara.autotable.core.strategy.mysql.data.MysqlColumnMetadata; +import org.dromara.autotable.core.strategy.mysql.data.MysqlTableMetadata; +import org.dromara.autotable.core.utils.StringConnectHelper; +import org.dromara.autotable.core.utils.StringUtils; + +/** + * @author don + * 临时解决:https://gitee.com/dromara/auto-table/issues/IBPYHU + */ +@Slf4j +public class CreateTableSqlBuilder { + + /** + * 构建创建新表的SQL + * + * @param mysqlTableMetadata 参数 + * @return sql + */ + public static String buildSql(MysqlTableMetadata mysqlTableMetadata) { + + String name = mysqlTableMetadata.getTableName(); + List mysqlColumnMetadataList = mysqlTableMetadata.getColumnMetadataList(); + List indexMetadataList = mysqlTableMetadata.getIndexMetadataList(); + String collate = mysqlTableMetadata.getCollate(); + String engine = mysqlTableMetadata.getEngine(); + String characterSet = mysqlTableMetadata.getCharacterSet(); + String comment = mysqlTableMetadata.getComment(); + + // 记录所有修改项,(利用数组结构,便于添加,分割) + List addItems = new ArrayList<>(); + + // 获取所有主键(至于表字段处理之前,为了主键修改notnull) + List primaries = new ArrayList<>(); + mysqlColumnMetadataList.forEach(columnData -> { + // 判断是主键,自动设置为NOT NULL,并记录 + if (columnData.isPrimary()) { + columnData.setNotNull(true); + primaries.add(columnData.getName()); + } + }); + + // 表字段处理 + addItems.add( + mysqlColumnMetadataList.stream() + .sorted(Comparator.comparingInt(MysqlColumnMetadata::getPosition)) + // 拼接每个字段的sql片段 + .map(ColumnSqlBuilder::buildSql) + .collect(Collectors.joining(",")) + ); + + + // 主键 + if (!primaries.isEmpty()) { + String primaryKeySql = getPrimaryKeySql(primaries); + addItems.add(primaryKeySql); + } + + // 索引 + addItems.add( + indexMetadataList.stream() + // 例子: UNIQUE INDEX `unique_name_age`(`name` ASC, `age` DESC) COMMENT '姓名、年龄索引' USING BTREE + .map(CreateTableSqlBuilder::getIndexSql) + // 同类型的索引,排在一起,SQL美化 + .sorted() + .collect(Collectors.joining(",")) + ); + + List tableProperties = getTableProperties(engine, characterSet, collate, comment); + + // 组合sql: 过滤空字符项,逗号拼接 + String addSql = addItems.stream() + .filter(StringUtils::hasText) + .collect(Collectors.joining(",")); + String propertiesSql = tableProperties.stream() + .filter(StringUtils::hasText) + .collect(Collectors.joining(",")); + + return "CREATE TABLE `{tableName}` ({addItems}) {tableProperties};" + .replace("{tableName}", name) + .replace("{addItems}", addSql) + .replace("{tableProperties}", propertiesSql); + } + + public static List getTableProperties(String engine, String characterSet, String collate, String comment) { + List tableProperties = new ArrayList<>(); + + // 引擎 + if (StringUtils.hasText(engine)) { + tableProperties.add("ENGINE = " + engine); + } + // 字符集 + if (StringUtils.hasText(characterSet)) { + tableProperties.add("CHARACTER SET = " + characterSet); + } + // 排序 + if (StringUtils.hasText(collate)) { + tableProperties.add("COLLATE = " + collate); + } + // 备注 + if (StringUtils.hasText(comment)) { + tableProperties.add( + "COMMENT = '{comment}'" + .replace("{comment}", comment) + ); + } + return tableProperties; + } + + public static String getIndexSql(IndexMetadata indexMetadata) { + // 例子: UNIQUE INDEX `unique_name_age`(`name` ASC, `age` DESC) COMMENT '姓名、年龄索引', + return StringConnectHelper.newInstance("{indexType} INDEX {indexName}({columns}) {method} {indexComment}") + .replace("{indexType}", indexMetadata.getType() == IndexTypeEnum.UNIQUE ? "UNIQUE" : "") + .replace("{indexName}", indexMetadata.getName()) + .replace("{columns}", () -> { + List columnParams = indexMetadata.getColumns(); + return columnParams.stream().map(column -> + // 例:name ASC + "`{column}` {sortMode}" + .replace("{column}", column.getColumn()) + .replace("{sortMode}", column.getSort() != null ? column.getSort().name() : "") + ).collect(Collectors.joining(",")); + }) + .replace("{method}", StringUtils.hasText(indexMetadata.getMethod()) ? "USING " + indexMetadata.getMethod() : "") + .replace("{indexComment}", StringUtils.hasText(indexMetadata.getComment()) ? "COMMENT '" + indexMetadata.getComment() + "'" : "") + .toString(); + } + + public static String getPrimaryKeySql(List primaries) { + return "PRIMARY KEY ({primaries})" + .replace( + "{primaries}", + String.join(",", primaries) + ); + } +}