根据excel生成create建表SQL语句

我平时创建数据库表的时候,都是习惯先用记事本将要用到的字段列出来,写好字段名和注释,像这种
在这里插入图片描述
然后用代码读取这个文本,通过中文冒号:分隔,获取到名称和注释,再通过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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43165220/article/details/121519595