MrShi
2 天以前 4eac422e52a4d28fb651b75d0f054697c7a2c0fa
server/dmmall_service/src/main/java/com/doumee/core/utils/CodeGenerator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,213 @@
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/diandongche/";
    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/diandongche";
        String username = "root";
        String password = "Doumee@168";
        String database = "diandongche";
        List<String> tables = new ArrayList<>();
        tables.add("refund");
        for(String tableName : tables){
            // èŽ·å–è¡¨ä¿¡æ¯å¹¶ç”Ÿæˆä»£ç 
            try {
                System.out.println(tableName+"===================生成开始===================");
                Map<String, Object> 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<String, Object> getTableInfo(String url, String username, String password, String database, String tableName) {
        Map<String, Object> 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<Map<String, String>> 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<String, String> 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<String, Object> tableInfo) {
        // è¯»å–表信息
        String entityName = (String) tableInfo.get("entityName");
        String tableName = (String) tableInfo.get("tableName");
        String tableComment = (String) tableInfo.get("tableComment");
        List<Map<String, String>> columns = (List<Map<String, String>>) 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<String,String> 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();
        }
    }
}