龙空技术网

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

Esgoon 1534

前言:

目前各位老铁们对“mysqlsql创建表”大约比较关切,我们都想要剖析一些“mysqlsql创建表”的相关文章。那么小编同时在网络上收集了一些对于“mysqlsql创建表””的相关内容,希望朋友们能喜欢,小伙伴们快快来学习一下吧!

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

数据库设计文档模板

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

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

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

约定数据库文档格式为:

Excel每个Sheet页设计一个数据库表Sheet名字为数据库表中文名Sheet页中第1行为数据库表名Sheet页中表格有5列,分别是:字段名、字段类型、是否非空、默认值、字段中文注解

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

生成建表SQL语句

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

JXL::

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("',\r\n");    }    		    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>,重新执行解析程序。

标签: #mysqlsql创建表 #sql数据库自动编号怎么设置的 #java解析sql建表语句