根据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 '审批意见');
相关推荐
一只爱打拳的程序猿13 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧14 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck16 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
为将者,自当识天晓地。35 分钟前
c++多线程
java·开发语言
daqinzl43 分钟前
java获取机器ip、mac
java·mac·ip
激流丶1 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
时差9531 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
让学习成为一种生活方式1 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin