使用Java根据约定格式生成MySQL建表语句
记录:279
场景:在实际开发中,开发文档中的建表信息以表格的方式提供,包括字段名称、字段类型、字段注释、是否为空等。本例就是先把表格信息转换为约定格式的txt文件,在使用Java代码生成完整的MySQL建表语句。
版本:Spring Boot 2.6.3
一、案例场景
1.开发文档中以表格方式提供建表信息。
2.手动转换为txt文件,文件名:SENSOR_DATA.txt,格式约定如下:
第一行为,表名##表名称。
第二行开始,每行:字段名称##字段类型##字段非空##字段注释##字段主键或者索引。
SENSOR_DATA##传感器数据
ID##BIGINT(16)##Y##实体唯一标识##primary
REGION##VARCHAR(8)##N##区域##index
VALUE1##DECIMAL(16,2)##N##取值1##N
VALUE2##DECIMAL(16,2)##N##取值2##N
3.执行代码,自动生成sql文件,文件名:SENSOR_DATA.sql,生成结果。
create table SENSOR_DATA ( ID BIGINT(16) not null COMMENT '实体唯一标识',REGION VARCHAR(8) COMMENT '区域',VALUE1 DECIMAL(16,2) COMMENT '取值1',VALUE2 DECIMAL(16,2) COMMENT '取值2') ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='传感器数据';
alter table SENSOR_DATA add constraint PK_SENSOR_DATA_ID primary key (ID);
create index IDX_SENSOR_DATA_REGION on SENSOR_DATA (REGION);
二、使用类
1.读文件操作
java.lang.AutoCloseable,接口。
java.io.Closeable,接口,继承AutoCloseable。
java.lang.Readable,接口。
java.io.Reader,抽象类,实现Readable接口和Closeable。
java.io.BufferedReader,实现类,实现Reader抽象类。
java.io.InputStreamReader,实现类,读输入流,Reader抽象类。
java.io.FileReader,实现类,读文件,继承InputStreamReader。
new BufferedReader(new FileReader(fileName))。
2.写文件操作
java.lang.AutoCloseable,接口。
java.io.Closeable,接口,继承AutoCloseable。
java.io.Flushable,接口。
java.lang.Appendable,接口。
java.io.Writer,抽象类,实现Appendable, Closeable, Flushable。
java.io.BufferedWriter,实现类,实现Writer抽象类。
java.io.OutputStreamWriter,实现类,写输出流,Writer抽象类。
java.io.FileWriter,实现类,写文件,继承OutputStreamWriter。
new BufferedWriter(new FileWriter(fileName, true));
3.操作ArrayList
java.lang.Iterable,接口。
java.util.Collection,接口,继承Iterable。
java.util.List,接口,继承Collection。
java.util.AbstractCollection,抽象类,实现Collection。
java.util.AbstractList,抽象类,继承AbstractCollection,实现List。
java.util.ArrayList,一个Resizable-array。
4.Collections
java.util.Collections,对集合相关操作。
5.File操作
java.io.Serializable,接口。
java.lang.Comparable,接口。
java.io.File,实现类,实现Serializable和Comparable接口。
三、代码
1.读文件
读取文件,逐行读取,每读取一行,立即解析,根据分隔符##,分割成多个String字符串,存放在一个List<String>中。解析完成的一行数据List<String>,再放入List<List>中。
读取文件,逐行读取,每读取一行,立即解析,根据分隔符##,分割成多个String字符串,存放在一个List<String>中。解析完成的一行数据List<String>,再放入List<List>中。
public static ArrayList<ArrayList<String>> readFromTxt(String fileName) {ArrayList<ArrayList<String>> listAll = new ArrayList<>();try {//1.读txt文件,一次读一行BufferedReader br = new BufferedReader(new FileReader(fileName));String oneLine = null;//2.使用readLine方法,一次读一行while ((oneLine = br.readLine()) != null) {ArrayList<String> oneLineList = getOneLine(oneLine, "##");listAll.add(oneLineList);}br.close();} catch (Exception e) {System.out.println("读异常.");e.printStackTrace();}return listAll;
}
public static ArrayList<String> getOneLine(String content, String split) {String[] strArr = content.split(split);ArrayList<String> oneLine = new ArrayList<>(strArr.length);Collections.addAll(oneLine, strArr);return oneLine;
}
2.写文件
逐行写文件,以追加方式写入,不覆盖已经写入的内容。
public static void writeFile(String fileName, String content) {try {// 设置为追加写入trueBufferedWriter bw = new BufferedWriter(new FileWriter(fileName, true));bw.write(content);bw.close();} catch (IOException e) {System.out.println("读异常.");e.printStackTrace();}
}
3.生成建表语句和注释
根据从txt读取的表字段信息,生成建表语句和注释。
public static void createTable(String fileName, ArrayList<ArrayList<String>> content) {List<String> firstOne = content.get(0);String tableName = firstOne.get(0);String tableComment = firstOne.get(1);String part1 = "create table ";String part2 = tableName;String part3 = " ( ";writeFile(fileName, part1 + part2 + part3 + "\n");String part5 = " ) " + "ENGINE=INNODB DEFAULT CHARSET=utf8 ";String part6 = " COMMENT='" + tableComment + "';";int size = content.size();for (int i = 0; i < size; i++) {ArrayList<String> oneLine = content.get(i);if (StringUtils.equals(tableName, oneLine.get(0))) continue;String line = "";int last = content.size() - 1;String columnName = oneLine.get(0) + " ";String dataType = oneLine.get(1) + " ";String comment = " COMMENT '" + oneLine.get(3) + "'";if (StringUtils.equals("Y", oneLine.get(2))) {line = columnName + dataType + " not null " + comment + "," + "\n";} else if (i == last) {line = columnName + dataType + comment + "\n";} else {line = columnName + dataType + comment + "," + "\n";}writeFile(fileName, " " + line);}writeFile(fileName, part5 + part6 + "\n");
}
4.生成主键约束和索引
根据从txt读取的表字段信息,生成主键约束和索引。
// 生成主键和索引
public static void createPrimaryAndIndex(String fileName, ArrayList<ArrayList<String>> content) {List<String> firstOne = content.get(0);String tableName = firstOne.get(0);int size = content.size();for (int i = 0; i < size; i++) {ArrayList<String> oneLine = content.get(i);if (StringUtils.equals(tableName, oneLine.get(0))) continue;if (StringUtils.equals("primary", oneLine.get(4).toLowerCase())) {String part1 = "alter table ";String part2 = tableName;String part3 = " add constraint ";String part4 = "PK_" + tableName + "_" + oneLine.get(0);String part5 = " primary key (" + oneLine.get(0) + ");";part4 = getLimitString(part4);String pk = part1 + part2 + part3 + part4 + part5;writeFile(fileName, pk + "\n");}if (StringUtils.equals("index", oneLine.get(4).toLowerCase())) {String part1 = "create index ";String part2 = "IDX_" + tableName + "_" + oneLine.get(0);String part3 = " on ";String part4 = tableName;String part5 = " (" + oneLine.get(0) + ");";part2 = getLimitString(part2);String index = part1 + part2 + part3 + part4 + part5;writeFile(fileName, index + "\n");}}
}
// 限定主键或索引名称字符串30个字符
public static String getLimitString(String srcStr){int length = srcStr.length();if (length > 30) {srcStr = srcStr.substring(0, 30);String underline = srcStr.substring(29, 30);if (StringUtils.equals("_", underline)) {// 最后一个字符是字母而不是下划线srcStr = srcStr.substring(0, 29);}}return srcStr;
}
5.在main函数调用
在main函数调用测试,从指定目录下读取txt文件名称,逐个生成SQL文件。
public static void main(String[] args) {System.out.println("开始...");String baseDir = "D:\\example\\";List<String> listFile = getAllTxtFile(baseDir);for (String fileName : listFile) {singleFile(baseDir, fileName);}System.out.println("结束...");
}
public static List<String> getAllTxtFile(String path) {File dirFile = new File(path);File[] subFiles = dirFile.listFiles();List<String> fileList = new ArrayList<>();if (subFiles != null) {for (File subFile : subFiles) {if (subFile.isDirectory()) continue;else {if (subFile.isFile() && subFile.getName().endsWith(".txt")) {fileList.add(subFile.getName().substring(0, subFile.getName().length() - 4));}}}}return fileList;
}
public static void singleFile(String baseDir, String fileName) {String srcFileName = baseDir + fileName + ".txt";String tarFileName = baseDir + fileName + ".sql";ArrayList<ArrayList<String>> read = readFromTxt(srcFileName);// 表结构与注释createTable(tarFileName, read);// 主键和索引createPrimaryAndIndex(tarFileName, read);
}
以上,感谢。
2022年7月2日
使用Java根据约定格式生成MySQL建表语句相关推荐
- python读取excel生成mysql建表语句_python读取excel文件并自动在mysql中建表导数据
""" 根据excel在mysql中建表(表名为文件名,字段为csv中的header,默认所有字段为varchar,如需更改,在数据库中更改即可),并插入数据 " ...
- mysql json建表_json数据自动生成MySQL建表语句
#_*_coding:utf-8_*_ #author: cike #date: 18-9-13 import pymysql.cursors connection = pymysql.connect ...
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...
- 自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...
常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...
- Shell脚本导出导入MySQL建表语句
Shell脚本导出导入MySQL建表语句 一.导出sql语句 1.需求: 2.shell脚本如下: 二.导入sql语句 1.需求 2.shell实现1 3.shell实现2 一.导出sql语句 1.需 ...
- mysql 建表语句 stored as_Druid 解析Hive建表语句解析报错
Druid 版本: com.alibaba druid-spring-boot-starter 1.2.3 Hive 建表SQL create table ads_data.sale_detail_o ...
- Excel自动生成sql建表语句
ETL开发中重新整理很多表结构,写建表语句又是一件头疼的事情,干脆借鉴网友的代码,自己写了一个自动生成建表sql的模板. 模板下载:http://download.csdn.net/detail/en ...
- mysql 博客建表语句,mysql建表语句
mysql建表语句 (2012-08-07 13:25:20) 标签: 杂谈 create table messages( id int unsigned primary key auto_incre ...
- navicat mysql 建表语句_navicat 8 for mysql怎么用语句建表
Navicat是一套快速,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的需要.Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创 ...
- mysql建表语句enum_mysql创建表语句格式
SQL创建表格式:DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` bigint ...
最新文章
- Cstring的使用
- 【CV】PAA论文解读:在物体检测中利用概率分布来将anchor分配为正负样本
- Oracle优化07-分析及动态采样-DBMS_STATS 包
- 正则表达式在js和java中的使用
- HDU2106 decimal system
- shell学习三十四天----printf详解
- angularjs directive 实例 详解
- linux安装了vnc服务器,Linux安装VNC服务及配置
- 项目铺垫系列导航目录
- Apache POI 读写 Word、PPT、Excel
- 修改user-agent爬取数据 遇到的问题
- java 普通方法_Java普通方法与static方法的多态
- 金蝶KIS记账王账务处理常见问题解决方案
- ios引导商店评分问题
- flutter 初视回味
- nginx 配置后缀
- Python - 体脂率
- Java的Socket网络编程
- java socket send_Socket send函数和recv函数详解
- 如何把图片缩小到200k?怎么压缩图片到指定像素?
热门文章
- 普林斯顿微积分读本-[美]阿德里安·班纳著-修订版;杨爽, 赵晓婷, 高璞译
- 【QBKbupt】洛谷P2525Uim的情人节礼物·其之壱
- Win11 可能解决Tomcat文件bin中startup打不开闪烁进不去的方法
- 数据恢复软件FinalData
- 智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析
- html默认半透明遮罩层,css遮罩层 半透明
- 计算机操作系统(第四版)课后习题答案西电版
- 【一周头条盘点】中国软件网(2018.9.10~2018.9.14)
- 《高性能MySQL》读书笔记
- VS2013密钥 VS2013专业版密钥 VS2013旗舰版密钥