用java代码编写工具类,实现entity、dao 、service 、serviceImpl自动生成。java
参考开源csdn一位博友写的,改动了部分实现本身需求规则node
http://blog.csdn.net/u010137431/article/details/46595487spring
生成配置项:数据库
<?xml version="1.0" encoding="UTF-8"?> <root> <!-- 模板配置 模板文件路径和model、dao、service对应须要的模板名--> <ftl path="\\src\\main\\java\\com\\wjw\\framework\\generate\\ftl"> <param name="model">/model.ftl</param> <param name="dao">/dao.ftl</param> <param name="service">/service.ftl</param> </ftl> <!-- service.ftl须要的信息 path service包路径 packageName service中的java文件须要指定包名 --> <service path="\\src\\main\\java\\com\\wjw\\xincms\\server\\service"> <packageName>com.wjw.xincms.server.service</packageName> </service> <!-- dao.ftl须要的信息 path dao包路径 packageName dao中的java文件须要指定包名 --> <dao path="\\src\\main\\java\\com\\wjw\\xincms\\server\\dao"> <packageName>com.wjw.xincms.server.dao</packageName> </dao> <!-- model.ftl须要的信息 path model包路径 packageName model中的java文件须要指定包名 class 实体类名 desc 类名注释 --> <models path="\\src\\main\\java\\com\\wjw\\xincms\\entity"> <packageName>com.wjw.xincms.entity</packageName> <model> <className>User</className> <desc>用户</desc> </model> <model> <className>Role</className> <desc>角色</desc> </model> </models> </root>
读取配置项,生成的实体、dao、service的位置,须要生成的实体类等:框架
package com.wjw.framework.generate; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import freemarker.template.TemplateException; public class Generate { public static void main(String[] args) throws IOException, TemplateException, ParserConfigurationException, SAXException { String ftlPath = ""; //模板路径 //model参数 String ModelftlName = ""; //model模板名称 String ModelfilePath = ""; //模板路径 String ModelpackgeName = "";//模板包名 List<Attr> modellist = new ArrayList<Attr>(); //须要生成的实体对象集合 // dao参数 String DaoftlName = ""; //dao模板名称 String DaofilePath = ""; //dao路径 String DaopackgeName = ""; //dao包名 //service参数 String ServiceftlName = ""; //Service模板名称 String ServicefilePath = ""; //service路径 String ServicepackgeName = "";//service包名 //配置文件位置 File xmlFile = new File(System.getProperty("user.dir"), "\\src\\main\\java\\com\\wjw\\framework\\generate\\GenerateConf.xml"); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document doc = builder.parse(xmlFile); Element rootElement = doc.getDocumentElement(); //获取根元素 Node ftlnode = rootElement.getElementsByTagName("ftl").item(0); ftlPath = ((Element)ftlnode).getAttribute("path"); NodeList params = ftlnode.getChildNodes(); for(int i = 0; i < params.getLength(); i++){//获取对应模板名称 Node node = params.item(i); if(node.getNodeType() != Node.ELEMENT_NODE) continue; Element e = (Element)node; if(e.getAttribute("name").trim().equals("model")) ModelftlName = node.getFirstChild().getNodeValue(); if(e.getAttribute("name").trim().equals("dao")) DaoftlName = node.getFirstChild().getNodeValue(); if(e.getAttribute("name").trim().equals("service")) ServiceftlName = node.getFirstChild().getNodeValue(); } //获取对应service参数 Node servicenode = rootElement.getElementsByTagName("service").item(0); ServicefilePath = ((Element)servicenode).getAttribute("path"); ServicepackgeName = servicenode.getChildNodes().item(1).getFirstChild().getNodeValue(); //获取对应dao参数 Node daonode = rootElement.getElementsByTagName("dao").item(0); DaofilePath = ((Element)daonode).getAttribute("path"); DaopackgeName = daonode.getChildNodes().item(1).getFirstChild().getNodeValue(); //获取对应model参数 Node modelnode = rootElement.getElementsByTagName("models").item(0); ModelfilePath = ((Element)modelnode).getAttribute("path"); params = modelnode.getChildNodes(); for(int i = 0; i < params.getLength(); i++){ Node node = params.item(i); if(node.getNodeType() != Node.ELEMENT_NODE) continue; Element e = (Element)node; if(e.getNodeName().trim().equals("packageName")) ModelpackgeName = node.getFirstChild().getNodeValue(); if(e.getNodeName().trim().equals("model")){ Attr attr = new Attr(); NodeList attrnode = node.getChildNodes(); for(int j = 0; j < attrnode.getLength(); j++){ Node anode = attrnode.item(j); if(anode.getNodeType() != Node.ELEMENT_NODE) continue; Element ae = (Element)anode; if(ae.getTagName().trim().equals("className")) attr.setClassName(anode.getFirstChild().getNodeValue()); if(ae.getTagName().trim().equals("desc")) attr.setDesc(anode.getFirstChild().getNodeValue()); } modellist.add(attr); } } GenerateUtil gt =new GenerateUtil("wjw",ftlPath); gt.GenerateDao(DaoftlName, DaofilePath, DaopackgeName, ModelpackgeName,modellist); gt.GenerateService(ServiceftlName, ServicefilePath, ServicepackgeName, DaopackgeName, ModelpackgeName,modellist); gt.GenerateModel(ModelftlName, ModelfilePath, ModelpackgeName, modellist); } }
GenerateUtil gt =new GenerateUtil("wjw",ftlPath);//传入生成的做者名 ,生成模板路径dom
//生成model实体类eclipse
gt.GenerateModel(ModelftlName, ModelfilePath, ModelpackgeName, modellist);ide
//生成dao工具
gt.GenerateDao(DaoftlName, DaofilePath, DaopackgeName, ModelpackgeName,modellist);ui
//生成service和serviceImpl实现
gt.GenerateService(ServiceftlName, ServicefilePath, ServicepackgeName, DaopackgeName, ModelpackgeName,modellist);
获取须要生成的参数传入freemarker模板中,写入到指路径下
package com.wjw.framework.generate; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.wjw.utils.DateUtil; import org.wjw.utils.HumpUtils; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; /** * @desc 生成工具类 * @author wjw * @date 2016年12月21日下午4:31:29 */ public class GenerateUtil { public String author="wjw";//设置默认做者 public String ftlPath;//模板所在路径 public GenerateUtil() { } public GenerateUtil(String author,String ftlPath) { this.author = author; this.ftlPath = ftlPath; path_Judge_Exist(ftlPath); } /** * @desc model生成方法 * @param ftlName 模板名 * @param filePath model层的路径 * @param packageName model包名 * @param list model参数集合 */ public void GenerateModel(String ftlName, String filePath, String packageName, List<Attr> list) throws IOException, TemplateException{ path_Judge_Exist(filePath); //实体类须要其余参数 Map<String,Object> root = new HashMap<String, Object>(); root.put("packageName", packageName); root.put("author", author); for(Attr a : list){ String className = a.getClassName(); root.put("desc", a.getDesc()); root.put("createDate", DateUtil.formatDate(new Date(), "yyyy年MM月dd日aK:mm:ss") ); root.put("className", className); root.put("table", HumpUtils.camelToUnderline2(className)); Configuration cfg = new Configuration(); String path = System.getProperty("user.dir") + ftlPath; cfg.setDirectoryForTemplateLoading(new File(path)); Template template = cfg.getTemplate(ftlName); printFile(root, template, filePath, className); } } /** * @desc dao生成方法 * @param ftlName * @param filePath * @param packageName * @param modelPackageName * @param list * @throws IOException * @throws TemplateException */ public void GenerateDao(String ftlName, String filePath, String packageName, String modelPackageName,List<Attr> list) throws IOException, TemplateException { path_Judge_Exist(filePath); //实体类须要其余参数 Map<String,Object> root = new HashMap<String, Object>(); root.put("packageName", packageName); root.put("author", author); root.put("modelPackageName", modelPackageName); for(Attr a : list){ String modelClassName = a.getClassName(); root.put("modelClassName", modelClassName); root.put("desc", a.getDesc()); root.put("createDate", DateUtil.formatDate(new Date(), "yyyy年MM月dd日aK:mm:ss") ); Configuration cfg = new Configuration(); String path = System.getProperty("user.dir") + ftlPath; cfg.setDirectoryForTemplateLoading(new File(path)); Template template = cfg.getTemplate(ftlName); printFile(root, template, filePath, modelClassName + "Dao"); } } /** * @desc servic接口和实现的生成方法 * @param ftlName * @param filePath * @param packageName * @param daoPackageName * @param modelPackageName * @param list * @throws IOException * @throws TemplateException */ public void GenerateService(String ftlName,String filePath, String packageName,String daoPackageName, String modelPackageName,List<Attr> list) throws IOException, TemplateException { String ImplFilePath = filePath + "\\impl"; path_Judge_Exist(filePath); path_Judge_Exist(ImplFilePath); Map<String,Object> root = new HashMap<String, Object>(); root.put("author", author); root.put("daoPackageName", daoPackageName); root.put("packageName", packageName); root.put("implPackageName", packageName+".impl"); root.put("modelPackageName", modelPackageName); for(Attr a : list){ String className = a.getClassName();//类名 root.put("desc", a.getDesc()); root.put("createDate", DateUtil.formatDate(new Date(), "yyyy年MM月dd日aK:mm:ss") ); root.put("className", className); root.put("implflag", false);//接口 Configuration cfg = new Configuration(); String path = System.getProperty("user.dir") + ftlPath; cfg.setDirectoryForTemplateLoading(new File(path)); Template template = cfg.getTemplate(ftlName); printFile(root, template, filePath, className + "Service");//生成service接口 root.put("implflag", true);//实现 printFile(root, template, ImplFilePath, className + "ServiceImpl");//生成service实现 } } //判断包路径是否存在 public static void path_Judge_Exist(String path){ File file = new File(System.getProperty("user.dir"), path); if(!file.exists()) file.mkdirs(); } //输出到文件 public static void printFile(Map<String, Object> root, Template template, String filePath, String fileName) throws IOException, TemplateException { String path = System.getProperty("user.dir") + filePath; File file = new File(path, fileName + ".java"); if(!file.exists()) file.createNewFile(); FileWriter fw = new FileWriter(file); template.process(root, fw); fw.close(); } //输出到控制台 public static void printConsole(Map<String, Object> root, Template template) throws TemplateException, IOException { StringWriter out = new StringWriter(); template.process(root, out); System.out.println(out.toString()); } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getFtlPath() { return ftlPath; } public void setFtlPath(String ftlPath) { this.ftlPath = ftlPath; } }
下面贴出模板model、dao、service模板:
package ${packageName}; import javax.persistence.Entity; import javax.persistence.Table; import com.wjw.framework.spring.persistence.BaseEntity; /** * @desc ${desc}-实体类 * @author ${author} * @date ${createDate} */ @Entity @Table(name = "${table}") public class ${className} extends BaseEntity { }
package ${packageName}; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.PagingAndSortingRepository; import ${modelPackageName}.${modelClassName}; /** * @desc ${desc}-Dao * @author ${author} * @date ${createDate} */ public interface ${modelClassName}Dao extends PagingAndSortingRepository<${modelClassName}, String>, JpaSpecificationExecutor<${modelClassName}> { }
<#if !implflag> package ${packageName}; import ${modelPackageName}.${className}; /** * @desc ${desc}-服务接口 * @author ${author} * @date ${createDate} */ public interface ${className}Service { public void save(${className} ${className?lower_case}); } <#else> package ${implPackageName}; import ${modelPackageName}.${className}; import ${daoPackageName}.${className}Dao; import ${packageName}.${className}Service; import org.springframework.beans.factory.annotation.Autowired; /** * @desc ${desc}-服务实现 * @author ${author} * @date ${createDate} */ public class ${className}ServiceImpl implements ${className}Service { @Autowired private ${className}Dao ${className?lower_case}Dao; @Override public void save(${className} ${className?lower_case}) { // TODO Auto-generated method stub } } </#if>
下面是接收须要生成的实体对象类:
package com.wjw.framework.generate; public class Attr { private String className; //类名 private String desc; //描述 public Attr() { // TODO Auto-generated constructor stub } public Attr(String className,String desc) { this.className=className; this.desc=desc; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
最后生成的代码截图
可根据本身用的框架来修改模板实现本身的需求。
我去掉了具体的字段生成,在需求中字段是常常增长修改的,添加几个字段用eclipse的快捷键shirt+alt+s也能快速生成set、get方法,经过数据库生成实体类我用不到,个人是实体类经过hibernate生成数据库表,根据本身的需求修改生成规则