diff --git a/pom.xml b/pom.xml index c84899e2697112c6ca1bc030a8ca787ba5a96599..6ebd0b720c41217c377411b432837631dc1680eb 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,10 @@ UTF-8 F4B46FB9 + UTF-8 + 8 + 8 + 8 @@ -86,7 +90,7 @@ org.apache.maven.plugins maven-plugin-plugin - 3.2 + 3.6.0 mp true diff --git a/src/main/java/com/baomidou/AbstractGenerateMojo.java b/src/main/java/com/baomidou/AbstractGenerateMojo.java index 8c1e2d313b671b3785550293e190d2e3ec9e4d85..3e1ee246b102a386d0c0398abe03d7c8686f7ac9 100644 --- a/src/main/java/com/baomidou/AbstractGenerateMojo.java +++ b/src/main/java/com/baomidou/AbstractGenerateMojo.java @@ -77,6 +77,12 @@ public abstract class AbstractGenerateMojo extends AbstractMojo { @Parameter(defaultValue = "true") private boolean activeRecord; + /** + * 开启 ActiveRecord 模式 + */ + @Parameter(defaultValue = "false") + private boolean enableSwagger; + protected ConfigBuilder config; /** @@ -117,4 +123,8 @@ public abstract class AbstractGenerateMojo extends AbstractMojo { return activeRecord; } + public boolean isEnableSwagger() { + return enableSwagger; + } + } diff --git a/src/main/java/com/baomidou/GenerateMojo.java b/src/main/java/com/baomidou/GenerateMojo.java index fdba0faf5973065e5e7e86fb8e17d6b9df23c414..a1982f46b110eb36caa2711bfa8868bf85ce42d0 100644 --- a/src/main/java/com/baomidou/GenerateMojo.java +++ b/src/main/java/com/baomidou/GenerateMojo.java @@ -1,17 +1,11 @@ package com.baomidou; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - +import com.baomidou.config.ConstVal; +import com.baomidou.config.TemplateConfig; +import com.baomidou.config.builder.ConfigBuilder; +import com.baomidou.config.po.TableField; +import com.baomidou.config.po.TableInfo; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -21,10 +15,10 @@ import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; -import com.baomidou.config.ConstVal; -import com.baomidou.config.TemplateConfig; -import com.baomidou.config.builder.ConfigBuilder; -import com.baomidou.config.po.TableInfo; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; /** * 生成文件 @@ -45,6 +39,7 @@ public class GenerateMojo extends AbstractGenerateMojo { */ private Map outputFiles; + @Override public void execute() throws MojoExecutionException, MojoFailureException { log.info("==========================准备生成文件...=========================="); // 初始化配置 @@ -89,7 +84,7 @@ public class GenerateMojo extends AbstractGenerateMojo { private Map analyzeData(ConfigBuilder config) { List tableList = config.getTableInfoList(); Map packageInfo = config.getPackageInfo(); - Map ctxData = new HashMap(); + Map ctxData = new HashMap<>(); String superEntityClass = getSuperClassName(config.getSuperEntityClass()); String superMapperClass = getSuperClassName(config.getSuperMapperClass()); String superServiceClass = getSuperClassName(config.getSuperServiceClass()); @@ -99,10 +94,19 @@ public class GenerateMojo extends AbstractGenerateMojo { for (TableInfo tableInfo : tableList) { VelocityContext ctx = new VelocityContext(); + List tableFields = tableInfo.getFields().stream() + .filter(tableField -> "BigDecimal".equalsIgnoreCase(tableField.getPropertyType())) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(tableFields)) { + ctx.put("havBigDecimal", true); + } else { + ctx.put("havBigDecimal", false); + } + ctx.put("package", packageInfo); ctx.put("table", tableInfo); ctx.put("entity", tableInfo.getEntityName()); - ctx.put("addTabeName", !tableInfo.getEntityName().toLowerCase().equals(tableInfo.getName().toLowerCase())); + ctx.put("addTabeName", !tableInfo.getEntityName().equalsIgnoreCase(tableInfo.getName())); ctx.put("idGenType", config.getIdType()); ctx.put("superEntityClassPackage", config.getSuperEntityClass()); ctx.put("superEntityClass", superEntityClass); @@ -117,6 +121,7 @@ public class GenerateMojo extends AbstractGenerateMojo { ctx.put("enableCache", isEnableCache()); ctx.put("author", getAuthor()); ctx.put("activeRecord", isActiveRecord()); + ctx.put("enableSwagger", isEnableSwagger()); ctx.put("date", date); ctxData.put(tableInfo.getEntityName(), ctx); } @@ -130,8 +135,9 @@ public class GenerateMojo extends AbstractGenerateMojo { * @return */ private String getSuperClassName(String classPath) { - if (StringUtils.isBlank(classPath)) + if (StringUtils.isBlank(classPath)) { return null; + } return classPath.substring(classPath.lastIndexOf(".") + 1); } diff --git a/src/main/java/com/baomidou/config/PackageConfig.java b/src/main/java/com/baomidou/config/PackageConfig.java index fbd18d8137a0013666efd8120536e4e36ea25369..5f3cc353225ae9236fa5d1ee65529a57f4305731 100644 --- a/src/main/java/com/baomidou/config/PackageConfig.java +++ b/src/main/java/com/baomidou/config/PackageConfig.java @@ -58,8 +58,9 @@ public class PackageConfig { private String controller; public String getParent() { - if(moduleName != null && !"".equals(moduleName.trim())) - return parent + "." + moduleName; + if(moduleName != null && !"".equals(moduleName.trim())) { + return parent + "." + moduleName; + } return parent; } @@ -88,7 +89,9 @@ public class PackageConfig { } public String getController() { - if(StringUtils.isBlank(controller)) return "web"; + if(StringUtils.isBlank(controller)) { + return "web"; + } return controller; } } diff --git a/src/main/java/com/baomidou/config/StrategyConfig.java b/src/main/java/com/baomidou/config/StrategyConfig.java index ec6cf4ffd0b1749908b315ee6b0a24bf6560de8e..dfc1b6bb4095769e9cd3326861cfc0bc0172c9b7 100644 --- a/src/main/java/com/baomidou/config/StrategyConfig.java +++ b/src/main/java/com/baomidou/config/StrategyConfig.java @@ -19,6 +19,7 @@ public class StrategyConfig { @Parameter(defaultValue = "nochange") private NamingStrategy naming; + @Parameter(defaultValue = "underline_to_camel") private NamingStrategy fieldNaming; /** @@ -80,8 +81,9 @@ public class StrategyConfig { } public NamingStrategy getFieldNaming() { - if (fieldNaming == null) - return naming; + if (fieldNaming == null) { + return naming; + } return fieldNaming; } diff --git a/src/main/java/com/baomidou/config/builder/ConfigBuilder.java b/src/main/java/com/baomidou/config/builder/ConfigBuilder.java index f0d27cdab7fe44570637411add1e5f7256e16fd1..ba18efe69a8dc648709bdf504d9a18dcf9856b5b 100644 --- a/src/main/java/com/baomidou/config/builder/ConfigBuilder.java +++ b/src/main/java/com/baomidou/config/builder/ConfigBuilder.java @@ -1,30 +1,20 @@ package com.baomidou.config.builder; -import java.io.File; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -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 org.apache.commons.lang.StringUtils; - -import com.baomidou.config.ConstVal; -import com.baomidou.config.DataSourceConfig; -import com.baomidou.config.PackageConfig; -import com.baomidou.config.StrategyConfig; -import com.baomidou.config.TemplateConfig; +import com.baomidou.config.*; import com.baomidou.config.po.TableField; import com.baomidou.config.po.TableInfo; import com.baomidou.config.rules.DbType; import com.baomidou.config.rules.IdStrategy; import com.baomidou.config.rules.NamingStrategy; import com.baomidou.config.rules.QuerySQL; +import org.apache.commons.lang.StringUtils; + +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; /** * 配置汇总 传递给文件生成工具 @@ -178,7 +168,7 @@ public class ConfigBuilder { packageInfo.put(ConstVal.MODULENAME, config.getModuleName()); packageInfo.put(ConstVal.ENTITY, joinPackage(config.getParent(), config.getEntity())); packageInfo.put(ConstVal.MAPPER, joinPackage(config.getParent(), config.getMapper())); - packageInfo.put(ConstVal.XML, joinPackage(config.getParent(), config.getXml())); + packageInfo.put(ConstVal.XML, joinPackage("", config.getXml())); packageInfo.put(ConstVal.SERIVCE, joinPackage(config.getParent(), config.getService())); packageInfo.put(ConstVal.SERVICEIMPL, joinPackage(config.getParent(), config.getServiceImpl())); packageInfo.put(ConstVal.CONTROLLER, joinPackage(config.getParent(), config.getController())); @@ -186,7 +176,7 @@ public class ConfigBuilder { pathInfo = new HashMap(); pathInfo.put(ConstVal.ENTITY_PATH, joinPath(outputDir, packageInfo.get(ConstVal.ENTITY))); pathInfo.put(ConstVal.MAPPER_PATH, joinPath(outputDir, packageInfo.get(ConstVal.MAPPER))); - pathInfo.put(ConstVal.XML_PATH, joinPath(outputDir, packageInfo.get(ConstVal.XML))); + pathInfo.put(ConstVal.XML_PATH, packageInfo.get(ConstVal.XML)); pathInfo.put(ConstVal.SERIVCE_PATH, joinPath(outputDir, packageInfo.get(ConstVal.SERIVCE))); pathInfo.put(ConstVal.SERVICEIMPL_PATH, joinPath(outputDir, packageInfo.get(ConstVal.SERVICEIMPL))); pathInfo.put(ConstVal.CONTROLLER_PATH, joinPath(outputDir, packageInfo.get(ConstVal.CONTROLLER))); @@ -244,8 +234,12 @@ public class ConfigBuilder { idType = IdStrategy.auto.getValue(); } else if (config.getIdGenType() == IdStrategy.input) { idType = IdStrategy.input.getValue(); - } else if (config.getIdGenType() == IdStrategy.uuid) { - idType = IdStrategy.uuid.getValue(); + } else if (config.getIdGenType() == IdStrategy.none) { + idType = IdStrategy.none.getValue(); + } else if (config.getIdGenType() == IdStrategy.assign_id) { + idType = IdStrategy.assign_id.getValue(); + }else if (config.getIdGenType() == IdStrategy.assign_uuid) { + idType = IdStrategy.assign_uuid.getValue(); } else { idType = IdStrategy.id_worker.getValue(); } @@ -281,44 +275,38 @@ public class ConfigBuilder { private List getTablesInfo(StrategyConfig config) { boolean isInclude = (null != config.getInclude() && config.getInclude().length > 0); boolean isExclude = (null != config.getExclude() && config.getExclude().length > 0); - if (isInclude && isExclude) { - throw new RuntimeException(" 标签中 只能配置一项!"); - } + List includes = Arrays.asList(Optional.ofNullable(config.getInclude()).orElse(new String[0])); + List excludes = Arrays.asList(Optional.ofNullable(config.getExclude()).orElse(new String[0])); List tableList = new ArrayList(); - Set notExistTables = new HashSet(); NamingStrategy strategy = config.getNaming(); NamingStrategy fieldStrategy = config.getFieldNaming(); + String tablePrefix = config.getTablePrefix(); PreparedStatement pstate = null; try { pstate = connection.prepareStatement(querySQL.getTableCommentsSql()); ResultSet results = pstate.executeQuery(); while (results.next()) { String tableName = results.getString(querySQL.getTableName()); + if (tablePrefix != null && !tableName.toUpperCase().startsWith(tablePrefix.toUpperCase())) { + continue; + } if (StringUtils.isNotBlank(tableName)) { String tableComment = results.getString(querySQL.getTableComment()); TableInfo tableInfo = new TableInfo(); if (isInclude) { - for (String includeTab : config.getInclude()) { - if (includeTab.equalsIgnoreCase(tableName)) { - tableInfo.setName(tableName); - tableInfo.setComment(tableComment); - } else { - notExistTables.add(includeTab); - } - } - } else if (isExclude) { - for (String excludeTab : config.getExclude()) { - if (!excludeTab.equalsIgnoreCase(tableName)) { - tableInfo.setName(tableName); - tableInfo.setComment(tableComment); - } else { - notExistTables.add(excludeTab); - } + if (includes.contains(tableName)) { + tableInfo.setName(tableName); + tableInfo.setComment(tableComment); } } else { tableInfo.setName(tableName); tableInfo.setComment(tableComment); } + if (isExclude) { + if (excludes.contains(tableName)) { + continue; + } + } if (StringUtils.isNotBlank(tableInfo.getName())) { List fieldList = getListFields(tableInfo.getName(), fieldStrategy); tableInfo.setFields(fieldList); @@ -328,13 +316,6 @@ public class ConfigBuilder { System.err.println("当前数据库为空!!!"); } } - // 将已经存在的表移除 - for (TableInfo tabInfo : tableList) { - notExistTables.remove(tabInfo.getName()); - } - if (notExistTables.size() > 0) { - System.err.println("表 " + notExistTables + " 在数据库中不存在!!!"); - } } catch (SQLException e) { e.printStackTrace(); } finally { @@ -461,14 +442,24 @@ public class ConfigBuilder { */ private String processName(String name, NamingStrategy strategy, String tablePrefix) { String propertyName = ""; - if (strategy == NamingStrategy.remove_prefix_and_camel) { - propertyName = NamingStrategy.removePrefixAndCamel(name, tablePrefix); - } else if (strategy == NamingStrategy.underline_to_camel) { - propertyName = NamingStrategy.underlineToCamel(name); - } else if (strategy == NamingStrategy.remove_prefix) { - propertyName = NamingStrategy.removePrefix(name, tablePrefix); - } else { - propertyName = name; + switch (strategy) { + case remove_prefix_and_camel: + propertyName = NamingStrategy.removePrefixAndCamel(name, tablePrefix); + break; + case underline_to_camel: + propertyName = NamingStrategy.underlineToCamel(name); + break; + case remove_prefix: + propertyName = NamingStrategy.removePrefix(name, tablePrefix); + break; + case remove_underline: + propertyName = NamingStrategy.removeUnderline(name); + break; + case remove_underline_and_camel: + propertyName = NamingStrategy.removeUnderlineAndCamel(name); + break; + default: + propertyName = name; } return propertyName; } diff --git a/src/main/java/com/baomidou/config/rules/IdStrategy.java b/src/main/java/com/baomidou/config/rules/IdStrategy.java index 5bdc41e227d1dd6124204eb97b445184f082a5ec..27d8e4c8e46a6cd95bed3a16a0d54554738dd6e8 100644 --- a/src/main/java/com/baomidou/config/rules/IdStrategy.java +++ b/src/main/java/com/baomidou/config/rules/IdStrategy.java @@ -7,7 +7,7 @@ package com.baomidou.config.rules; * @since 2016/8/30 */ public enum IdStrategy { - auto("AUTO"), id_worker("ID_WORKER"), uuid("UUID"), input("INPUT"); + auto("AUTO"), none("NONE"), assign_id("ASSIGN_ID"), assign_uuid("ASSIGN_UUID"),id_worker("ID_WORKER"), uuid("UUID"), input("INPUT"); private String value; diff --git a/src/main/java/com/baomidou/config/rules/NamingStrategy.java b/src/main/java/com/baomidou/config/rules/NamingStrategy.java index ac90cfe13512329a9fcc3c6adb40cc0d8ff06a41..a9bae0c901fa9a139215c8e98fb2564d1a10649d 100644 --- a/src/main/java/com/baomidou/config/rules/NamingStrategy.java +++ b/src/main/java/com/baomidou/config/rules/NamingStrategy.java @@ -25,7 +25,15 @@ public enum NamingStrategy { /** * 去掉前缀并且转驼峰 */ - remove_prefix_and_camel; + remove_prefix_and_camel, + /** + * 去掉第一个下划线之前内容,后面原样输出 + */ + remove_underline, + /** + * 去掉第一个下划线之前内容,后面转驼峰 + */ + remove_underline_and_camel; public static String underlineToCamel(String name) { // 快速检查 @@ -54,12 +62,12 @@ public enum NamingStrategy { } /** - * 去掉下划线前缀 + * 去掉第一个下划线之前内容,后面原样输出 * * @param name * @return */ - public static String removePrefix(String name) { + public static String removeUnderline(String name) { if (StringUtils.isBlank(name)) { return ""; } @@ -69,6 +77,16 @@ public enum NamingStrategy { } return name.substring(idx + 1); } + + /** + * 去掉第一个下划线之前内容,后面转驼峰 + * + * @param name + * @return + */ + public static String removeUnderlineAndCamel(String name) { + return underlineToCamel(removeUnderline(name)); + } /** * 去掉指定的前缀 diff --git a/src/main/resources/template/controller.java.vm b/src/main/resources/template/controller.java.vm index b92da73a294f45bd1faba88760864c64cd3779f0..09a153e84ea7df69cd501772440811ab2eb83469 100644 --- a/src/main/resources/template/controller.java.vm +++ b/src/main/resources/template/controller.java.vm @@ -1,18 +1,26 @@ -package ${package.Controller}; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -/** - *

- * ${table.comment} 前端控制器 - *

- * - * @author ${author} - * @since ${date} - */ -@Controller -@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/${table.entityName.toLowerCase()}") -public class ${table.controllerName} { - -} +package ${package.Controller}; + +#if(${enableSwagger}) + +import io.swagger.annotations.Api; +#end +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + *

+ * ${table.comment} 前端控制器 + *

+ * + * @author ${author} + * @since ${date} + */ +#if(${enableSwagger}) + +@Api(tags = "${table.comment}") +#end +@RestController +@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/${table.entityName.toLowerCase()}") +public class ${table.controllerName} { + +} diff --git a/src/main/resources/template/entity.java.vm b/src/main/resources/template/entity.java.vm index 16299e44c69e77f26f5015b9f1691a524cc9a47c..745986b4b9f809e267341642e295841081a1bab5 100644 --- a/src/main/resources/template/entity.java.vm +++ b/src/main/resources/template/entity.java.vm @@ -1,68 +1,70 @@ -package ${package.Entity}; - -#if(${activeRecord}) -import com.baomidou.mybatisplus.activerecord.Model; -#end -#if(${idGenType}!="ID_WORKER") -import com.baomidou.mybatisplus.enums.IdType; -import com.baomidou.mybatisplus.annotations.TableId; -#end -import com.baomidou.mybatisplus.annotations.TableField; -#if(${addTabeName}) -import com.baomidou.mybatisplus.annotations.TableName; -#end -import java.io.Serializable; -#if(${table.hasDate}) -import java.util.Date; -#end - -/** - *

- * ${table.comment} - *

- * - * @author ${author} - * @since ${date} - */ -#if(${addTabeName}) -@TableName("${table.name}") -#end -#if(${activeRecord}) -public class ${entity} extends Model<${entity}> { -#else -public class ${entity} implements Serializable { -#end - -private static final long serialVersionUID = 1L; - -#foreach($field in ${table.fields}) -/** - * ${field.comment} - */ - #if(${field.keyFlag} && ${idGenType}!="ID_WORKER") - @TableId(type = IdType.${idGenType}) - #end - #if($field.convert && ${field.name.toLowerCase()} != ${field.propertyName.toLowerCase()}) - @TableField(value="${field.name}") - #end -private ${field.propertyType} ${field.propertyName}; - -#end - -#foreach($field in ${table.fields}) - #if(${field.propertyName.equals("Boolean")}) - #set($getprefix="is") - #else - #set($getprefix="get") - #end - -public ${field.propertyType} ${getprefix}${field.capitalName}() { - return ${field.propertyName}; - } - -public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { - this.${field.propertyName} = ${field.propertyName}; - } -#end - - } +package ${package.Entity}; + +#if(${activeRecord}) +import com.baomidou.mybatisplus.activerecord.Model; +#end +#if(${idGenType}!="ID_WORKER") +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +#end +import com.baomidou.mybatisplus.annotation.TableField; +#if(${addTabeName}) +import com.baomidou.mybatisplus.annotation.TableName; +#end +#if(${enableSwagger}) +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +#end +import lombok.Data; +import lombok.experimental.Accessors; +import java.io.Serializable; +#if(${havBigDecimal}) +import java.math.BigDecimal; +#end +#if(${table.hasDate}) +import java.util.Date; +#end + +/** + *

+ * ${table.comment} + *

+ * + * @author ${author} + * @since ${date} + */ +@Data +@Accessors(chain = true) +#if(${enableSwagger}) + +@ApiModel("${table.comment}") +#end +#if(${addTabeName}) +@TableName("${table.name}") +#end +#if(${activeRecord}) +public class ${entity} extends Model<${entity}> { +#else +public class ${entity} implements Serializable{ +#end + + private static final long serialVersionUID=1L; + +#foreach($field in ${table.fields}) +#if(${field.comment.equals("")}) +#else + /** ${field.comment} */ +#end +#if(${field.keyFlag} && ${idGenType}!="ID_WORKER") + @TableId(type = IdType.${idGenType}) +#end +#if(${enableSwagger}) + @ApiModelProperty("${field.comment}") +#end +#if($field.convert && ${field.name.toLowerCase()} != ${field.propertyName.toLowerCase()}) + @TableField(value = "${field.name}") +#end + private ${field.propertyType} ${field.propertyName}; +#end + +}