使用freemarker编写代码生成器

pom.xml文件引入freemarker和jdbc依赖

<dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.16</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.22</version>
</dependency>

模板文件module.ftl, 所在位置classpath下的module中

package cn.code.bean;

public class ${myClass.className} {

    <#list myClass.fieldList as field>
        //${field.fieldRemarks}
        private ${field.fieldType} ${field.fieldName};
    </#list>

    <#list myClass.fieldList as field>
        public ${field.fieldType} get${field.fieldNameUpperFirstLetter}() {
            return ${field.fieldName};
        }

        public void set${field.fieldNameUpperFirstLetter}(${field.fieldType} ${field.fieldName}) {
            this.${field.fieldName} = ${field.fieldName};
        }
    </#list>
}

属性类Field.class

package cn.code.generate;

//属性类
public class Field {
    //字段名
    private String fieldName;
    //字段类型
    private String fieldType;
    //字段注释
    private String fieldRemarks;
    //字段名首字母大写
    private String fieldNameUpperFirstLetter;

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldType() {
        return fieldType;
    }

    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }

    public String getFieldRemarks() {
        return fieldRemarks;
    }

    public void setFieldRemarks(String fieldRemarks) {
        this.fieldRemarks = fieldRemarks;
    }

    public String getFieldNameUpperFirstLetter() {
        return fieldNameUpperFirstLetter;
    }

    public void setFieldNameUpperFirstLetter(String fieldNameUpperFirstLetter) {
        this.fieldNameUpperFirstLetter = fieldNameUpperFirstLetter;
    }
}

MyClass.java

package cn.code.generate;

import java.util.List;

public class MyClass {
    //类名
    private String className;
    //字段的集合
    private List<Field> fieldList;

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public List<Field> getFieldList() {
        return fieldList;
    }

    public void setFieldList(List<Field> fieldList) {
        this.fieldList = fieldList;
    }
}

ClassGenerator.class

