Java代码生成器——基于模板快速生成web项目结构

Java代码生成器——基于模板快速生成web项目结构功能介绍根据数据库表的元数据生成支持Rest、RPC协议的工程服务(标准化的代码分层结构工程)。加速新工程的建设。代码结构:生成代码的结构依赖于模板的定义。本工程中定义分为三个工程${projectName}-domain-api:接口层-RPC接口API工程${projectName}-domain:领域层-RPC接口实现(包含domain层+基础设施层)${proje…

大家好,又见面了,我是你们的朋友全栈君。

功能介绍

根据数据库表的元数据生成支持Rest、RPC协议的工程服务(标准化的代码分层结构工程)。 加速新工程的建设。

代码结构:

生成代码的结构依赖于模板的定义。本工程中定义分为三个工程

${projectName}-domain-api:接口层 – RPC接口API工程

${projectName}-domain:领域层 – RPC接口实现(包含domain层 + 基础设施层)

${projectName}-application:应用层 – Rest接口实现

Web应用层工程

应用层,实现领域间协作、任务编排、Rest服务等。其包结构规范如下:
在这里插入图片描述

领域服务接口层工程

领域服务的API接口,包括DTO、领域服务接口等。其包结构规范如下:
在这里插入图片描述

领域服务实现层工程

领域服务的实现层,包括领域对象、领域服务及持久化层的具体实现。其包结构规范如下:
在这里插入图片描述

实现方法

引入

我们使用的是rapid-framework框架生成项目,pom中的引入如下:

		<dependency>
            <groupId>com.googlecode.rapid-framework</groupId>
            <artifactId>rapid-generator</artifactId>
            <version>4.0.6</version>
        </dependency>

模板

项目生成依赖于模板文件,新建template文件夹放置模板,同时包含以下几个文件
在这里插入图片描述

配置

generator.xml

生成项目时的配置信息,放入Resource文件夹中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>
        代码生成器配置文件:
        1.会为所有的property生成property_dir属性,如pkg=com.company => pkg_dir=com/company
        2.可以引用环境变量: ${env.JAVA_HOME} or System.properties: ${user.home},property之间也可以相互引用
    </comment>

    <entry key="basepackage">com.name</entry>

    <!-- jsp namespace: web/${namespace}/${className}/list.jsp -->
    <entry key="namespace">pages</entry>

    <entry key="outRoot">/Users/</entry>

    <!-- 需要移除的表名前缀,使用逗号进行分隔多个前缀,示例值: t_,v_ -->
    <entry key="tableRemovePrefixes">t_</entry>


    <entry key="jdbc_username">username</entry>
    <entry key="jdbc_password">password</entry>

    <entry key="jdbc_url">jdbc:mysql://XXX</entry>
    <entry key="jdbc_driver">com.mysql.jdbc.Driver</entry>


    <!-- oracle需要指定jdbc.schema,其它数据库忽略此项配置 -->
    <!--<entry key="jdbc_schema"></entry>-->
    <!--<entry key="jdbc_catalog"></entry>-->

    <!-- 数据库类型映射 -->
    <entry key="java_typemapping.java.sql.Timestamp">java.util.Date</entry>
    <entry key="java_typemapping.java.sql.Date">java.util.Date</entry>
    <entry key="java_typemapping.java.sql.Time">java.util.Date</entry>
    <entry key="java_typemapping.java.lang.Byte">Integer</entry>
    <entry key="java_typemapping.java.lang.Short">Integer</entry>
    <entry key="java_typemapping.java.math.BigDecimal">Long</entry>

</properties>

generator.properties

生成的项目基本信息

projectName=demoapp-test
groupName=com.group
versionName=1.0.0-SNAPSHOT

log4j.properties

 ### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

运行

codeGenerator.java

public class CodeGenerator { 
   

    public static void main(String[] args) throws Exception { 
   
        // 模板地址,默认为项目根目录
        String templatePath = "template";

        GeneratorFacade g = new GeneratorFacade();

        Customizer customizer = new Customizer(g.getGenerator().getOutRootDir());
        //选择配置文件风格
        customizer.determineCfgStyle();

        g.getGenerator().addTemplateRootDir(templatePath);

        // 删除生成器的输出目录
        //g.deleteOutRootDir();
        // 通过数据库表生成文件
        g.generateByTable("t_student");
        customizer.processCfgStyle();

        System.out.println("代码生成完毕");
// g.generateByTable("t_student","t_location");

        // 自动搜索数据库中的所有表并生成文件,template为模板的根目录
        // g.generateByAllTable();
        // 按table名字删除文件
        // g.deleteByTable("table_name", "template");
    }
}

Customizer.java

我们的需求中,不同的项目组成员可能使用不同风格的配置文件,有的用.properties,有的用yaml。因此在生成时,两种风格的配置文件同时生成,在根据其选择,递归地删除不需要的文件。

public class Customizer { 
   
    /** * outPath:输出目录 */
    private String outPath;

    /** * deleteStyle: 需要被删除的风格文件类型 */
    private String deleteStyle;

    public Customizer(String outPath) { 
   
        this.outPath = outPath;
    }

    /** * @Description 提示支持的配置文件风格并从控制台选择 **/
    public void determineCfgStyle(){ 
   
        System.out.println("配置文件风格选择:yaml风格输入1,properties风格输入2");
        Scanner sc = new Scanner(System.in);
        int cfgStyle = sc.nextInt();
        if (cfgStyle==1){ 
   
            this.deleteStyle = "properties";
        }else { 
   
            this.deleteStyle = "yml";
        }
    }

    /** * @Description 根据选择的风格删除冗余的配置文件 **/
    public void processCfgStyle(){ 
   
        File file = new File(outPath);
        delete(file,deleteStyle);
    }

    private void delete(File f, String includeName)
    { 
   
        File[] fi=f.listFiles();
        if (null!=fi) { 
   
            //遍历文件和文件夹
            for (File file : fi) { 
   
                //如果是文件夹,递归查找
                if (file.isDirectory()) { 
   
                    delete(file, includeName);
                } else if (file.isFile()) { 
   
                    String filename = file.getName();
                    if (filename.endsWith(includeName)) { 
   
                        file.delete();
                    }
                }
            }
        }
    }
}

打包

我们尝试将代码生成器打为jar包,并可配置个性化数据。但是可配置的文件已经写死在Resource文件夹内。

想出的第一种解决方法是,根据输入,动态修改配置文件,但打包成jar之后,jar内的文件无法修改,放弃;第二种方法是希望从外部读取指定的配置文件,但是使用的源码从classpath中直接读取,已经写死。

最终使用第二种方法实现。解决方法是:命令行运行时,指定classpass的扫描路径,指令为-Xbootclasspath/a:[当前文件夹的绝对路径]

使用方法

将release文件夹内的所有文件,放置于本地的一个文件夹内。命令行运行如下命令:

java -Xbootclasspath/a:./ -jar scc-rapid-generator.jar

再选择配置文件风格后即可生成代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131796.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python 递归的多种写法

    Python 递归的多种写法题目背景:让我们来看一些例子。要对一个数字列表(或者其他序列)求和,我们可以使用内置的sum函数,或者自己编写一个更加定制化的版本。这里是用递归编写的一个定制求和函数的示例defmysum(L): ifnotL: return0 else: returnL[0]+mysum(L[1:])这是一种最基本的递归写法,通过递归的方式将列表中的所有进行相加,典型的鸭子类型…

    2022年6月16日
    33
  • VS2013注册码_vs注册密钥

    VS2013注册码_vs注册密钥vs2012注册码YKCW6-BPFPF-BT8C9-7DCTH-QXGWCRBCXF-CVBGR-382MK-DFHJ4-C69G8MMVJ9-FKY74-W449Y-RB79G-8GJGJ4D974-9QX42-9Y43G-YJ7JG-JDYBPYCFHQ-9DWCY-DKV88-T2TMH-G7BHP亲测有效!

    2022年8月22日
    7
  • 考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)

    考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)(记录了2020考研的一些经历和自己的想法,有兴趣可看一下)考研结束后,一直想记录下自己的经历,因为各种原因,直到今天才终于动手。关于本人考研过程中整理的关于基础课和专业课的思维导图笔记,可查看本人博客:本文大概内容:一、考研相关问题1.考研前准备先说说考研之前的准备吧。若你尽早确定了考研的思想,别犹豫,越早复习越好。我想不出有什么理由,对于同一个人而言,复习时间长会比时间短的效果差。当然网上有太多人建议适当的时间就好,不用太长时间,依然考了很理想的学校。但是,你只看到了别人的成功

    2022年10月20日
    0
  • 一体化能源行业大数据平台建设,让能源更“聪明”

    一体化能源行业大数据平台建设,让能源更“聪明”现在能源行业,不论是政府政策还是群众呼应,都要求建设智能智慧能源行业,今天我们从为什么,怎么做来为大家讲解如何建设能源行业大数据。能源大数据理念是将电力、石油、燃气等能源领域数据进行综合采集、处理、分析与应用的相关技术与思想。能源大数据不仅是大数据技术在能源领域的深入应用,也是能源生产、消费及相关技术革命与大数据理念的深度融合,将加速推进能源产业发展及商业模式创新。随着信息化的深入和两化的深度融合,大数据在石油石化行业应用的前景将越来越广阔。大数据与能源行业的结合目前主要体现在三个行业。(1)石

    2022年5月18日
    41
  • string数组怎么定义对象_定义二维字符型数组

    string数组怎么定义对象_定义二维字符型数组这里是IT修真院分享课,今天要分享的主题是【string数组怎么定义】string数组的定义有三种:Stringarr[]=newString[10];//创建一个长度为10的String类型数组。Stringarr[]={“张三”,”李四”};String[]str=newString[]{“”,””,””,””,””};Stringar…

    2022年4月20日
    58
  • 3D打印上位机软件

    3D打印上位机软件本文将主要介绍在3D打印中常见的3D打印上位机软件,这类3D软件将为用户提供较大的帮助,通过对这类软件的分类,用户可以选择使用最适合自己的软件。没有恐惧,我们已经回答了所有这些问题,以及熟练程度的细节和可以下载的细节。最重要的是,他们大多数是完全免费和开源的。我们错过了您最喜爱的3D打印软件吗?让我们在评论中知道,我们会在将来的更新中添加它们。1、curaCura可以被称…

    2022年5月31日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号