根据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 '审批意见');
相关推荐
xiaoye37082 小时前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
YDS8294 小时前
黑马点评 —— 分布式锁详解加源码剖析
java·spring boot·redis·分布式
ZTLJQ4 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
迷藏4944 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务4 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
daidaidaiyu4 小时前
Nacos实例一则及其源码环境搭建
java·spring
跟着珅聪学java5 小时前
js编写中文转unicode 教程
前端·javascript·数据库
小江的记录本5 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
摇滚侠5 小时前
Java 项目《谷粒商城-1》架构师级Java 项目实战,对标阿里 P6-P7,全网最强,实操版本
java·开发语言
还是做不到嘛\.5 小时前
Dvwa靶场-SQL Injection
数据库·sql·web安全