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();
}