根据Java的数据库实体类输出建表SQL

数据库实体类

java 复制代码
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 分子公司基本信息变更代办
 *
 * @version 1.0
 * @date 2023/11/21 01:01
 */
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("ent_change_todo")
public class EntChangeTodoDO extends BaseDO {


    /**
     * id
     */
    private Integer id;

    /**
     * 分子公司类型 (1-分公司,2-子公司)
     */
    private Integer companyType;

    /**
     * 企业id
     */
    private Long enterpriseId;

    /**
     * 公司名字
     */
    private String companyName;

    /**
     * 企业类别
     */
    private String companyCate;

    /**
     * 负责人或法人
     */
    private String director;

    /**
     * 变更项json
     */
    private String changeItemsJson;

    /**
     * 待办人部门名
     */
    private String todoDeptName;

    /**
     * 待办人id
     */
    private Long todoUserId;

    /**
     * 待办人名字
     */
    private String todoUserName;

    /**
     * 待办状态(0-待处理, 1-同意(完成);2-驳回发起人;3-撤销)
     */
    private Integer state;

    /**
     * 待办业务key
     */
    private String todoKey;

    /**
     * 审批意见
     */
    private String approvalComment;

}

工具类

java 复制代码
import com.google.common.base.CaseFormat;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @version 1.0
 * @date 2023/11/29 16:31
 */
public class Entity2SQLTest2 {
    Pattern fieldPattern = Pattern.compile("/\\**\\n\\s+\\*(\\s*(.+))\\n\\s+\\*/\\n\\s+\\w+\\s+(\\w+)\\s+(\\w+);");
    Pattern tableNamePattern = Pattern.compile("TableName\\(\"(\\w+)\"\\)");

    @Test
    public void testSQL() {
        String result = entity2SQL("tes.txt");
        System.out.println(result);
    }

    private String entity2SQL(String entityClassPath) {
        Resource resource = new ClassPathResource(entityClassPath);
        String entityClassStr;
        try {
            InputStream inputStream = resource.getInputStream();
            entityClassStr = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        } catch (IOException e) {
            throw new IllegalStateException();
        }
        Matcher matcherTable = tableNamePattern.matcher(entityClassStr);
        StringBuilder sqlBuilder = new StringBuilder("CREATE TABLE  ");
        while (matcherTable.find()) {
            String tableName = matcherTable.group(1);
            sqlBuilder.append('`').append(tableName).append('`').append(" (\n");
        }
        Matcher matcher = fieldPattern.matcher(entityClassStr);

        while (matcher.find()) {
            String comment = matcher.group(2);
            String type = matcher.group(3);
            String fieldName = matcher.group(4);
            String sqlField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);
            if (sqlField.equals("id")) {
                sqlBuilder.append("`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键id',\n");
                continue;
            }
            sqlBuilder.append('`').append(sqlField).append('`');
            if ("Integer".equals(type)) {
                sqlBuilder.append(" INT ");
            }
            if ("Long".equals(type)) {
                sqlBuilder.append(" BIGINT ");
            }
            if ("String".equals(type)) {
                sqlBuilder.append(" VARCHAR(128) ");
            }
            if ("LocalDate".equals(type)) {
                sqlBuilder.append(" DATE ");
            }
            if ("LocalDateTime".equals(type) || "Date".equals(type)) {
                sqlBuilder.append(" DATETIME ");
            }
            if ("LocalTime".equals(type)) {
                sqlBuilder.append(" TIME ");
            }
            if ("Boolean".equals(type) || "boolean".equals(type)) {
                sqlBuilder.append(" TINYINT ");
            }

            sqlBuilder.append("DEFAULT NULL");
            sqlBuilder.append(" COMMENT ").append('\'').append(comment).append("',\n");

        }
        int startDel = sqlBuilder.length() - 2;
        int endDel = sqlBuilder.length();
        sqlBuilder.delete(startDel, endDel);
        sqlBuilder.append(");");


        return sqlBuilder.toString();


    }
}

输出结果

sql 复制代码
CREATE TABLE  `ent_change_todo` (
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键id',
`company_type` INT DEFAULT NULL COMMENT '分子公司类型 (1-分公司,2-子公司)',
`enterprise_id` BIGINT DEFAULT NULL COMMENT '企业id',
`company_name` VARCHAR(128) DEFAULT NULL COMMENT '公司名字',
`company_cate` VARCHAR(128) DEFAULT NULL COMMENT '企业类别',
`director` VARCHAR(128) DEFAULT NULL COMMENT '负责人或法人',
`change_items_json` VARCHAR(128) DEFAULT NULL COMMENT '变更项json',
`todo_dept_name` VARCHAR(128) DEFAULT NULL COMMENT '待办人部门名',
`todo_user_id` BIGINT DEFAULT NULL COMMENT '待办人id',
`todo_user_name` VARCHAR(128) DEFAULT NULL COMMENT '待办人名字',
`state` INT DEFAULT NULL COMMENT '待办状态(0-待处理, 1-同意(完成);2-驳回发起人;3-撤销)',
`todo_key` VARCHAR(128) DEFAULT NULL COMMENT '待办业务key',
`approval_comment` VARCHAR(128) DEFAULT NULL COMMENT '审批意见');
相关推荐
l1t3 分钟前
duckdb 1.6dev新增的.manual命令
开发语言·数据库
辉灰笔记20 分钟前
第一篇:MySQL8.0生产备份实战|XtraBackup全自动全量+增量备份(钉钉告警+异地Binlog归档)
数据库·mysql·钉钉·运维开发
折哥的程序人生 · 物流技术专研22 分钟前
Java 23 种设计模式:从踩坑到精通 | 备忘录模式 —— 快照与撤销,给对象装一个“后悔药”
java·设计模式·备忘录模式·行为型模式·java设计模式·从踩坑到精通·撤销重做
ikun_文29 分钟前
Java里面异常Exception体系知识点
java
不负岁月无痕30 分钟前
STL -- C++ 红黑树封装 Map 和 Set
java·c语言·开发语言·c++·面试
山峰哥33 分钟前
‌Explain实战:打开数据库执行计划的黑盒‌
大数据·服务器·数据库·sql·深度优先·宽度优先
小园子的小菜35 分钟前
Java核心基础:反射与泛型底层原理及实战用法详解
java·开发语言
淘源码A41 分钟前
多院区集团化云PACS系统源码,原生兼容国产软硬件环境
java·云计算·源码·saas·pacs·医学影像系统
何中应1 小时前
主流 OpenJDK 发行版下载安装
java·oracle·jdk·openjdk
daad7771 小时前
记录vscode连接matlab启动环境搭建
java·vscode·matlab