package cn.code.generate;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class ClassGenerator {

    public DatabaseMetaData init(){
        DatabaseMetaData databaseMetaData = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://192.168.126.133:3306/itrip";
            String user = "root";
            String password = "123456";
            Connection connection = DriverManager.getConnection(url, user, password);
            databaseMetaData = connection.getMetaData();
        }catch (Exception e){
            e.printStackTrace();
        }
        return databaseMetaData;
    }

    //根据表名生产出类
    public MyClass generateClass(String tableName){
        MyClass myClass = new MyClass();
        List<Field> fieldList = new ArrayList<Field>();
        DatabaseMetaData databaseMetaData = init();
        try{
            ResultSet rs = databaseMetaData.getColumns(null, "%", tableName, "%");
            while(rs.next()){
                //列名
                String columnName = rs.getString("COLUMN_NAME");
                //类型
                String typeName = rs.getString("TYPE_NAME");
                System.out.println("typeName:" + typeName);
                //注释
                String remarks = rs.getString("REMARKS");

                Field field = new Field();
                field.setFieldName(columnName);
                field.setFieldType(columnTypeToFieldType(typeName));
                field.setFieldRemarks(remarks);
                field.setFieldNameUpperFirstLetter(upperFirstLetter(columnName));
                fieldList.add(field);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        myClass.setClassName(tableNameToClassName(tableName));
        myClass.setFieldList(fieldList);

        return myClass;
    }

    //字段类型转换成属性类型
    public String columnTypeToFieldType(String columnType){
        String fieldType = null;
        switch (columnType) {
            case "INT":
                fieldType = "Integer";
                break;
            case "VARCHAR":
                fieldType = "String";
                break;
            case "CHAR":
                fieldType = "String";
                break;
            case "DATE":
                fieldType = "Date";
                break;
            case "BIGINT":
                fieldType = "Long";
                break;
            default:
                fieldType = "String";
                break;
        }
        return fieldType;
    }

    //首字母大写
    public String upperFirstLetter(String src){
        String firstLetter = src.substring(0, 1).toUpperCase();
        String otherLetters = src.substring(1);
        return firstLetter + otherLetters;
    }

    //表名转类名
    public String tableNameToClassName(String tableName){
        StringBuilder className = new StringBuilder();
        //aa_bb_cc  AaBbCc
        String[] split = tableName.split("_");
        for (String item : split) {
            className.append(upperFirstLetter(item));
        }
        return className.toString();
    }
}

Generator.class

package cn.code.generate;

import cn.code.User;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Generator {

    public static void main(String[] args) throws Exception{
        //创建Configuration对象
        Configuration configuration = new Configuration();
        //设置模板所在目录
        String path = Generator.class.getClassLoader().getResource("module").getPath();
        configuration.setDirectoryForTemplateLoading(new File(path));
        //获取模板
        Template template = configuration.getTemplate("class.ftl");
        //设置数据并执行
        Map map = new HashMap();

        ClassGenerator classGenerator = new ClassGenerator();
        MyClass myClass = classGenerator.generateClass("user");

        map.put("myClass", myClass);

        Writer writer = new OutputStreamWriter(new FileOutputStream("G:/"+myClass.getClassName()+".java"));

        template.process(map, writer);
    }
}



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FreeMarker是一个用于生成动态内容的Java模板引擎。它是基于模板和数据模型的,可以将模板文件和数据模型结合起来生成最终的输出结果。 Java基于FreeMarker生成器源码的主要涉及以下几个方面: 1. 导入必要的包:首先需要导入FreeMarker的相关包,包括FreeMarker的核心类、配置类以及模板加载器等。这些包的导入是使用FreeMarker进行模板生成的基础。 2. 配置模板引擎:通过创建Configuration对象来配置FreeMarker模板引擎的相关设置。可以设置模板文件的加载路径、字符编码、错误处理方式等。 3. 加载模板文件:使用TemplateLoader从指定的路径或者是classpath中加载模板文件。加载模板文件后,可以将其编译成Template对象,以便后续的模板生成。 4. 准备数据模型:根据需要的输出结果,准备好数据模型。数据模型可以是一个Java对象,也可以是一个Map,包含了模板需要的各种数据。 5. 生成输出结果:在模板生成时,将数据模型传入模板,调用process方法来生成输出结果。process方法会将数据模型与模板结合起来,生成最终的输出结果。 Java基于FreeMarker生成器源码的核心思想是使用模板引擎将模板文件和数据模型结合起来,生成最终的输出结果。通过配置模板引擎、加载模板文件、准备数据模型,可以实现各种类型的输出结果,如HTML页面、XML文档、邮件模板等。使用FreeMarker可以实现模板的复用,提高系统的可维护性和扩展性。 ### 回答2: FreeMarker是一款基于Java的模板引擎,它的生成器源码提供了一种将模板文件与数据进行组合并生成输出文件的机制。 FreeMarker生成器源码主要包含以下几个关键部分: 1. 模板文件:模板文件是FreeMarker生成器的核心。它使用FreeMarker的模板语法,定义了输出文件的结构和内容。模板文件中可以嵌入变量、条件判断语句、循环语句等,通过填充数据来生成最终的输出文件。 2. 数据源:生成器源码接收数据源作为输入,这些数据源可以是数据库查询结果、API返回的数据、用户输入等。数据源可以包含多个数据对象,每个对象对应模板文件中的一个变量。数据源可以通过Java代码从各种位置获取,然后传递给生成器来生成最终的输出文件。 3. FreeMarker配置:配置对象包含了一些生成器的基本设置,比如模板文件所在的路径、输出文件的编码格式等。配置对象可以通过Java代码进行定制,以满足生成器的需求。 4. 模板引擎:模板引擎是FreeMarker生成器的核心处理引擎,它负责将模板文件和数据源进行组合,并生成最终的输出文件。模板引擎会根据模板文件中的语法规则,将数据源的数据填充到模板文件的相应位置,生成最终的输出文件。 5. 输出文件:生成器会将最终的输出文件保存到指定的位置,可以是本地文件系统、网络位置或者其他目标。 通过以上几个关键部分的协作,FreeMarker生成器源码实现了将模板文件和数据源进行组合的功能,方便开发人员根据需求生成各种类型的输出文件。它可以应用于各种场景,比如生成静态网页、生成报表、生成邮件内容等等。其灵活且可定制的特性,使得Java基于FreeMarker生成器源码成为了开发人员常用的工具之一。 ### 回答3: Java基于Freemarker生成器源码是一种使用Java语言和Freemarker模板引擎的代码,用于根据模板生成特定类型的文本文件(如HTML、XML、Java等)。 Java基于Freemarker生成器源码的核心思路是将模板文件与数据模型进行结合,生成最终的文本文件。首先,需要准备好模板文件,这个模板文件是一个普通的文本文件,其中嵌入了一些特殊的Freemarker语法标签。这些标签用来表示可替换的部分、循环、条件语句等等。 接下来,通过Java代码读取模板文件,并使用Freemarker引擎解析模板文件。这一步骤将模板文件转换成一个Freemarker的Template对象,然后将数据模型与模板进行合并。数据模型可以是一个Java对象,也可以是一个Map对象。在合并过程中,模板中的Freemarker语法标签会被替换成具体的值或逻辑,从而生成最终的文本文件。 最后,通过Java代码将生成的文本文件保存到指定的位置。生成器源码中通常包含一些文件操作的逻辑,用于创建、保存或输出生成的文本文件。 使用Java基于Freemarker生成器源码可以提高开发的效率和灵活性。通过准备好模板文件和相应的数据模型,我们可以快速生成各种类型的文本文件,无需手动编写大量重复的代码。同时,由于模板文件是可配置的,可以根据具体需求动态生成不同的文本内容。这使得代码的维护和修改更加方便。 总结来说,Java基于Freemarker生成器源码是一种利用Freemarker模板引擎和Java语言实现的代码,用于根据模板和数据模型生成特定类型的文本文件。它能够提高开发效率和灵活性,使得文本文件的生成、修改和维护更加方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值