Skip to content

code generator

sika-code edited this page Jul 20, 2019 · 3 revisions

code-generator【代码生成器】

What

  • 模板化代码生成器

Why

  • 一键生成模版化代码
  • 减少重复性工作
  • 提高开发效率

How

  • 基于mybatis-plus-generator
  • 基于Freemarker模板构建

示例

1. 依赖

   <dependencies>
        <dependency>
            <groupId>com.lxzl.skull.systemframework</groupId>
            <artifactId>code-generator</artifactId>
            <version>${com.lxzl.skull.version}</version>
        </dependency>
    </dependencies>

2. 配置

@Slf4j
public class GenerateCodeConfig {

    /** 路径配置 */
    private static String projectPrefix = "standard-footer-demo";
    private static String basePackagePathPrefixForJava = "src/main/java/com/lxzl/skull/standard/footer/demo/business";
    private static String basePackagePathPrefixForXml = "src/main/resources/mapper";
    private static String modulePackage = "com.lxzl.skull.standard.footer.demo";

    /** 数据库配置 */
    private static String tablePrefix = "risk_system_";
    private static String dataBaseUrl = "192.168.10.205";
    private static String dataBaseName = "lxzl_risk_system";
    private static String dataBasePort = "3306";
    private static String username = "lxzldev";
    private static String password = "lxzldev";

    // 构建生成代码的数据传输对象
    public static GeneratorCodeDTO buildGeneratorCodeDTO(String tableName, String author) {
        GeneratorCodeDTO generatorCodeDTO = new GeneratorCodeDTO();

        /** 父包 */
        generatorCodeDTO.setParentPackage(modulePackage + ".business")
                .setModulePackage(modulePackage)
                /** common的path */
                .setPathForDataaccess(buildFullPathForJava("dataaccess"))
                /** common类的path */
                .setPathForCommon(buildFullPathForJava("common"))
                /** service类path */
                .setPathForCore(buildFullPathForJava("core"))
                /** web的path */
                .setPathForWeb(buildFullPathForJava("web"))
                /** api的path */
                .setPathForApi(buildFullPathForJava("api"))
                /** xml的path */
                .setPathForXml(buildFullPathForXml("dataaccess"))

                .setDataBaseUrl(dataBaseUrl)
                .setDataBaseName(dataBaseName)
                .setDataBasePort(dataBasePort)
                .setUsername(username)
                .setPassword(password)

                /** 表名 */
                .setTableName(tableName)
                /** 表前缀 */
                .setSubPrefix(tablePrefix)
                /** 作者 */
                .setAuthor(author);

        return generatorCodeDTO;
    }
    
    // 构建生成java文件的全路径
    private static String buildFullPathForJava(String projectSuffix) {
        StringBuilder stringBuilder = buildFullPathCore(projectSuffix, basePackagePathPrefixForJava);
        log.info(projectSuffix + "的全路径为:" + stringBuilder);
        return stringBuilder.toString();
    }

    // 构建生成xml文件的全路径
    private static String buildFullPathForXml(String projectSuffix) {
        StringBuilder stringBuilder = buildFullPathCore(projectSuffix, basePackagePathPrefixForXml);
        log.info(projectSuffix + "的全路径为:" + stringBuilder);
        return stringBuilder.toString();
    }

    // 构建全路径的核心方法
    protected static StringBuilder buildFullPathCore(String projectSuffix, String basePackagePathPrefix) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("/")
                .append(projectPrefix)
                .append("-")
                .append(projectSuffix)
                .append("/")
                .append(basePackagePathPrefix);
        return stringBuilder;
    }

3. 使用

/**
 * 代码生成器启动类
 *
 * @author daiqi
 * @create 2019-07-11 22:32
 */
public class GenerateCodeApplication {
    private static String tableName = "risk_system_access_rule_type";
    private static String author = "zhangsan";

    public static void main(String[] args) {
        GeneratorCodeDTO generatorCodeDTO = GenerateCodeConfig.buildGeneratorCodeDTO(tableName, author);
        new GenerateCodeHandler().generateCode(generatorCodeDTO);
    }
}


拓展

修改原生成类【例如:dto】

1 src/main/resources下新建templates目录

2 新建dto.java.ftl文件,并复写规则

移除多余类【例如:dto】

1 创建GenerateCodeHandlerCustomer并继承GenerateCodeHandler,重写相关方法

 import com.lxzl.skull.GenerateCodeHandler;
 
 /**
  * @author daiqi
  * @create 2019-07-12 9:32
  */
 public class GenerateCodeHandlerCustomer extends GenerateCodeHandler {
     /** -----------------------以下方式2选1---------------------- */
     /**
      * 方式一:重写生成方法,移除不需要生成类的方法
      */
     @Override
     protected void generateToCommon() {
         // 移除不需要的类
         // generateDTO();
         generateQuery();
         generateConstant();
         generateErrorCodeEnum();
     }
 
     /**
      * 方式二:将不需要生成的类变为空实现
      */
     @Override
     public void generateDTO() {
 
     }
 }

2 使用GenerateCodeHandlerCustomer的对象调用generateCode

 public static void main(String[] args) {
     GeneratorCodeDTO generatorCodeDTO = GenerateCodeConfig.buildGeneratorCodeDTO(tableName, author);
     new GenerateCodeHandlerCustomer().generateCode(generatorCodeDTO);
 }

添加新类【例如:api】

1 新建模板类【src/main/resources/templates/api.java.ftl】

2 创建GenerateCodeHandlerCustomer并继承GenerateCodeHandler,重写相关方法

 
 /**
  * @author daiqi
  * @create 2019-07-12 9:32
  */
 public class GenerateCodeHandlerCustomer extends GenerateCodeHandler {
      @Override
     protected void generateToWeb() {
         super.generateToWeb();
         generateApi();
     }

     protected void generateApi() {
         String templatePath = "/templates/api_customer.java.ftl";
         String filePath = pathForApi + "/" + moduleName + "/api/";
         String classBodySuffix = "Api";
         String packageKey = "Api";
         String subPackage = "api";
 
         generateCodeCoreForCustomer(templatePath, filePath, classBodySuffix, packageKey, subPackage);
     }
 }

3 使用GenerateCodeHandlerCustomer的对象调用generateCode

 public static void main(String[] args) {
     GeneratorCodeDTO generatorCodeDTO = GenerateCodeConfig.buildGeneratorCodeDTO(tableName, author);
     new GenerateCodeHandlerCustomer().generateCode(generatorCodeDTO);
 }

常见问题

代码生成后找不到代码文件

  • 检查代码生成器启动类的Configurations中的Working directory是否为项目目录