风也温柔

计算机科学知识库

别一种方法,使用freemarker的局限太大生成,别用freemarker生成根据XML文件批量生成java类——freemarker

  谈到根据XML生成JAVA类,很容易联想到 JAXB方法生成,但是用JAXB的局限太大,所以在这里我介绍别一种方法,使用freemarker生成。

  使用freemarker要引入freemarker.jar。(我提供的实例中有此文件)

  freemarker可以自己定义模版,也可以批量生成java类,最重要的,不仅仅是只能生成POJO类型的类根据xsd生成java类,也可以生成业务类型的类。为了说明它能生成业务类型的类,我将在每个POJO里加上一个打包的方法(将所有字段拼接起来)。

  在开始之前,我先介绍下freemark的语法

  freemark读取参数的方式是$+{},变量名写在大括号中,如下

  ${packageName}

  除取值外,freemarker其他的语法都是使用标签形式,只是多了个“#”号。我以if-else if -else语句为列

  

    ...
    
    ...
    
    ......
    
    ...

  循环。格式:,如下:

  

    
    //相当于java中的
    for(Object prop : list) {

  freemarker循环提供了一些常用变量,如

   //prop为声明的临时变量

    prop_index:是list当前值的下标

  首先准备一个XML文件,如下所示。每个代表一个POJO类,id为表名,field表示字段别一种方法,使用freemarker的局限太大生成,别用freemarker生成根据XML文件批量生成java类——freemarker,len为字段长度:

  有了XML文件以后,要写生成类的模版根据xsd生成java类,模版文件格式为.ftl。我这里取名为tableTemplate.ftl,内容如下:

   package ${packageName};

    import java.util.Formatter;
    public class ${className} {
        
        private ${prop.type} ${prop.name};
            
        
        
        public ${prop.type} get${prop.name?cap_first}(){
            return ${prop.name};
        }
            
        public void set${prop.name?cap_first}(${prop.type} ${prop.name}){
            this.${prop.name} = ${prop.name};
        }
            
        
        public static String packData(${className} obj) {
            StringBuffer buff = new StringBuffer();
            Formatter format = new Formatter(buff);
            
            format.format("${formatStr}", obj.get${prop.name?cap_first}(), obj.get${prop.name?cap_first}());
            format.close();
            
            return buff.toString();
        }

  接下来只要将参数传入就可以生成java代码了。传入时必须以map的形式传递,

   //如之前的packageName

    map.put("packageName", "....");
    //如之前的list

  生成java类的代码如下:

   //ConfigurationHelper工具类,设置一些基本信息

    freemarker.template.Template template = ConfigurationHelper.getConfiguration("模版路径").getTemplate("模版名");
    File output = new File(outPath);
    java.io.Writer writer = new java.io.FileWriter(output);
    template.process(data, writer);

  具体的实现大家可以下载我写好的实例看看:

  文章来源:https://blog.csdn.net/mu_wangyue/article/details/9878747