package com.doumee.core.utils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.sql.*; import java.util.Date; import java.util.*; // 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中 public class CodeGenerator { public static String packName ="com.doumee"; // 设置输出目录 public static String rootFileDir = "D:/code/idea/initCode/"; public static String outputDirEntity =rootFileDir+"src/main/java/com/doumee/dao/business/model/"; // 输出的代码文件夹路径 public static String outputDirMapper = rootFileDir+"src/main/java/com/doumee/dao/business/"; // 输出的代码文件夹路径 public static String outputDirService =rootFileDir+"src/main/java/com/doumee/service/business/"; // 输出的代码文件夹路径 public static String outputDirServiceImpl = rootFileDir+"src/main/java/com/doumee/service/business/impl/"; // 输出的代码文件夹路径 public static String outputDirController =rootFileDir+"src/main/java/com/doumee/api/business/"; // 输出的代码文件夹路径 public static String outputDirDb =rootFileDir+"db/"; // 输出的代码文件夹路径 public static void main(String[] args) { // 配置数据库连接 String url = "jdbc:mysql://192.168.0.211:3306/dmmall_full"; String username = "root"; String password = "Doumee@168"; String database = "dmmall_full"; List tables = new ArrayList<>(); tables.add("member"); tables.add("labels"); tables.add("goods"); tables.add("goodsorder"); tables.add("integral"); for(String tableName : tables){ // 获取表信息并生成代码 try { System.out.println(tableName+"===================生成开始==================="); Map tableInfo = getTableInfo(url, username, password, database, tableName); generateCode(tableInfo); System.out.println(tableName+"===================生成结束==================="); }catch (Exception e){ System.err.println(tableName+"===================生成异常==================="+e.getMessage()); } } } public static Map getTableInfo(String url, String username, String password, String database, String tableName) { Map map = new HashMap<>(); try (Connection conn = DriverManager.getConnection(url, username, password)) { // 查询表注释 String tableQuery = "SELECT table_comment FROM information_schema.tables WHERE table_schema = ? AND table_name = ?"; try (PreparedStatement ps = conn.prepareStatement(tableQuery)) { ps.setString(1, database); ps.setString(2, tableName); ResultSet rs = ps.executeQuery(); if (rs.next()) { map.put("tableComment", rs.getString("table_comment")); } } // 查询字段信息 auto_increment String columnQuery = "SELECT extra,column_name, column_type, column_comment FROM information_schema.columns WHERE table_schema = ? AND table_name = ? order by ordinal_position"; List> columns = new ArrayList<>(); try (PreparedStatement ps = conn.prepareStatement(columnQuery)) { ps.setString(1, database); ps.setString(2, tableName); ResultSet rs = ps.executeQuery(); int index = 1; while (rs.next()) { String javaName = toCamelCase(rs.getString("column_name")); String getJavaName = javaName.substring(0,1).toUpperCase()+javaName.substring(1); Map columnInfo = new HashMap<>(); if(rs.getString("extra") !=null && rs.getString("extra").contains("auto_increment")){ //如果是自增长 columnInfo.put("auto","1"); // 转换为 Java 变量名 }else{ columnInfo.put("auto","0"); // 转换为 Java 变量名 } columnInfo.put("index",index++ +""); columnInfo.put("columnName", rs.getString("column_name")); columnInfo.put("javaName",javaName); // 转换为 Java 变量名 columnInfo.put("getJavaName",getJavaName); // 转换为 Java 变量名 columnInfo.put("javaType", sqlTypeToJavaType(rs.getString("column_type"))); // 转换为 Java 类型 columnInfo.put("comment", rs.getString("column_comment")); columns.add(columnInfo); } } map.put("columns", columns); map.put("tableName", tableName); map.put("entityName", toCamelCase(tableName)); } catch (SQLException e) { e.printStackTrace(); } return map; } private static String sqlTypeToJavaType(String sqlType) { sqlType = sqlType.toLowerCase(); if (sqlType.contains("int")) { return "Integer"; } else if (sqlType.contains("bigint")) { return "Long"; } else if (sqlType.contains("char") || sqlType.contains("text") || sqlType.contains("varchar")) { return "String"; } else if (sqlType.contains("datetime") || sqlType.contains("timestamp")) { return "Date"; } else if (sqlType.contains("date")) { return "Date"; } else if (sqlType.contains("decimal") || sqlType.contains("double")) { return "BigDecimal"; } else { return "String"; } } private static String toCamelCase(String name) { StringBuilder result = new StringBuilder(); String[] parts = name.split("_"); for (int i = 0; i < parts.length; i++) { if (i == 0) { result.append(parts[i].toLowerCase()); } else { result.append(Character.toUpperCase(parts[i].charAt(0))).append(parts[i].substring(1).toLowerCase()); } } return result.toString(); } private static void generateCode(Map tableInfo) { // 读取表信息 String entityName = (String) tableInfo.get("entityName"); String tableName = (String) tableInfo.get("tableName"); String tableComment = (String) tableInfo.get("tableComment"); List> columns = (List>) tableInfo.get("columns"); // 设置 Velocity 配置 VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); velocityEngine.init(); // 配置模板目录 String baseName = entityName.substring(0, 1).toUpperCase() + entityName.substring(1); // 创建 Velocity 上下文 Map pack = new HashMap<>(); pack.put("Base",packName); pack.put("Entity",packName+".dao.business.model"); pack.put("Controller",packName+".api.business"); pack.put("Mapper",packName+".dao.business"); pack.put("Service",packName+".service.business"); pack.put("ServiceImpl",packName+".service.business.impl"); VelocityContext context = new VelocityContext(); context.put("package",pack); // 设置包路径 context.put("entityName", baseName); context.put("entityNameLower", entityName); context.put("entityNameLowerFull", entityName.toLowerCase()); context.put("tableName", tableName); context.put("tableComment", tableComment); context.put("columns", columns); context.put("nowDate", DateUtil.getPlusTime2(new Date())); // 生成 Entity 文件 generateFile(velocityEngine, context, "entity.vm", baseName, outputDirEntity , ".java"); // 生成 Mapper 文件 generateFile(velocityEngine, context, "mapper.vm", baseName, outputDirMapper , "Mapper.java"); // 生成 Service 接口文件 generateFile(velocityEngine, context, "service.vm", baseName, outputDirService , "Service.java"); // 生成 ServiceImpl 文件 generateFile(velocityEngine, context, "serviceImpl.vm", baseName, outputDirServiceImpl + "" , "ServiceImpl.java"); // 生成 Controller 文件 generateFile(velocityEngine, context, "controller.vm", baseName, outputDirController , "Controller.java"); generateFile(velocityEngine, context, "db.vm", baseName, outputDirDb , "Permissions.sql"); } private static void generateFile(VelocityEngine velocityEngine, VelocityContext context, String templateName, String baseName,String outputFilePath,String endName) { // 获取模板 File file = new File(outputFilePath); if(!file.isDirectory()){ file.mkdirs(); } System.out.println(file.isFile()); Template template = velocityEngine.getTemplate( "templates/"+templateName); // 创建文件输出流 try{ System.out.println(outputFilePath+baseName+endName+"===================生成开始==================="); File f = new File(outputFilePath+baseName+endName); if(f.isFile()){ f.delete(); } f.createNewFile(); // 将上下文数据渲染到模板中 FileWriter writer = new FileWriter(outputFilePath+baseName+endName); template.merge(context, writer); writer.flush(); writer.close(); System.out.println(outputFilePath+baseName+endName+"===================生成结束==================="); } catch (IOException e) { System.err.println(outputFilePath+baseName+endName+"===================生成异常==================="); e.printStackTrace(); } } }