You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
9.7 KiB

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<TableEntityVo> 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<TableEntityVo> originalColumns) {
TableVo tableVo = new TableVo();
tableVo.setFtlDescription(description);
//包名
Map<String, Object> 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<TableEntityVo> 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<TableEntityVo> 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;
}
}