我平时创建数据库表的时候,都是习惯先用记事本将要用到的字段列出来,写好字段名和注释,像这种


然后用代码读取这个文本,通过中文冒号:分隔,获取到名称和注释,再通过create建表语句,将字段名、注释拼接起来,生成sql输出。这样生成的没有考虑到字段类型、长度,需要建完表后再设置。

然后今天闲来无事,想着得规范一下,在列要用到的字段的时候,就将类型和长度也设计好,执行完sql之后就不用一个一个去改了。所以我用的是excel表格(比较好看),像这样

行数不限,列数只有四列,第一行必须是 表注释:表名,用英文冒号隔开(看自己喜欢用什么符号,代码里改一下就行),可以有多张sheet。

<>先看看生成的效果:

<>代码:
import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.WorkbookUtil;
import lombok.Data; import org.apache.poi.ss.usermodel.*; import org.junit.Test;
import java.io.*; import java.util.ArrayList; import java.util.HashMap; import
java.util.List; import java.util.Map; public class GenerateSqlUtil { @Data
public static class ExcelEntity{ /** 字段名称 */ private String filedName; /** 字段类型
*/ private String filedType; /** 字段注释 */ private String notes; /** 字段属性 */
private String attribute; } /** * 生成sql文件 */ @Test public void generateSql()
throws IOException { System.out.println("开始生成SQL=========================");
//Map<String, Object> map = readExcel(null,null,"用户表"); //读取单个指定sheet数据 List<Map
<String, Object>> result = readExcel(); System.out.println("==============共"+
result.size()+"张表==============="); StringBuilder sb = new StringBuilder(); for
(Map<String, Object> map : result) { List<ExcelEntity> list = (List<ExcelEntity>
) map.get("list"); int size = list.size(); //表名 String tableName = (String) map.
get("tableName"); //注释 String tableNotes = (String) map.get("tableNotes"); sb.
append(String.format("-- %s:%s\n", tableName,tableNotes)); sb.append(String.
format("DROP TABLE IF EXISTS %s;\n", tableName)); sb.append(String.format(
"CREATE TABLE %s (\n", tableName)); for (int i = 0; i < size; i++) {
ExcelEntity entity= list.get(i); sb.append(String.format("\t%s %s", entity.
getFiledName(),entity.getFiledType())); String type = entity.getFiledType();
String attribute= entity.getAttribute(); //设置主键 if (attribute.contains("主键")){
sb.append(" PRIMARY KEY"); }else { //字符串、文本设置编码 //主键类型为字符时,不设置编码 if (type.
contains("char") || type.contains("text")){ sb.append(" CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci"); } } if (attribute.contains("必填")){ sb.append("
NOT NULL COMMENT "); }else { sb.append(" NULL DEFAULT NULL COMMENT "); } sb.
append(String.format("'%s'",entity.getNotes())); if (i < size-1){ sb.append(",")
; } sb.append("\n"); } sb.append(String.format(") ENGINE = InnoDB CHARACTER SET
= utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '%s' ROW_FORMAT = Dynamic;",
tableNotes)); sb.append("\n\n"); } //sql输出的位置 File file=new File(
"C:\\Users\\Admin\\Desktop\\sql.sql"); FileOutputStream fos1=new
FileOutputStream(file); OutputStreamWriter dos1=new OutputStreamWriter(fos1);
dos1.write(sb.toString()); dos1.close(); System.out.println(
"SQL生成完成========================="); } /** * 读取指定sheet的数据,获取表名,字段名、字段类型、字段注释、属性
*/ public Map<String,Object> readExcel(File file,Workbook book,String sheetName)
{ Map<String,Object> map = new HashMap<>(); List<ExcelEntity> list = new
ArrayList<>(); if (file == null){ file = new File(
"C:\\Users\\Admin\\Desktop\\1.xlsx"); } if (book == null){ //WorkbookUtil
hutool的工具类 book = WorkbookUtil.createBook(file); } Sheet sheet = book.getSheet(
sheetName); //第一行是表头,默认是 注释:表名 Row titleRow = sheet.getRow(0); String title =
titleRow.getCell(0).toString(); map.put("tableName",title.split(":")[1]); map.
put("tableNotes",title.split(":")[0]); //第二行是标题,不读取。第三行开始才是数据 int lastRowNum =
sheet.getLastRowNum(); for(int i = 2; i <= lastRowNum; i++){ list.add(getEntity(
sheet.getRow(i))); } map.put("list",list); return map; } /** * 读取多个sheet的数据 */
public List<Map<String,Object>> readExcel() { List<Map<String,Object>> result =
new ArrayList<>(); File file = new File("C:\\Users\\Admin\\Desktop\\1.xlsx");
Workbook book= WorkbookUtil.createBook(file); int sheetNum = book.
getNumberOfSheets(); for (int i = 0; i < sheetNum; i++) { String sheetName =
book.getSheetName(i); result.add(readExcel(file,book,sheetName)); } return
result; } private ExcelEntity getEntity(Row row){ ExcelEntity entity = new
ExcelEntity(); //列数:4列,分别是字段名、字段类型、字段注释、字段属性 for (int j = 0; j < 4; j++) {
String str= row.getCell(j).toString(); if (StrUtil.isNotBlank(str)){ switch (j){
case 0: entity.setFiledName(str); break; case 1: entity.setFiledType(str); break
; case 2: entity.setNotes(str); break; case 3: entity.setAttribute(str); break;
} } } return entity; } }

技术
©2019-2020 Toolsou All rights reserved,
TypeScript:函数类型接口8道大厂指针笔试题让你秒杀指针!!!MySQL 日期时间加减mysql 查询条件之外的数据_mysql 查询符合条件的数据查linux的操作系统版本,如何查看Linux操作系统版本?将String类型转换成Map数据类型使用uuid做MySQL主键,被老板,爆怼一顿C语言中的字符串函数和字符函数linux服务器中毒排查--基础篇C# ASCII码字符转换