记录: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建表语句相关推荐

  1. python读取excel生成mysql建表语句_python读取excel文件并自动在mysql中建表导数据

    """ 根据excel在mysql中建表(表名为文件名,字段为csv中的header,默认所有字段为varchar,如需更改,在数据库中更改即可),并插入数据 " ...

  2. mysql json建表_json数据自动生成MySQL建表语句

    #_*_coding:utf-8_*_ #author: cike #date: 18-9-13 import pymysql.cursors connection = pymysql.connect ...

  3. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  4. 自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...

    常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...

  5. Shell脚本导出导入MySQL建表语句

    Shell脚本导出导入MySQL建表语句 一.导出sql语句 1.需求: 2.shell脚本如下: 二.导入sql语句 1.需求 2.shell实现1 3.shell实现2 一.导出sql语句 1.需 ...

  6. mysql 建表语句 stored as_Druid 解析Hive建表语句解析报错

    Druid 版本: com.alibaba druid-spring-boot-starter 1.2.3 Hive 建表SQL create table ads_data.sale_detail_o ...

  7. Excel自动生成sql建表语句

    ETL开发中重新整理很多表结构,写建表语句又是一件头疼的事情,干脆借鉴网友的代码,自己写了一个自动生成建表sql的模板. 模板下载:http://download.csdn.net/detail/en ...

  8. mysql 博客建表语句,mysql建表语句

    mysql建表语句 (2012-08-07 13:25:20) 标签: 杂谈 create table messages( id int unsigned primary key auto_incre ...

  9. navicat mysql 建表语句_navicat 8 for mysql怎么用语句建表

    Navicat是一套快速,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的需要.Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创 ...

  10. mysql建表语句enum_mysql创建表语句格式

    SQL创建表格式:DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id`                   bigint    ...

最新文章

  1. Cstring的使用
  2. 【CV】PAA论文解读:在物体检测中利用概率分布来将anchor分配为正负样本
  3. Oracle优化07-分析及动态采样-DBMS_STATS 包
  4. 正则表达式在js和java中的使用
  5. HDU2106 decimal system
  6. shell学习三十四天----printf详解
  7. angularjs directive 实例 详解
  8. linux安装了vnc服务器,Linux安装VNC服务及配置
  9. 项目铺垫系列导航目录
  10. Apache POI 读写 Word、PPT、Excel
  11. 修改user-agent爬取数据 遇到的问题
  12. java 普通方法_Java普通方法与static方法的多态
  13. 金蝶KIS记账王账务处理常见问题解决方案
  14. ios引导商店评分问题
  15. flutter 初视回味
  16. nginx 配置后缀
  17. Python - 体脂率
  18. Java的Socket网络编程
  19. java socket send_Socket send函数和recv函数详解
  20. 如何把图片缩小到200k?怎么压缩图片到指定像素?

热门文章

  1. 普林斯顿微积分读本-[美]阿德里安·班纳著-修订版;杨爽, 赵晓婷, 高璞译
  2. 【QBKbupt】洛谷P2525Uim的情人节礼物·其之壱
  3. Win11 可能解决Tomcat文件bin中startup打不开闪烁进不去的方法
  4. 数据恢复软件FinalData
  5. 智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析
  6. html默认半透明遮罩层,css遮罩层 半透明
  7. 计算机操作系统(第四版)课后习题答案西电版
  8. 【一周头条盘点】中国软件网(2018.9.10~2018.9.14)
  9. 《高性能MySQL》读书笔记
  10. VS2013密钥 VS2013专业版密钥 VS2013旗舰版密钥