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

数据库实体类


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

express+mySql实现用户注册、登录和身份认证

expressmySql实现用户注册、登录和身份认证 注册 注册时需要对用户密码进行加密入库,提高账户的安全性。用户登录时再将密码以相同的方式进行加密,再与数据库中存储的密码进行比对,相同则表示登录成功。 安装加密依赖包bcryptjs cnpm insta…

CompletableFuture详解

目录 介绍 Future介绍 CompletableFuture介绍 CompletableFuture常用的API介绍 常用的静态方法源码解析 runAsync 源码 案例 结果 supplyAsync 源码 案例 结果 规律 CompletableFuture获取返回值方法介绍 返回值区别 代码演示 返回结果 CompletableFuture其…

【Docker】Swarm内部的负载均衡与VIP

在Docker Swarm中,有两种方式可以实现内部的负载均衡:Service VIP和Routing Mesh。 Service VIP(Virtual IP):Service VIP是一种基于VIP的负载均衡方式,它为每个服务分配一个虚拟IP地址。当请求到达Servic…

Word异常退出文档找回怎么操作?4个正确恢复方法!

“刚刚我在用word编辑文档,但是突然word就显示异常了,然后莫名其妙就自动退出了,这可怎么办?我还有机会找回这些文档吗?” 当我们在使用Microsoft Word时,突然遭遇到程序异常退出的情况,可能会让…

TCP 连接建立

1:TCP 三次握手过程是怎样的? 客户端和服务端都处于 CLOSE 状态,服务端主动监听某个端口,处于 LISTEN 状态 第一次握手:客户端带着序号和SYN为1,把第一个 SYN 报文发送给服务端,客户端处于 SYN-…

Elasticsearch:对时间序列数据流进行降采样(downsampling)

降采样提供了一种通过以降低的粒度存储时间序列数据来减少时间序列数据占用的方法。 指标(metrics)解决方案收集大量随时间增长的时间序列数据。 随着数据老化,它与系统当前状态的相关性越来越小。 降采样过程将固定时间间隔内的文档汇总为单…

引领质量管理新潮流!三坐标CMM质量数据管理报告工具震撼推出!

随着制造业的日益发展,质量管理成为企业竞争的关键要素之一。为了更好地适应市场需求、提高生产效率以及确保产品质量,我们自豪地推出全新的三坐标CMM(Coordinate Measuring Machine)质量数据管理报告工具,助您一臂之力…

【论文】Bao:一种用于现代多核嵌入式系统的轻型静态分区管理程序

Bao:一种用于现代多核嵌入式系统的轻型静态分区管理程序 个人学习过程中 Bao Hypervisor 论文翻译(借助翻译工具个人校对),仅供学习使用,由于个人对一些技术专有名词不够熟悉,翻译不当的地方欢迎指出 论文地…

JS点击返回顶部

在许多的PC端中,我们滑动滚动条,滑倒一定程度的时候,我们会出现一个向上的小三角,点击之后我们就可以直接返回到顶部,这是如何实现的呢? 在做这个效果之前,我们要准备2个事件scroll与click 复制…

[Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战

一.Docker consul集群搭建 Consul 是 Go 语言写的开源的服务发现软件, Consul 具有 服务发现、健康检查、 服务治理、微服务熔断处理 等功能,在微服务中讲过如何搭建consul集群,接下来看看在 Dokcer 中如何去创建搭建consul 集群 1.linux上面部署consul集…

Qt 天气预报项目

参考引用 QT开发专题-天气预报 1. JSON 数据格式 1.1 什么是 JSON JSON (JavaScript Object Notation),中文名 JS 对象表示法,因为它和 JS 中对象的写法很类似 通常说的 JSON,其实就是 JSON 字符串,本质上是一种特殊格式的字符串…

react 学习之react toolkit状态管理

这只是个简单的例子 首先这是store.ts import { configureStore } from reduxjs/toolkit; import { counterSlice } from ./homeSlice;// configureStore 创建store export const store configureStore({reducer: {home: counterSlice.reducer}, }); counterSlice.ts import…

win11 ssh连接ubuntu 出现 command not found: cvs

sudo apt-get install openssh-client sudo apt-get install openssh-server ps -e | grep ssh sudo /etc/init.d/ssh start 仍然报错; command not found: cvs 解决办法为:修改/etc/ssh/sshd_config 文件 修改: 58 PasswordAuthentication yes 5…

【UE】剔除环境颜色

效果 步骤 1. 新建一个空白项目,勾选光线追踪选项 2. 新建一个Basic关卡 3. 添加初学者内容包到内容浏览器 4. 新建一个材质“M_Red” 打开“M_Red”,设置基础颜色为红色 在场景中随便布置一些物品,然后给其中的一个球体设置材质为“M_Red”…

SSH远程连接及报错解决

hostA免密登录hostB hostA ssh-keygen -t rsa 一直回车,再远程拷贝至hostB scp /root/.ssh/id_rsa.pub root:192.168.IP.IP:/root/.ssh/authorized_keys 这个时候可能会报错: scp /root/.ssh/authorized_keys: No such file or directory在hostB上…

Oracle--索引

文章目录 一、索引是什么?二、索引的原理三、索引的特征四、创建索引的方式五、怎么确认索引六、案列七、复合索引 一、索引是什么? 索引(INDEX)是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一…

【python笔记】与网络编程相关的知识总结

前言 菜某的笔记总结 osi七层模型 物理层 打包以下的数据,转化为二进制 数据链路层 双方Mac地址 网络层 双方IP地址 传输层 指定双方的端口 会话层 负责与目标建立断开连接 表示层 对数据加密解密,编码 应用层 规定数据的协议格式(get&…

python 协程

1. 协程 协程,又称微线程,纤程。英文名Coroutine。 https://www.cnblogs.com/coder-qi/p/10163416.html 协程不是计算机提供的,是人为创造的上下文切换技术,也可以被称为微线程。简而言之 其实就是在一个线程中实现代码块相互切…

面向对象设计模式入门知识

设计模式 面向对象设计原则 依赖倒置原则(DIP) 高层模板(稳定)不应该依赖于低层模板(变化), 二者都应该依赖抽象(稳定)抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖抽象(稳定) 开放封闭原则(OCP) 对扩展开放&…

Lesson 08 string类 (中)

C:渴望力量吗,少年? 文章目录 二、string类的介绍与使用2. 使用(5)string类对象的修改操作 三、拷贝1. 引入2. 浅拷贝3. 深拷贝 总结 二、string类的介绍与使用 2. 使用 (5)string类对象的修改…