package org.yangliu.codegenerate; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.google.common.base.CaseFormat; import freemarker.cache.ClassTemplateLoader; import freemarker.core.XMLOutputFormat; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.lang.StringUtils; import org.yangliu.codegenerate.entity.TableEntityVo; import org.yangliu.codegenerate.entity.TableVo; import org.yangliu.codegenerate.util.MarkerGenerate; import org.yangliu.codegenerate.util.TableFieldUtil; import java.io.*; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.util.*; /** * @Description * @Author ZhouWenTao * @Date 2023/8/13 19:16 */ public class Main { //包名 private static String bussi_package = "com.enjoy.oqc"; //生成项目目录 private static String project_path = "E:\\workspace_2\\enjoy\\qms\\enjoy-oqc\\src\\main\\java\\"; private static String project_resource_mapper_path = "E:\\workspace_2\\enjoy\\qms\\enjoy-oqc\\src\\main\\resources\\mapper\\oqc\\"; //实体类模板 private static String bussi_entity_template = "XXXEntity.javai"; private static String bussi_entity_excel_template = "XXXEntityExcel.javai"; private static String bussi_entity_dto_template = "XXXEntityDTO.javai"; private static String bussi_entity_vo_template = "XXXEntityVO.javai"; private static String bussi_entity_add_vo_template = "XXXEntityAddPVO.javai"; private static String bussi_entity_edit_vo_template = "XXXEntityEditPVO.javai"; private static String bussi_entity_query_vo_template = "XXXEntityQueryVO.javai"; //mapper模板 private static String bussi_mapper_template = "XXXMapper.javai"; //mapper.xml模板 private static String bussi_mapperxml_template = "XXXMapper.xmli"; //service 模板 private static String bussi_service_template = "XXXService.javai"; private static String bussi_serviceimpl_template = "XXXServiceImpl.javai"; //controller private static String bussi_controller_template = "XXXController.javai"; //模板所在目录 private static String templatepath = "/yangliu/"; private static String author = "yangliu"; // postgresql或mysql private static String dbType = "postgresql"; public static void main(String[] args) throws Exception { //1.数据库配置 String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://10.201.145.19:35432/enjoy-oqc?stringtype=unspecified&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false"; String user = "enjoy"; String password = "Nomi1234"; //2.选择表配置 String json="{\"oqc_shipment_record\":\"成品出货记录\"}"; JSONObject tables = JSONObject.parseObject(json); for (String table : tables.keySet()) { String entityName = TableFieldUtil.tableNameToEntityName(table); String description = tables.getString(table); System.out.println(String.format("表名:%s,实体类:%s,备注:%s",table,entityName,description)); String primaryKeyField = "id";//主键 List tableEntityVoList = printTableStructure(driver, url, user, password, table); //3.生成 generate(bussi_package, table,primaryKeyField,entityName,description, tableEntityVoList); } } /** * @param bussiPackage * @param tableName * @param entityName * @param originalColumns */ private static void generate(String bussiPackage,String tableName,String primaryKeyField,String entityName,String description, List originalColumns) { TableVo tableVo = new TableVo(); tableVo.setFtlDescription(description); //包名 Map dataMap = new HashMap<>(); dataMap.put("bussiPackage", bussiPackage);//包 dataMap.put("entityPackage", "domain");//实体类包名 domain/entity dataMap.put("excelPackage","oqcExcel");//导出Excel类的包 dataMap.put("tableName", tableName);//表名称 dataMap.put("tableVo", tableVo);//表属性 //主键 dataMap.put("primaryKeyField",primaryKeyField); dataMap.put("entityName", entityName);//实体类名称 dataMap.put("author", author);//作者 dataMap.put("originalColumns", originalColumns);//字段 StringBuffer parsePath = new StringBuffer(project_path); if (StringUtils.isNotBlank(bussi_package)) { String[] bussiPackageSplit = bussi_package.split("\\."); for (String bpackage : bussiPackageSplit) { parsePath = parsePath.append(bpackage).append(File.separator); } } //生成实体类 String entityParsePath = parsePath + (String) dataMap.get("entityPackage") + File.separator; MarkerGenerate.generate(templatepath, bussi_entity_template, entityParsePath, entityName + ".java", dataMap); String dtoParsePath = parsePath + "dto" + File.separator; MarkerGenerate.generate(templatepath, bussi_entity_dto_template, dtoParsePath, entityName + "DTO.java", dataMap); //excel String excelParsePath=parsePath +(String) dataMap.get("excelPackage")+ File.separator;; MarkerGenerate.generate(templatepath, bussi_entity_excel_template, excelParsePath, entityName + "Excel.java", dataMap); String voParsePath = parsePath + "vo" + File.separator; //MarkerGenerate.generate(templatepath, bussi_entity_vo_template, voParsePath, entityName + "VO.java", dataMap); //add_pvo MarkerGenerate.generate(templatepath, bussi_entity_add_vo_template, voParsePath, "Add"+entityName + "PVO.java", dataMap); //edit_pvo MarkerGenerate.generate(templatepath, bussi_entity_edit_vo_template, voParsePath, "Edit"+entityName + "PVO.java", dataMap); //query_pvo MarkerGenerate.generate(templatepath, bussi_entity_query_vo_template, voParsePath, "Query"+entityName + "VO.java", dataMap); //生成Mapper String mapperParsePath = parsePath + "mapper" + File.separator; MarkerGenerate.generate(templatepath, bussi_mapper_template, mapperParsePath, entityName + "Mapper.java", dataMap); //生成Mapper.xml String mapperXmlParsePath = project_resource_mapper_path; MarkerGenerate.generate(templatepath, bussi_mapperxml_template, mapperXmlParsePath, entityName + "Mapper.xml", dataMap); //生成Service String serviceParsePath = parsePath + "service" + File.separator; MarkerGenerate.generate(templatepath,bussi_service_template,serviceParsePath,String.format("I%sService.java",entityName),dataMap); //生成ServiceImpl String serviceImplParsePath = serviceParsePath+"impl"+File.separator; MarkerGenerate.generate(templatepath,bussi_serviceimpl_template,serviceImplParsePath,String.format("%sServiceImpl.java",entityName),dataMap); //生成Controller String controllerParsePath = parsePath + "controller" + File.separator; MarkerGenerate.generate(templatepath,bussi_controller_template,controllerParsePath,String.format("%sController.java",entityName),dataMap); } /** * 打印所有表结构 * * @param driver driver * @param url url * @param user user * @param password password * @throws Exception exception */ private static List printTableStructure(String driver, String url, String user, String password, String table) throws Exception { Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, password); DatabaseMetaData metaData = connection.getMetaData(); // 获取所有表 //ResultSet tableResultSet = metaData.getTables(null, null, table+"%", new String[]{"TABLE"}); //单表 ResultSet tableResultSet = metaData.getTables(null, null, table, new String[]{"TABLE"}); List tableEntityVoList = new ArrayList<>(); while (tableResultSet.next()) { String tableName = tableResultSet.getString("TABLE_NAME"); System.out.println("table:" + tableName); // 获取表字段结构 ResultSet columnResultSet = metaData.getColumns(null, "%", tableName, "%"); while (columnResultSet.next()) { // 字段名称 String columnName = columnResultSet.getString("COLUMN_NAME"); // 数据类型 String columnType = columnResultSet.getString("TYPE_NAME"); // 字段长度 int datasize = columnResultSet.getInt("COLUMN_SIZE"); // 小数部分位数 int digits = columnResultSet.getInt("DECIMAL_DIGITS"); // 是否可为空 1代表可空 0代表不可为空 int nullable = columnResultSet.getInt("NULLABLE"); // 描述 String remarks = columnResultSet.getString("REMARKS"); if (remarks==null) { remarks=""; } System.out.println(columnName + " " + columnType + " " + datasize + " " + digits + " " + nullable + " " + remarks); String entityField = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName); tableEntityVoList.add(new TableEntityVo(columnName,entityField,TableFieldUtil.fieldTypeParseJava(dbType, columnType), columnType, remarks)); } System.out.println("================================="); } connection.close(); return tableEntityVoList; } }