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 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"; String tableName = "car_driver"; // 获取表信息并生成代码 Map tableInfo = getTableInfo(url, username, password, database, tableName); generateCode(tableInfo); } 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"); String templateDir = "D:\\code\\idea\\doumee_code\\server\\src\\main\\resources\\templates"; // 模板文件的路径 Properties p = new Properties(); // 指定模板的加载位置 p.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, templateDir); // 指定输入编码 p.setProperty(VelocityEngine.INPUT_ENCODING, "UTF-8"); p.setProperty(RuntimeConstants.RESOURCE_LOADER, "file"); p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader"); p.setProperty("velocimacro.library", "macro_library.vm"); // 设置宏库文件名 p.setProperty("velocimacro.library.autoreload", "true"); // 允许自动重新加载宏库 p.setProperty("velocimacro.permissions.allow.inline.to.replace.global", "true"); // 允许内联宏替换全局宏 p.setProperty("velocimacro.library", "/templates/macro_library.vm"); // 设置宏库文件名 p.setProperty("velocimacro.library.autoreload", "true"); // 允许自动重新加载宏库 // 设置 Velocity 配置 VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); velocityEngine.init(); // 配置模板目录 // 设置输出目录 String outputDir = "D:\\code\\idea\\doumee_code\\server\\src\\main\\java\\com\\testcom"; // 输出的代码文件夹路径 String baseName = entityName.substring(0, 1).toUpperCase() + entityName.substring(1); // 创建 Velocity 上下文 Map pack = new HashMap<>(); pack.put("Base",packName); pack.put("Entity",packName+".dao.businees.model"); pack.put("Controller",packName+".api.businees"); pack.put("Mapper",packName+".dao.businees"); pack.put("Service",packName+".service.businees"); pack.put("ServiceImpl",packName+".service.businees.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, outputDir + "/dao/businees/model/" , ".java"); // 生成 Mapper 文件 generateFile(velocityEngine, context, "mapper.vm", baseName, outputDir + "/dao/businees/" , "Mapper.java"); // 生成 Service 接口文件 generateFile(velocityEngine, context, "service.vm", baseName, outputDir + "/service/businees/" , "Service.java"); // 生成 ServiceImpl 文件 generateFile(velocityEngine, context, "serviceImpl.vm", baseName, outputDir + "/service/businees/impl/" , "ServiceImpl.java"); // 生成 Controller 文件 generateFile(velocityEngine, context, "controller.vm", baseName, outputDir + "/api/businees/", "Controller.java"); } 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{ 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(); } catch (IOException e) { e.printStackTrace(); } } }