最近寫項目,大量重復的代碼寫的想吐,於是就想構建自己的自動代碼生成器來偷點懶
參考文檔:https://blog.csdn.net/jilongliang/article/details/50196971
在上述文檔基礎上改成自己需要的代碼結構-----首先把數據庫相關的去掉,嗯,有其他生成sqlservice 數據庫
實體類的代碼,見上傳文件
結果結構展示

1 准備jar
commons-lang3-3.8.jar
2 后台代碼的書寫
Java 文件生成的代碼工具類 FileUtils.java
package com.autojava.test; import java.io.File; import java.io.FileWriter; public class FileUtils { /** * 把生成的文件都保存. * @param path * @param data */ public static void save(String path, String data) { try { File file = new File(path); File dir = new File(path.substring(0, path.lastIndexOf("/"))); if(!dir.exists()) { dir.mkdirs(); } FileWriter out = new FileWriter(file); out.write(data); out.flush(); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } }
核心類-----CodeGenerator.java
package com.autojava.test; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; @SuppressWarnings("all") public class CodeGenerator { /*************************變量****Begin************************************/ private static final String myEmail="";//Email private static final String Version="1.0";//版本 private static String Description="自動代碼生成器";//描述 public static final String ENTER = "\n";//換行 public static final String TAB = " ";//tab public static final String NAME = "NAME"; public static final String TABLE_CAT = "TABLE_CAT";//表 catalog public static final String TABLE_SCHEM = "TABLE_SCHEM";//表 schema public static final String TABLE_NAME = "TABLE_NAME";//表名 public static final String TABLE_TYPE = "TABLE_TYPE";//表類型 public static final String REMARKS = "REMARKS";//表注釋 public static final String TYPE = "TYPE";//表的類型 public static final String SIZE = "SIZE";//大小 public static final String CLASS = "CLASS";//類別 /*************************變量****End************************************/ //從配置獲取工程的包名路徑 public static String ROOT_PACKAGE = "com.prison"; //獲取作者. public static final String AUTHOR = "JS"; public static final String NOW_DATE = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); /** * 生成封裝好模板的類文件 * @param className * @throws Exception */ public void todo(String className,String rootpackage,String description,String mappingUrl) throws Exception { //設置參數 this.ROOT_PACKAGE=rootpackage; this.Description=description; this.createRestControllerClass(className,mappingUrl); this.createViewControllerClass(className, mappingUrl); this.createDaoClass(className); this.createServiceClass(className); this.createServiceImplClass(className); } /*** * 生成dao接口interface類的代碼 * * @throws Exception */ public void createDaoClass(String className) throws Exception { String objectName = StringUtils.uncapitalize(className); StringBuilder sb = new StringBuilder(); sb.append("package " + ROOT_PACKAGE + ".dao;").append(ENTER); //sb.append("import java.io.Serializable;").append(ENTER); //sb.append("import java.util.List;").append(ENTER); sb.append("import org.springframework.stereotype.Repository;").append(ENTER); //sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER); //sb.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER); //sb.append("import com.flong.modules.pojo."+className+";").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n"); sb.append(" * @Version:").append(Version).append(ENTER); sb.append(" * @Description:").append(Description).append(ENTER); // sb.append(" * @Email:").append(myEmail).append("\n*/"); sb.append("\n*/"); sb.append(ENTER); sb.append("@Repository").append(ENTER); sb.append("public interface " + className + "Dao{").append(ENTER); // sb.append("/**查詢*/").append(ENTER); // sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER); // sb.append("/**保存數據*/").append(ENTER); //sb.append(" public void saveData("+className+" "+objectName+");").append(ENTER); //sb.append("/**更新數據*/").append(ENTER); //sb.append(" public void updateData("+className+" "+objectName+");").append(ENTER); //sb.append("/**刪除數據*/").append(ENTER); // sb.append(" public void deleteData(Long pk);").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("}"); sb.append(ENTER); FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/" + className + "Dao.java", sb.toString()); } /*** * 創建Service的接口 * createServiceClass * @param table */ public void createServiceClass(String className) { String objectName = StringUtils.uncapitalize(className); StringBuilder sb = new StringBuilder(); sb.append("package " + ROOT_PACKAGE + ".service;").append(ENTER);; // sb.append("import java.io.Serializable;").append(ENTER); //sb.append("import java.util.List;").append(ENTER); //sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER); //sb.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER); //sb.append("import com.flong.modules.pojo."+className+";").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n"); sb.append(" * @Version:").append(Version).append(ENTER); sb.append(" * @Description:").append(Description).append(ENTER); //sb.append(" * @Email:").append(myEmail).append("\n*/"); sb.append("\n*/"); sb.append(ENTER); sb.append("public interface " + className + "Service {"); sb.append(ENTER); // sb.append("/**查詢*/").append(ENTER); // sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER); // // sb.append("/**保存數據*/").append(ENTER); // sb.append(" public void saveData("+className+" "+objectName+");").append(ENTER); // // sb.append("/**更新數據*/").append(ENTER); // // sb.append(" public void updateData("+className+" "+objectName+");").append(ENTER); // // sb.append("/**刪除數據*/").append(ENTER); // // sb.append(" public void deleteData(Long pk);").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("}"); sb.append(ENTER); FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/" + className + "Service.java", sb.toString()); } /*** * 創建Service層的實現類 * createServiceImplClass * @param table */ public void createServiceImplClass(String className) { String objectName = StringUtils.uncapitalize(className); StringBuilder sb = new StringBuilder(); sb.append("package " + ROOT_PACKAGE + ".service.Impl;").append(ENTER); // sb.append("import java.io.Serializable;").append(ENTER); //sb.append("import java.util.List;").append(ENTER); sb.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER); sb.append("import org.springframework.stereotype.Service;").append(ENTER); //sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER); //sb.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER); sb.append("import "+ROOT_PACKAGE+".dao."+className+"Dao;").append(ENTER); sb.append("import "+ROOT_PACKAGE+".servicer."+className+"Service;").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n"); sb.append(" * @Version:").append(Version).append(ENTER); sb.append(" * @Description:").append(Description).append(ENTER); //sb.append(" * @Email:").append(myEmail).append("\n*/"); sb.append("\n*/"); sb.append(ENTER); sb.append("@Service"); sb.append(ENTER); sb.append("public class " + className + "ServiceImpl extends EntityDaoSupport implements " + className + "Service {").append(ENTER); sb.append(" @Autowired ").append(ENTER);//注入Dao層的接口Name sb.append(className+"Dao "+objectName+"Dao;"); sb.append(ENTER); // sb.append("/**查詢*/").append(ENTER); // sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER); // sb.append(" return "+objectName+"Dao.list(simplePage,"+objectName+");").append(ENTER); // sb.append("}").append(ENTER);//查詢的結束{ // // // // sb.append("/**保存數據*/").append(ENTER); // sb.append(" public void saveData("+className+" "+objectName+"){").append(ENTER); // // sb.append( objectName+"Dao.saveData("+objectName+");").append(ENTER); // sb.append("}"); // // sb.append("/**更新數據*/").append(ENTER); // // sb.append(" public void updateData("+className+" "+objectName+"){").append(ENTER); // sb.append( objectName+"Dao.updateData("+objectName+");").append(ENTER); // // sb.append("}"); // sb.append("/**刪除數據*/").append(ENTER); // // sb.append(" public void deleteData(Long pk){").append(ENTER); // sb.append( objectName+"Dao.deleteData(pk);").append(ENTER); // sb.append("}"); sb.append(ENTER); sb.append(ENTER); sb.append("}"); sb.append(ENTER); FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/Impl/" + className + "ServiceImpl.java", sb.toString()); } /*** * 創建控制層類Controller View * @param table */ public void createViewControllerClass(String className,String mappingUrl){ //通過 org.apache.commons.lang3.StringUtils的uncapitalize方法把類名第一個字母轉換成小寫 String objectName = StringUtils.uncapitalize(className); //通過 org.apache.commons.lang3.StringUtils的lowerCase方法把類名整個單詞轉化成小寫然后為springmvc的路徑返回jsp請求. String BASE_PATH="modules/"+StringUtils.lowerCase(className)+"/";//modules+模塊名 StringBuilder sb = new StringBuilder(); sb.append("package " + ROOT_PACKAGE + ".controller;").append(ENTER);; /*******處理這個導入需要的類*********/ //sb.append("import java.util.List;").append(ENTER); //sb.append("import javax.servlet.http.HttpServletRequest;").append(ENTER); //sb.append("import javax.servlet.http.HttpServletResponse;").append(ENTER); sb.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER); sb.append("import org.springframework.stereotype.Controller;").append(ENTER); sb.append("import org.springframework.web.bind.annotation.RequestMapping;").append(ENTER); // sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER); //sb.append("import com.flong.commons.web.BaseController;").append(ENTER); //sb.append("import com.flong.modules.pojo."+className+";").append(ENTER); sb.append("import "+ROOT_PACKAGE+".servicer."+className+"Service;").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n"); sb.append(" * @Version:").append(Version).append(ENTER); sb.append(" * @Description:").append(Description).append(ENTER); //sb.append(" * @Email:").append(myEmail).append("\n*/"); sb.append("\n*/"); sb.append(ENTER); sb.append(ENTER); sb.append("@Controller").append(ENTER); sb.append("@RequestMapping(\""+mappingUrl+"view"+"\")"); sb.append(ENTER); sb.append("public class " + className + "Controller extends BaseController {"); sb.append(ENTER); sb.append(ENTER); sb.append(" @Autowired ").append(ENTER);//注入Service層的接口Name sb.append(className+"Service " +className+"Service"); sb.append(ENTER); ////創建一個默認的查詢.. //sb.append(ENTER); //sb.append(" @RequestMapping(value=\"list\")").append(ENTER); //sb.append(" public String list("+className+" "+objectName+",SimplePage simplePage ,HttpServletRequest request ,HttpServletResponse response){"); //sb.append(ENTER); //sb.append(" List<"+className+"> list = "+className+"Service.list(simplePage, "+objectName+");"); //sb.append(ENTER); //sb.append(" request.setAttribute(\""+objectName+"\", object);"); //sb.append(ENTER); //sb.append(" request.setAttribute(\"page\", simplePage);"); //sb.append(ENTER); //sb.append(" request.setAttribute(\"list\", list);"); //sb.append(ENTER); //sb.append(" return \""+BASE_PATH+"list\";"); //sb.append(ENTER); //sb.append(" }"); sb.append(ENTER); sb.append("}"); sb.append(ENTER); FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/controller/view/" + className + "ViewController.java", sb.toString()); } /*** * 創建控制層類Controller Rest * @param table */ public void createRestControllerClass(String className,String mappingUrl){ //通過 org.apache.commons.lang3.StringUtils的uncapitalize方法把類名第一個字母轉換成小寫 String objectName = StringUtils.uncapitalize(className); //通過 org.apache.commons.lang3.StringUtils的lowerCase方法把類名整個單詞轉化成小寫然后為springmvc的路徑返回jsp請求. String BASE_PATH="modules/"+StringUtils.lowerCase(className)+"/";//modules+模塊名 StringBuilder sb = new StringBuilder(); sb.append("package " + ROOT_PACKAGE + ".controller;").append(ENTER);; /*******處理這個導入需要的類*********/ //sb.append("import java.util.List;").append(ENTER); //sb.append("import javax.servlet.http.HttpServletRequest;").append(ENTER); //sb.append("import javax.servlet.http.HttpServletResponse;").append(ENTER); sb.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER); sb.append("import org.springframework.stereotype.Controller;").append(ENTER); sb.append("import org.springframework.web.bind.annotation.RequestMapping;").append(ENTER); // sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER); //sb.append("import com.flong.commons.web.BaseController;").append(ENTER); //sb.append("import com.flong.modules.pojo."+className+";").append(ENTER); sb.append("import "+ROOT_PACKAGE+".servicer."+className+"Service;").append(ENTER); sb.append(ENTER); sb.append(ENTER); sb.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n"); sb.append(" * @Version:").append(Version).append(ENTER); sb.append(" * @Description:").append(Description).append(ENTER); //sb.append(" * @Email:").append(myEmail).append("\n*/"); sb.append("\n*/"); sb.append(ENTER); sb.append(ENTER); sb.append("@Controller").append(ENTER); sb.append("@RequestMapping(\""+mappingUrl+"rest"+"\")"); sb.append(ENTER); sb.append("public class " + className + "Controller extends BaseController {"); sb.append(ENTER); sb.append(ENTER); sb.append(" @Autowired ").append(ENTER);//注入Service層的接口Name sb.append(className+"Service " +className+"Service"); sb.append(ENTER); // //創建一個默認的查詢.. // sb.append(ENTER); // sb.append(" @RequestMapping(value=\"list\")").append(ENTER); // sb.append(" public String list("+className+" "+objectName+",SimplePage simplePage ,HttpServletRequest request ,HttpServletResponse response){"); // sb.append(ENTER); // sb.append(" List<"+className+"> list = "+className+"Service.list(simplePage, "+objectName+");"); // sb.append(ENTER); // sb.append(" request.setAttribute(\""+objectName+"\", object);"); // sb.append(ENTER); // sb.append(" request.setAttribute(\"page\", simplePage);"); // sb.append(ENTER); // sb.append(" request.setAttribute(\"list\", list);"); // sb.append(ENTER); // sb.append(" return \""+BASE_PATH+"list\";"); // sb.append(ENTER); // sb.append(" }"); sb.append(ENTER); sb.append("}"); sb.append(ENTER); FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/controller/rest/" + className + "RestController.java", sb.toString()); } }
3 生成類---最后文件生成
package com.autojava.test; import java.util.ArrayList; import java.util.List; /** * 運行生成的main * @author liangjilong * */ public class DoMain { public static void main(String[] args) { try { CodeGenerator codeGenerator= new CodeGenerator(); //類名 根包名 描述 訪問總路徑 codeGenerator.todo("Dag","com.prison.auto","狗類","/auto/dag"); } catch (Exception e) { throw new RuntimeException(e); } } }
4 運行 刷新---就得到你想要的代碼了
