自动生成代码freemarker实现,教你java手写自动代码生成器,自动生成controller,service,mapper,等相关文件
自己闲着没事就是这些了些自动代码生成器,根据实体类,利用反射自动生成controller,service,mapper,等相关文件。下面是具体代码
如何使用可以参照我github上的项目,里面有具体的模板文件
https://github.com/kongGe55/mapper_test
这个项目结合了这个工具类的具体使用,大家可以根据自己的项目业务自由定制修改,甚至可以修改后生成后台html模板文件
package cn.haiwei.csovsserver;import cn.haiwei.csovsserver.model.Role;import cn.haiwei.csovsserver.model.ScheduledTasks;import freemarker.template.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.*;import java.lang.reflect.Field;import java.util.*;/ * ClassName: GeneratorCode * Description: * date: 2019/6/27 10:10 * * @author JiLiugang * @version 1.0 * @since JDK 1.8 */public class GeneratorCode { private final static String TEMPLATE_PATH = "src\\main\\java\\cn\\jiliugang\\package\\templates"; private static Configuration configuration = null; private static List<Map<String,String>> fieldNameTypeMap = new ArrayList<>(); private static Logger logger = LoggerFactory.getLogger(GeneratorCode.class); //项目主包名称 private final static String packageName = "cn.jiliugang.package"; public static void main(String[] args) { GeneratorCode.generatorCode(Role.class); } public static void generatorCode(Class entityClass) { //Configuration initConfiguration(); //初始化查找实体类属性信息 fieldNameTypeMap = getFieldInfo(entityClass); //得到对应渲染数据 Map<String,Object> serviceClassInfo = getClassInfo(entityClass,"Service"); Map<String,Object> implClassInfo = getClassInfo(entityClass,"ServiceImpl"); Map<String,Object> mapperClassInfo = getClassInfo(entityClass,"Mapper"); Map<String,Object> controllerClassInfo = getClassInfo(entityClass,"Controller"); Map<String,Object> mapperXml = getClassInfo(entityClass,"MapperXml"); generatorFile(mapperClassInfo); generatorFile(serviceClassInfo); generatorFile(implClassInfo); generatorFile(controllerClassInfo); generatorFile(mapperXml); } private static void initConfiguration() { configuration = new Configuration(Configuration.getVersion()); try { configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH)); } catch (IOException e) { e.printStackTrace(); } } private static List<Map<String, String>> getFieldInfo(Class entityClass) { //得到属性名 Field[] declaredFields = entityClass.getDeclaredFields(); List<Map<String, String>> fieldNameTypeMap = new ArrayList<>(); for (Field field : declaredFields){ Map<String, String> fieldMap = new HashMap<>(); String type = field.getType().getSimpleName(); String name = field.getName(); //将属性名和对应类型放入map中 fieldMap.put("name",name); fieldMap.put("type",type); fieldNameTypeMap.add(fieldMap); } return fieldNameTypeMap; } private static Map getClassInfo(Class entity,String typeName) { Map<String,Object> map = new HashMap<>(); map.put("templateName",typeName+".ftl"); map.put("packageName",packageName); //实体对象名称 String className = entity.getSimpleName(); map.put("className",className); map.put("classParamName",toLowerCaseFirstOne(className)); map.put("EntityClassPath",entity.getName()); //得到路径 String realPath = null; String classPath = null; String classTypeName = null; Boolean isXml = false; if ("Service".equals(typeName)){ realPath = "src.main.java."+packageName+".service"; classPath = packageName+".service"; classTypeName = className+"Service"; }else if ("ServiceImpl".equals(typeName)){ realPath = "src.main.java."+packageName+".service.impl"; classPath = packageName+".service.impl"; classTypeName = className+"ServiceImpl"; }else if ("Mapper".equals(typeName)){ realPath = "src.main.java."+packageName+".mapper"; classPath = packageName+".mapper"; classTypeName = className+"Mapper"; }else if ("Controller".equals(typeName)){ realPath = "src.main.java."+packageName+".controller"; classPath = packageName+".controller"; classTypeName = className+"Controller"; }else if ("MapperXml".equals(typeName)){ realPath = "src.main.resources.mapper"; classTypeName = className+"Mapper"; //应对嵌套渲染问题 map.put("sqlPinJie","#{"); isXml = true; } map.put("isXml",isXml); map.put("classTypeName",classTypeName); map.put("realPath",realPath); map.put("classPath",classPath); //日期 map.put("date",new Date().toString()); map.put("fields",fieldNameTypeMap); return map; } public static void generatorFile(Map<String,Object> classInfo){ Writer out = null; // step4 加载模版文件 Template template = null; try { template = configuration.getTemplate((String) classInfo.get("templateName")); // step5 生成数据 String filePath = (String) classInfo.get("realPath"); filePath = filePath.replaceAll("\\.","\\\\"); File directory = new File(filePath); if (!directory.exists()){ directory.mkdirs(); } File docFile = null; if ((Boolean) classInfo.get("isXml")){ docFile = new File(filePath + "\\" + classInfo.get("classTypeName")+".xml"); }else { docFile = new File(filePath + "\\" + classInfo.get("classTypeName")+".java"); } out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile))); // step6 输出文件 template.process(classInfo, out); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } if ((Boolean) classInfo.get("isXml")){ logger.info("----------------"+classInfo.get("classTypeName")+".xml 文件创建成功 !"); }else { logger.info("----------------"+classInfo.get("classTypeName")+".java 文件创建成功 !"); } } //首字母转小写 public static String toLowerCaseFirstOne(String s){ if(Character.isLowerCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); }}