1.需求场景
数据报表大量实体类生成,模板化,降低维护难度。
2.项目环境
普通java项目 freemark
3.实现步骤
(1)导入freemark jar包(使用版本FreeMarker_2.3.23)
(2)构建模板文件,比如 entity层
entity.ftl
package ${entity.javaPackage}; /** * * TODO ${entity.javaDoc} * @author admin * */ public class ${entity.className} { /********** 属性 ***********/ <#list entity.properties as property> private ${property.javaType} ${property.propertyName};//${property.propertyComment} </#list> /********** get/set ***********/ <#list entity.properties as property> public ${property.javaType} get${property.propertyName?cap_first}() { return ${property.propertyName}; } public void set${property.propertyName?cap_first}(${property.javaType} ${property.propertyName}) { this.${property.propertyName} = ${property.propertyName}; } </#list> }
(3)生成java文件帮助类
public class AutoUtil { /*** * * @Title: createEntity * @Description: TODO 创建实体类 * @param propertyList 字段集合 * @param packageName 包全路径名称 * @param className 类名 * @param javaDoc 类注释 * @param path 文件生成路径 */ public static void createEntity(Configuration cfg, List<Property> propertyList,String packageName, String className,String javaDoc,String path){ Map<String, Object> root = new HashMap<String, Object>(); try{ Template template = cfg.getTemplate("entity.ftl"); Entity user = new Entity(); user.setJavaPackage(packageName); // 创建包名 user.setClassName(className); // 创建类名 user.setJavaDoc(javaDoc); // 类注释 // 将属性集合添加到实体对象中 user.setProperties(propertyList); // 创建.java类文件 File outDirFile = new File(path); if(!outDirFile.exists()){ outDirFile.mkdir(); } File javaFile = toJavaFilename(outDirFile, user.getJavaPackage(), user.getClassName()); //数据 root.put("entity", user); //写文件 write2File(javaFile, template, root); }catch(Exception e){ e.printStackTrace(); } } /*** * * @Title: write2File * @Description: TODO 将数据写入文件 * @param javaFile 文件对象 * @param template 模板对象 * @param root 数据 */ public static void write2File(File javaFile, Template template,Map<String,Object> root){ try{ Writer javaWriter = new FileWriter(javaFile); template.process(root, javaWriter); javaWriter.flush(); System.out.println("文件生成路径:" + javaFile.getCanonicalPath()); javaWriter.close(); // 输出到Console控制台 //Writer out = new OutputStreamWriter(System.out); // template.process(root, out); // out.flush(); // out.close(); }catch(Exception e){ e.printStackTrace(); } } /** * 创建.java文件所在路径 和 返回.java文件File对象 * @param outDirFile 生成文件路径 * @param javaPackage java包名 * @param javaClassName java类名 * @return */ public static File toJavaFilename(File outDirFile, String javaPackage, String javaClassName) { String packageSubPath = javaPackage.replace('.', '/'); File packagePath = new File(outDirFile, packageSubPath); File file = new File(packagePath, javaClassName + ".java"); if(!packagePath.exists()){ packagePath.mkdirs(); } return file; } /** * * @Title: getTableProperty2Bean * @Description: TODO 生成 Bean * @param field 字段 * @param column 列名 * @return */ public static List<Property> getTableProperty2Bean(List<String> field,List<String> column){ List<Property> propertyList = new ArrayList<Property>(); for (int i = 0; i < field.size(); i++) { Property p = new Property("String",field.get(i),column.get(i)); propertyList.add(p); } return propertyList; } /** * * @Title: array2List * @Description: TODO 数组转list * @param array */ public static List<String> array2List(String array[]){ List<String> list = new ArrayList<String>(); for (int i = 0; i < array.length; i++) { list.add(array[i]); } return list; } }
(4)测试类
package com.dx.main; public class Test { public static void main(String[] args) { Configuration cfg = new Configuration(); try { // 加载模板路径 cfg.setDirectoryForTemplateLoading(new File("./template")); cfg.setObjectWrapper(new DefaultObjectWrapper()); String path="项目绝对路径"; String col ="日期,列名1,列名2"; String fd="time,col1,col2"; String field[]=fd.split(","); String column[] = col.split(","); List<String> fieldarr =AutoUtil.array2List(field); List<String> columnarr =AutoUtil.array2List(column); //参数信息 String packageSuffix=".最后一级包名"; String beanName="TestBean"; String comment="注释"; String beanPackage="com.dx.bean"+packageSuffix; //生成java bean List<Property> propertyList = AutoUtil.getTableProperty2Bean(fieldarr, columnarr); //生成文件 AutoUtil.createEntity(cfg, propertyList,beanPackage, beanName, comment,path); } catch (IOException e) { e.printStackTrace(); } } }