玖叶教程网

前端编程开发入门

数据库设计文档自动生成建表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("',\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>,重新执行解析程序。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言