网站首页 > java教程 正文
本文介绍一种根据数据库设计文档自动生成建表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>,重新执行解析程序。
猜你喜欢
- 2024-12-17 松勤软件测试:丢掉Excel,手把手教你用Python操作Excel
- 2024-12-17 Excel数据还可这样来查询:用SQL查询输出工作表指定区域更高效!
- 2024-12-17 Pandas:一个高性能的数据分析Python库
- 2024-12-17 《github精选系列》——数据可视化分析平台DataGear
- 2024-12-17 测试驱动技术(TDD)系列之5:从excel中读取数据
- 2024-12-17 Python读取与写入Excel模块:openpyxl
- 2024-12-17 基于java的开源BI可视化工具——DataGear使用教程
- 2024-12-17 将Excel表格直接导出成JSON文件格式的一个小工具
- 2024-12-17 java解析doc、docx内容踩坑日记 java解析文本文件
- 2024-12-17 深入解析 EasyExcel 组件原理与应用
你 发表评论:
欢迎- 04-27微服务部署架构设计详解(图文全面总结)
- 04-27Java微服务架构选型与对比:一场技术流派的巅峰对决
- 04-27微服务架构下Java的最佳实践
- 04-27Java微服务架构选型:优雅拆分与高效整合
- 04-27微服务架构下的Java代码拆分策略:像拼图一样构建系统
- 04-27微服务架构下的Java最佳实践
- 04-27微服务架构下Java的挑战与机遇
- 04-27微服务架构下Java事务管理的艺术
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)