广告:

信号屏蔽器:守护你的数字生活,为你带来宁静与专注

https://sz-sstx.com

大多数时候咱们是通过建表之后,可以通过代码生产工具生成实体类。但是遇到实体类经常需要修改的开发阶段,频繁修改数据库就显得很麻烦。这时用实体类生成表就是一个不错的选择!

首先导包

import com.sstx.model.entity.*;
import com.mysql.cj.util.StringUtils;



import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Component;

import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;

主方法调用,参数填你所创建的实体类名

    public static void main(String[] args) throws IOException {
        createTableSql(DashEleLocation.class);
    }

下面是方法对应的主要代码

    /**
     * 根据类文件生成创表sql语句
     *
     * @param clazz 实体类
     * @return 创表sql
     */
    public static String createTableSql(Class<?> clazz) {
        String filePath = getPathFromClass(clazz);
        BufferedReader reader = null;
        StringBuilder sql = new StringBuilder();
        List<List<String>> result = new ArrayList<>();
        try {
            reader = new BufferedReader(new FileReader(filePath));
            String line;
            int lineNUm = 0;
            String keyName = null;
            String tableName = "";
            String annotation = null;
            String columnEnName = null;
            String columnType = null;
            List<List<String>> columns = new ArrayList<>();
            //解析类文件
            while ((line = reader.readLine()) != null) {
                if (line.contains("import")) {
                    continue;
                }
                if (line.contains("//") && !line.contains("///")) {
                    if (line.split("//").length<2) {
                        continue;
                    }
                    annotation = line.split("//")[1];
                    if(StringUtils.isNullOrEmpty(annotation)){
                        continue;
                    }

                    String[] split = line.split("private");
                    if(line.contains("public")){
                      split = line.split("public");
                    }
                    if(split[0].contains("//")){
                        continue;
                    }
                    String s = split[1].split(" ")[1];
                    switch (s) {
                        case "Date":
                        case "DateTime":
                            columnType = "datetime";
                            break;
                        case "String":
                            columnType = "varchar(100)";
                            break;
                        case "BigDecimal":
                            columnType = "decimal(30,6)";
                            break;
                        case "int":
                        case "Integer":
                            columnType = "int";
                            break;
                        case "Double":
                            columnType = "double(30,2)";
                            break;
                        case "Boolean":
                            columnType = "TINYINT(1)";
                            break;

                    }

                }
                if (line.contains("@TableName")) {
                    tableName = line.split("\"")[1];
                }
                // 处理每一行的内容
                if (line.contains("@TableId")) {
                    if(!line.contains("\"")){
                        keyName = "id";
                        columnEnName = "id";
                    }else {
                        keyName = line.split("\"")[1];
                        columnEnName = line.split("\"")[1];
                    }

                }
                if (line.contains("TableField")&&!line.contains("false")&&!line.contains("//")) {
                    columnEnName = line.split("\"")[1];
                }
                if (annotation != null && columnEnName != null && columnType != null) {
                    List<String> oneColumn = new ArrayList<>();
                    oneColumn.add(columnEnName);
                    oneColumn.add(columnType);
                    oneColumn.add(annotation);
                    result.add(oneColumn);
                    annotation = null;
                    columnEnName = null;
                    columnType = null;
                }
            }
            //生成sql
            sql.append("drop table if exists ").append(tableName).append(";").append("\n");
            sql.append("CREATE TABLE ").append(tableName).append("(").append("\n");
            for (int i = 0; i < result.size(); i++) {
                List<String> strings = result.get(i);
                sql.append("\t").append("`").append(strings.get(0)).append("`").append(" ").append(strings.get(1));
                sql.append(" ").append("COMMENT").append(" ").append("\"").append(strings.get(2)).append("\"");
                if(i==result.size()-1&&keyName==null){
                    sql.append("\n");
                }else{
                    sql.append(",");
                    sql.append("\n");
                }

            }
            if(keyName!=null){
                sql.append("\tPRIMARY KEY ").append("(").append(keyName).append(")").append("\n");
            }
            sql.append(")");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println(sql);
        return sql.toString();
    }

生产结果展示:

直接复制白色的建表语句,进入数据库执行即可!

                                                                                                                        源自 sz-sstx.com

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