本文介绍一种根据数据库设计文档自动生成建表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