1. 当前位置:首页>百科>数据库设计文档自动生成建表SQL语句

数据库设计文档自动生成建表SQL语句

本文介绍一种根据数据库设计文档自动生成建表SQL语句的方法,以提高工作效率。

数据库设计文档模板

在数据库设计阶段,通常我们会先写数据库设计文档,文档经过评审后在数据库建表,然后完成后续开发工作。为了便于评审以及文档的可读性、可维护性,数据库表的设计一般以表格形式呈现,例如下面的格式(示例中使用的是MySQL数据库):


文档评审通过后,我们需要根据文档内容形成CREATE TABLE建表SQL语句,或者借助于MySQL客户端图形化界面操作,将文档中的表字段信息录入到数据库中。

为了简化在数据库中建表这部分工作,我们可以约定数据库设计文档在Excel中完成,同时约定一定的格式,例如上图中的格式,然后通过程序解析Excel自动生成建表语句。

约定数据库文档格式为:

  • Excel每个Sheet页设计一个数据库表

  • Sheet名字为数据库表中文名

  • Sheet页中第1行为数据库表名

  • Sheet页中表格有5列,分别是:字段名、字段类型、是否非空、默认值、字段中文注解

注意表中的字段类型,是与所使用数据库完全一致的。当然,约定的格式主要是为了满足程序解析方便,同时具备创建数据库表所需的全部信息,这个可以根据实际情况灵活调整。

生成建表SQL语句

生成建表语句的主要工作就是解析Excel文件。Java解析Excel文件可选用JXL或POI这两款开源工具:

  • JXL:https://jxls.sourceforge.net/

  • POI:https://poi.apache.org/

JXL小巧,POI功能强大。建议使用POI,它支持XLS、XLSX两种格式的Excel文件,而JXL不支持XLSX格式。

解析Excel的程序:

import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.xssf.usermodel.XSSFCell;import org.apache.poi.xssf.usermodel.XSSFRow;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public static void main(String[] args) throws Exception {
 createTable();
}

public static void createTable() throws Exception {
 File xlsFile = new File("D:\数据库表模板.xlsx");  // 获得工作簿对象
 XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(xlsFile));  //获取sheet数量
 int sheetCount = workbook.getNumberOfSheets();  //数据库表名  
 String tableName = "";  //字段名
 String column = "";  //字段数据类型
 String dataType = "";  //非空
 String notNull = "";  //默认值
 String defaultValue = "";  //字段注解
 String comment = "";
   
 StringBuffer sqlBuffer = null;
 XSSFSheet sheet;  //遍历Excel的sheet页,每一个sheet对应一个数据库表
 for (int i = 0; i < sheetCount; i++) {
   sheet = workbook.getSheetAt(i);    // 获得行数
   int rows = sheet.getPhysicalNumberOfRows();
   tableName = sheet.getRow(0).getCell(0).getStringCellValue().trim();    //拼接CREATE TABLE建表SQL语句
   sqlBuffer = new StringBuffer();
   sqlBuffer.append("CREATE TABLE ").append("`").append(tableName).append("` (");    // 读取数据
   for (int row = 2; row < rows; row++) {
     XSSFRow currentRow = sheet.getRow(row);
     XSSFCell cell0 = currentRow.getCell(0);      if (cell0 == null) break;
     XSSFCell cell1 = currentRow.getCell(1);
     XSSFCell cell2 = currentRow.getCell(2);
     XSSFCell cell3 = currentRow.getCell(3);
     XSSFCell cell4 = currentRow.getCell(4);
     cell0.setCellType(CellType.STRING);
     cell1.setCellType(CellType.STRING);
     cell2.setCellType(CellType.STRING);
     cell3.setCellType(CellType.STRING);
     cell4.setCellType(CellType.STRING);      //取值
     column = cell0.getStringCellValue().trim();
     dataType = cell1.getStringCellValue().trim();
     notNull = cell2.getStringCellValue().trim();
     defaultValue = cell3.getStringCellValue().trim();
     comment = cell4.getStringCellValue().trim();
     sqlBuffer.append(" `").append(column).append("` ").append(dataType).append(" ");      //拼接NOT NULL关键字
     if (notNull.equals("是") || notNull.equalsIgnoreCase("Y")) {
       sqlBuffer.append("NOT NULL ");
     }      //主键id默认自增
     if (column.equalsIgnoreCase("id")) {
       sqlBuffer.append("AUTO_INCREMENT ");
     }      //拼接DEFAULT默认值
     if (defaultValue != null && !defaultValue.equals("")) {
       sqlBuffer.append("DEFAULT ").append(defaultValue).append(" ");
     }      //拼接字段注解
     sqlBuffer.append("COMMENT '").append(comment).append("', ");
   }
   
   sqlBuffer.append("PRIMARY KEY (`id`)");
   sqlBuffer.append(") COMMENT='").append(sheet.getSheetName()).append("';");    //输出SQL到控制台或写入文件
   System.out.println(sqlBuffer.toString());
 }
 workbook.close();
}

运行解析程序,得到SQL语句(示例只给出sys_student表的建表语句):

CREATE TABLE `sys_student` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `stu_code` varchar(20) NOT NULL COMMENT '学生编号', `stu_name` varchar(20) NOT NULL COMMENT '学生姓名', `gender` enum('男','女','保密') NOT NULL DEFAULT 保密' COMMENT '性别',
`age` tinyint unsigned DEFAULT 18 COMMENT '年龄',
`height` decimal(5,2) COMMENT '身高',
`weight` decimal(3,2) COMMENT '体重',
`mobile` varchar(20) NOT NULL COMMENT '电话号码',
`qq` varchar(20) COMMENT 'QQ号码',
`create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` varchar(20) NOT NULL COMMENT '创建人',
`updater` varchar(20) NOT NULL COMMENT '修改人',
`del_flag` bit NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

得到全部的SQL语句后,可以手动添加各个表所需的索引信息,然后执行这些SQL即可完成建表。或者直接在上面程序中连接数据库执行这些SQL语句完成建表。

这样,当数据库设计文档更新后可以及时同步到数据库,只需在CREATE TABLE之前加上DROP TABLE IF EXIST <table_name>,重新执行解析程序。


本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.5amiao.com/baike/1693.html

联系我们

在线咨询:点击这里给我发消息

QQ号:1045784018

工作日:10:00-17:00,节假日休息