根据Java实体类生成建表语句sql

public static void main(String[] args) {
        String path = "E:\\code\\project\\SpringBoot_Vue\\基于java的springboot框架校园资料分享平台\\onlineEducationPublic-master\\breadroll-admin\\src\\main\\java\\top\\qiudb\\pojo";
        File folder = new File(path);
        generateSqlForAllEntities(folder);
    }

    private static void generateSqlForAllEntities(File folder) {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                generateSqlForAllEntities(file); // 递归处理子文件夹
            } else if (file.getName().endsWith(".java")) {
                String className = getClassName(file);
                try {
                    Class<?> clazz = Class.forName("top.qiudb.pojo." + className);
                    System.out.println(generateCreateTableSQL(clazz));
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static String getClassName(File file) {
        return file.getName().replace(".java", "");
    }

    public static String generateCreateTableSQL(Class<?> clazz) {
        StringBuilder sql = new StringBuilder("CREATE TABLE " + toSnakeCase(clazz.getSimpleName()) + " (\n");

        for (Field field : clazz.getDeclaredFields()) {
            sql.append(toSnakeCase(field.getName())).append(" ")
                    .append(mapToSqlType(field.getType())).append(",\n");
        }

        sql.setLength(sql.length() - 2); // 去掉最后的逗号
        sql.append("\n);");

        return sql.toString();
    }

    private static String toSnakeCase(String input) {
        StringBuilder result = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (Character.isUpperCase(ch) && result.length() > 0) {
                result.append("_");
            }
            result.append(Character.toLowerCase(ch));
        }
        return result.toString();
    }

    private static String mapToSqlType(Class<?> type) {
        if (type == String.class) return "VARCHAR(255)";
        if (type == int.class || type == Integer.class) return "INT";
        if (type == long.class || type == Long.class) return "BIGINT";
        if (type == double.class || type == Double.class) return "DOUBLE";
        if (type == boolean.class || type == Boolean.class) return "BOOLEAN";
        // 添加其他类型映射...
        return "VARCHAR(255)"; // 默认类型
    }

简易版

2.有子文件夹

public static void main(String[] args) {
        String directoryPath = "E:\\code\\project\\SpringBoot_Vue\\基于java的springboot框架校园资料分享平台\\onlineEducationPublic-master\\breadroll-education\\src\\main\\java\\top\\qiudb\\pojo"; // 替换为你的路径
        List<String> sqlStatements = new ArrayList<>();
        traverseDirectory(new File(directoryPath), sqlStatements);

        for (String sql : sqlStatements) {
            System.out.println(sql);
        }
    }

    private static void traverseDirectory(File dir, List<String> sqlStatements) {
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    traverseDirectory(file, sqlStatements);
                } else if (file.getName().endsWith(".java")) {
                    String sql = generateSQLFromEntity(file);
                    if (sql != null) {
                        sqlStatements.add(sql);
                    }
                }
            }
        }
    }

    private static String generateSQLFromEntity(File file) {
        // 读取文件内容并解析字段
        try {
            List<String> lines = Files.readAllLines(Paths.get(file.getPath()));
            String className = ""; // 提取类名
            List<String> fields = new ArrayList<>(); // 提取字段

            for (String line : lines) {
                if (line.contains("class")) {
                    className = extractClassName(line);
                }
                // 提取字段信息,使用正则表达式
                if (line.matches("(?i).*private.*|(?i).*public.*")) {
                    String field = extractField(line);
                    if (field != null) {
                        fields.add(field);
                    }
                }
            }

            return buildCreateTableSQL(className, fields);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String extractClassName(String line) {
        Pattern pattern = Pattern.compile("class\\s+(\\w+)");
        Matcher matcher = pattern.matcher(line);
        return matcher.find() ? matcher.group(1) : null;
    }

    private static String extractField(String line) {
        Pattern pattern = Pattern.compile("(private|public|protected)\\s+(\\w+)\\s+(\\w+);");
        Matcher matcher = pattern.matcher(line);
        if (matcher.find()) {
            String type = matcher.group(2);
            String name = matcher.group(3);
            String snakeCaseName = convertCamelToSnake(name); // 转换字段名
            return snakeCaseName + " " + mapJavaTypeToSQL(type);
        }
        return null;
    }

    private static String mapJavaTypeToSQL(String type) {
        switch (type) {
            case "int":
            case "Integer":
                return "INT";
            case "long":
            case "Long":
                return "BIGINT";
            case "double":
            case "Double":
                return "DOUBLE";
            case "float":
            case "Float":
                return "FLOAT";
            case "short":
            case "Short":
                return "SMALLINT";
            case "byte":
            case "Byte":
                return "TINYINT";
            case "boolean":
            case "Boolean":
                return "BOOLEAN";
            case "String":
                return "VARCHAR(255)";
            // 添加其他类型映射
            case "Date":
                return "DATETIME";
            default:
                return "VARCHAR(255)"; // 默认类型
        }
    }

    private static String buildCreateTableSQL(String className, List<String> fields) {
        // 将驼峰命名法转换为下划线
        String tableName = convertCamelToSnake(className);

        // 添加删除表语句
        StringBuilder sql = new StringBuilder("DROP TABLE IF EXISTS `" + tableName + "`;\n");
        sql.append("CREATE TABLE `" + tableName + "` (");

        for (String field : fields) {
            sql.append(field).append(", ");
        }
        sql.setLength(sql.length() - 2); // 去掉最后的逗号
        sql.append(");");

        return sql.toString();
    }
    private static String convertCamelToSnake(String name) {
        StringBuilder result = new StringBuilder();
        for (char c : name.toCharArray()) {
            if (Character.isUpperCase(c) && result.length() > 0) {
                result.append("_");
            }
            result.append(Character.toLowerCase(c));
        }
        return result.toString();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值