mysql表逆向实体类
mysql表逆向实体类
目标框架springboot,mybatisplus
package com.wql.repackage;import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;public class EntityClassGenerator {// todo 需要配置private static final String HOST = "127.0.0.1";private static final int PORT = 3306;// todo 需要配置private static final String DATABASE = "数据库名称";// todo 需要配置private static final String USER = "用户名";// todo 需要配置private static final String PASSWORD = "密码";// todo 需要配置private static final String OUTPUTDIR = "C:\\Users\\Admin\\Desktop";private static final List<String> TABLE_NAMES = new ArrayList<>();private static final List<String> CLASS_CONTENTS = new ArrayList<>();private static final String URL = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE;// todo 需要配置// 是否增加mybatisplus注解private static final Boolean IS_ADD_MYBATISPLUS_ANNOTATION = true;private static final List<String> INSERT_FIELD_FILL_COLUMN_NAMES = new ArrayList<>();private static final List<String> INSERT_UPDATE_FIELD_FILL_COLUMN_NAMES = new ArrayList<>();// todo 需要配置// 是否逻辑删除private static final Boolean IS_LOGIC_DELETE = true;// todo 需要配置// 逻辑删除字段private static final String LOGIC_DELETE_COLUMN_NAME = "delete_flag";static{// 表TABLE_NAMES.add("i18n_module");TABLE_NAMES.add("i18n_keyword");// 表统一注释CLASS_CONTENTS.add("@author: 作者名称");CLASS_CONTENTS.add("@date: " + LocalDateTime.now());// 需要insert注解的字段INSERT_FIELD_FILL_COLUMN_NAMES.add("create_time");INSERT_FIELD_FILL_COLUMN_NAMES.add("create_user");// 需要update注解的字段INSERT_UPDATE_FIELD_FILL_COLUMN_NAMES.add("update_time");INSERT_UPDATE_FIELD_FILL_COLUMN_NAMES.add("update_user");}public static void main(String[] args) {try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {try {for (String tableName : TABLE_NAMES) {generateEntityForTable(conn,CLASS_CONTENTS,tableName, OUTPUTDIR);}} catch (Exception e) {throw new RuntimeException(e);}// 打印结束System.out.println("Entity class generated successfully.");} catch (Exception e) {e.printStackTrace();}}private static void generateEntityForTable(Connection conn, List<String> classContents,String tableName, String outputDir) throws SQLException, IOException {System.out.println("=========================>>表"+tableName+"=========");String className = toCamelCaseTableName(tableName);DatabaseMetaData metaData = conn.getMetaData();StringBuilder sb = new StringBuilder();sb.append("package com.example;\n\n");if (IS_ADD_MYBATISPLUS_ANNOTATION) {sb.append("import com.baomidou.mybatisplus.annotation.*;\n");}sb.append("import com.fasterxml.jackson.annotation.JsonFormat;\n");sb.append("import lombok.Data;\n\n");// 获取表的commentString classComment = generateClassComment(classContents);sb.append(classComment);sb.append("@Data\n");// 判断是否需要添加mybatisplus注解if(IS_ADD_MYBATISPLUS_ANNOTATION){sb.append("@TableName(\""+tableName+"\")\n");}sb.append("public class ").append(className).append(" {\n");String primaryKeyColumnName = "";ResultSet primaryKeys = metaData.getPrimaryKeys(DATABASE, null, tableName);if (primaryKeys.next()) {primaryKeyColumnName = primaryKeys.getString("COLUMN_NAME");}ResultSet columns = metaData.getColumns(null, null, tableName, null);while (columns.next()) {String columnName = columns.getString("COLUMN_NAME");String columnType = columns.getString("TYPE_NAME");String javaColumnName = toCamelCaseColumnName(columnName);System.out.println(columnName+"->DB字段类型:"+columnType+"");String comment = columns.getString("REMARKS");sb.append(" /** ").append(comment).append(" */\n");// 判断是否添加mybatisplus注解,并且判断是否主键,如果是主键,就添加// @TableId(type = IdType.ASSIGN_ID)// @JsonFormat(shape = JsonFormat.Shape.STRING)if(IS_ADD_MYBATISPLUS_ANNOTATION && primaryKeyColumnName.equalsIgnoreCase(columnName)){sb.append(" @TableId(type = IdType.ASSIGN_ID)\n");sb.append(" @JsonFormat(shape = JsonFormat.Shape.STRING)\n");}// 判断是否需要添加insert注解,并且判断是否是insert字段if(IS_ADD_MYBATISPLUS_ANNOTATION && INSERT_FIELD_FILL_COLUMN_NAMES.contains(columnName)){sb.append(" @TableField(fill = FieldFill.INSERT)\n");}// 判断是否需要添加update注解,并且判断是否是update字段if(IS_ADD_MYBATISPLUS_ANNOTATION && INSERT_UPDATE_FIELD_FILL_COLUMN_NAMES.contains(columnName)){sb.append(" @TableField(fill = FieldFill.INSERT_UPDATE)\n");}// 逻辑删除if(IS_ADD_MYBATISPLUS_ANNOTATION && IS_LOGIC_DELETE && LOGIC_DELETE_COLUMN_NAME.equalsIgnoreCase(columnName)){sb.append(" @TableLogic(value = \"0\", delval = \"1\")\n");}sb.append(" private ").append(mapSqlTypeToJava(columnType)).append(" ").append(javaColumnName).append(";\n\n");}sb.append("}\n");writeToFile(outputDir, className + ".java", sb.toString());System.out.println("=========================<<类"+className+"完毕!=====");}// 生成类注释private static String generateClassComment(List<String> classContents) {StringBuilder sb = new StringBuilder();sb.append("/** \n * \n");if(null != classContents){for (String classContent : classContents) {sb.append(" * ").append(classContent).append("\n");}}sb.append(" */\n");return sb.toString();}private static String mapSqlTypeToJava(String sqlType) {switch (sqlType.toUpperCase()) {case "DATE":return "LocalDate";case "DATETIME":case "TIMESTAMP":return "LocalDateTime";case "INT":case "BIT":case "TINYINT":return "Integer";case "BIGINT":case "BIGINT UNSIGNED":return "Long";case "VARCHAR":case "CHAR":case "TEXT":return "String";// todo 其他未处理的类型 在此处添加default:return "Object";}}private static String toCamelCaseTableName(String s) {if (s == null || s.isEmpty()) {return s;}String[] parts = s.split("_");StringBuilder camelCase = new StringBuilder();for (String part : parts) {if (!part.isEmpty()) {camelCase.append(part.substring(0, 1).toUpperCase()).append(part.substring(1).toLowerCase());}}return camelCase.append("DO").toString();}private static String toCamelCaseColumnName(String s) {if (s == null || s.isEmpty()) {return s;}String[] parts = s.split("_");StringBuilder camelCase = new StringBuilder();for (String part : parts) {if (!part.isEmpty()) {if (camelCase.length() == 0) {camelCase.append(part.toLowerCase());} else {camelCase.append(part.substring(0, 1).toUpperCase()).append(part.substring(1).toLowerCase());}}}return camelCase.toString();}private static void writeToFile(String dir, String fileName, String content) throws IOException {FileWriter writer = new FileWriter(dir + "/" + fileName);writer.write(content);writer.close();}
}