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

news/2024/4/25 0:03:30

数据库实体类


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;}

工具类

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+)\"\\)");@Testpublic 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();}
}

输出结果

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 '审批意见');

https://www.xjx100.cn/news/3118999.html

相关文章

【Axure高保真原型】区间评分条

今天和大家分享区间评分条的原型模板,我们可以左右拖动移动滑块到指定位置,评分条上方会根据两个滑块所在的位置,自动计算出对应的区间范围;这个原型模板使用也很简单,只需要在里面填写区间的最大值,即可自…

前端如何中断请求 ( axios、原生 ajax、fetch)

使用场景 在前端开发中,我们经常需要中断请求来优化性能或处理特定的业务需求。以下是一些常见的使用场景: 比如 重复请求:当页面中多个组件并发调用同一个接口时,在第一个请求返回后,我们可能需要中断其他组件对该接…

ARM预取侧信道(Prefetcher Side Channels)攻击与防御

目录 一、预取侧信道简介 1.1 背景:预取分类 二、Arm核会受到影响吗? 2.1 先进的预取器

阿里云国际短信业务网络超时排障指南

选取一台或多台线上的应用服务器或选取相同网络环境下的机器,执行以下操作。 获取公网出口IP。 curl ifconfig.me 测试连通性。 (推荐)执行MTR命令(可能需要sudo权限),检测连通性,执行30秒。 m…

uniapp 使用 flex布局 将 图片展示 循环排列两列

将以下代码改成图片展示 循环排列两列 展示 <template><view><image v-for"(image, index) in imageList" :key"index" :src"image"></image></view> </template><script> export default {data() {…

Proteus的网络标号与总线

Proteus为了减少过多、复杂的连线&#xff0c;可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号&#xff0c;意味着在Proteus上相同的网络标号是连在一起的&#xff0c;所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…

1091 Acute Stroke (三维搜索)

题目可能看起来很难的样子&#xff0c;但是看懂了其实挺简单的。&#xff08;众所周知&#xff0c;pat考察英文水平&#xff09; 题目意思大概是&#xff1a;给你一个L*M*N的01长方体&#xff0c;求全为1的连通块的总体积大小。&#xff08;连通块体积大于T才计算在内&#xf…

unity学习笔记12

一、物理系统 如何让一个球体受到重力的影响&#xff1f; 只要给物体添加刚体组件&#xff08;Rigidbody&#xff09;&#xff0c;就可以使其受到重力影响 1.刚体&#xff08;Rigidbody&#xff09;&#xff1a; 刚体是一个组件&#xff0c;用于使游戏对象受到物理引擎的控制。…