zoukankan      html  css  js  c++  java
  • JAVA数据库建表工具类

    前言:

    在实际项目中会遇到建主题数据库的工作(主题数据库定义:面向特定的学科和应用领域,由若干的逻辑相关的数据源按照统一的标准规范整合形成,具有系统性和完整性,并通过统一的系统提供一站式服务的数据库。),就是批量按照需求建表,此时就需要一些代码辅助操作。

    思路:

    1、相关人员会提供表结构文件,类似如下图:

     2、提取有用信息,单独建立excle文件,如下图:

     3、使用代码把信息读取出来,

    4、生成SQL语句,

    具体实现:

    1、准备java代码需要依赖的jar包:

     <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.0</version>
            </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
           <dependency>
                <groupId>org.apache.poi</groupId>
               <artifactId>poi-ooxml</artifactId>
               <version>4.1.0</version>
         </dependency>

    2、测试用的实体类:

    package com.test.word;
    
    import java.io.Serializable;
    /**
     * 模拟的实体类
     * @author xieh
     *
     */
    public class Test  implements Serializable{
        private  int id;
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Test [id=" + id + ", name=" + name + "]";
        }
    }

    3、操作excle表工具类:

    package com.test.word;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.CreationHelper;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFCellStyle;
    import org.apache.poi.xssf.usermodel.XSSFDataFormat;
    import org.apache.poi.xssf.usermodel.XSSFRichTextString;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    /**
     * excle工具类
     * 
     * @author xieh 2019/11/24 使用的jar包是:poi-4.1.0.jar 和 poi-ooxml-4.1.0.jar
     *
     */
    public class ExcelUtil {
        
        /**
         * 读取excle内容:注意此方法不兼容.xlsx文件
         * @throws Exception
         */
        @SuppressWarnings("resource")
        public static List<Map<String, String>> excelRead() throws Exception {
            //用流的方式先读取到你想要的excel的文件
            //FileInputStream fis=new FileInputStream(new File(System.getProperty("user.dir")+"/src/excel.xls"));
            FileInputStream fis = new FileInputStream(new File("D:/a.xls"));
            // 解析excel
            POIFSFileSystem pSystem = new POIFSFileSystem(fis);
            // 获取整个excel
            HSSFWorkbook hb = new HSSFWorkbook(pSystem);
            System.out.println(hb.getNumCellStyles());
            // 获取第一个表单sheet
            HSSFSheet sheet = hb.getSheetAt(0);
            // 获取第一行
            int firstrow = sheet.getFirstRowNum();
            // 获取最后一行
            int lastrow = sheet.getLastRowNum();
            // 存取最后结果
            List<Map<String, String>> result = new ArrayList<Map<String, String>>();
            // 循环行数依次获取列数
            for (int i = firstrow; i < lastrow + 1; i++) {
                // 获取哪一行i
                Row row = sheet.getRow(i);
                // 存放每行的键值对结果
                Map<String, String> tempMap = new HashMap<String, String>();
                if (row != null) {
                    // 获取这一行的第一列
                    int firstcell = row.getFirstCellNum();
                    // 获取这一行的最后一列
                    int lastcell = row.getLastCellNum();
                    // 创建一个集合,用处将每一行的每一列数据都存入集合中
                    //List<String> list = new ArrayList<String>();
                    for (int j = firstcell; j < lastcell; j++) {
                        // 获取第j列
                        Cell cell = row.getCell(j);
                        if (cell != null && !("").equals(cell.toString())) {
                            //System.out.print(cell + "	");
                            //list.add(cell.toString());
                            tempMap.put("c" + j, cell.toString().trim());
                        }
                    }
                    // 存放每行的结果
                    result.add(tempMap);
                }// row if end
                
            }// for end
            fis.close();
            System.out.println(result.toString());
            return result;
        }
    
        
        
        
        /**
         * 此方法兼容.xls 和 .xlsx格式,建议使用
         * @param path excle文件路径
         * @param sheetIndex  excle文件的Sheet页的下标,从0开始
         * @return excle表中的内容
         * @throws Exception
         */
        @SuppressWarnings("resource")
        public static List<Map<String, String>> excelXRead(String path,int sheetIndex) throws Exception {
            //用流的方式先读取到你想要的excel的文件
            //FileInputStream fis=new FileInputStream(new File(System.getProperty("user.dir")+"/src/excel.xls"));
             File excel = new File(path);
             String[] split = excel.getName().split("\.");  //.是特殊字符,需要转义
             Workbook wb = null;
             FileInputStream  fis = null;
             
             //根据文件后缀(xls/xlsx)进行判断
             if ( "xls".equals(split[1])){
                 fis = new FileInputStream(excel);   //文件流对象 
                 wb = new HSSFWorkbook(fis);
                 
             }else if ("xlsx".equals(split[1])){
                 wb = new XSSFWorkbook(excel);
                 
             }else {
                 System.out.println("文件类型错误!");
                 return new ArrayList<>();
                 
             }    
             //开始解析
             Sheet sheet = wb.getSheetAt(sheetIndex);     //读取sheet 0
            // 获取第一行
            int firstrow = sheet.getFirstRowNum() + 1; //第一行是列名,所以不读
            // 获取最后一行
            int lastrow = sheet.getLastRowNum();
            // 存取最后结果
            List<Map<String, String>> result = new ArrayList<Map<String, String>>();
            // 循环行数依次获取列数
            for (int i = firstrow; i < lastrow + 1; i++) {
                // 获取哪一行i
                Row row = sheet.getRow(i);
                // 存放每行的键值对结果
                Map<String, String> tempMap = new HashMap<String, String>();
                if (row != null) {
                    // 获取这一行的第一列
                    int firstcell = row.getFirstCellNum();
                    // 获取这一行的最后一列
                    int lastcell = row.getLastCellNum();
                    // 创建一个集合,用处将每一行的每一列数据都存入集合中
                    //List<String> list = new ArrayList<String>();
                    for (int j = firstcell; j < lastcell; j++) {
                        // 获取第j列
                        Cell cell = row.getCell(j);
                        if (cell != null && !("").equals(cell.toString())) {
                            //System.out.print(cell + "	");
                            //list.add(cell.toString());
                            tempMap.put("c" + j, cell.toString().trim());
                        }
                    }
                    // 存放每行的结果
                    result.add(tempMap);
                }// row if end
                
            }// for end
            
            if(null != fis){
                fis.close();
            }
            System.out.println(result.toString());
            return result;
        }
        
        
        /**
         * 创建和写入excle内容
         * @param exportList 实体类list
         * @param file 生成的文件路径
         * @throws Exception
         */
        public static void writeXls(List<Test> exportList, File file) throws Exception {
             
            String[] options = { "ID", "内容", "名字" };
            XSSFWorkbook book = new XSSFWorkbook();
     
            CreationHelper createHelper = book.getCreationHelper();
     
            XSSFCellStyle style = book.createCellStyle();
            XSSFCellStyle dateStyle = book.createCellStyle();
            XSSFDataFormat format = book.createDataFormat();
            style.setWrapText(true);
            dateStyle.setWrapText(true);
     
            XSSFSheet sheet = book.createSheet("sheet");
     
            sheet.setColumnWidth(3, 13000);
            sheet.setDefaultColumnWidth(20);
     
            XSSFRow firstRow = sheet.createRow(0);
            XSSFCell[] firstCells = new XSSFCell[3];
     
            CellStyle styleBlue = book.createCellStyle(); // 样式对象
            // 设置单元格的背景颜色为淡蓝色
            styleBlue.setWrapText(true);// 指定当单元格内容显示不下时自动换行
     
            Font font = book.createFont();
            //font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            font.setFontName("宋体");
            font.setFontHeight((short) 280);
            style.setFont(font);
            dateStyle.setFont(font);
            dateStyle.setDataFormat(format.getFormat("yyyy-mm-dd"));
            styleBlue.setFont(font);
     
            for (int j = 0; j < options.length; j++) {
                firstCells[j] = firstRow.createCell(j);
                firstCells[j].setCellStyle(styleBlue);
                firstCells[j].setCellValue(new XSSFRichTextString(options[j]));
            }
            getExport(sheet, style, createHelper, exportList, dateStyle);
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
     
            OutputStream os = new FileOutputStream(file);
            book.write(os);
            os.close();
        }
    
        
        
        
        
        
        /**
         * excle实体数据写入
         * @param sheet
         * @param style
         * @param createHelper
         * @param exportList
         * @param dateStyle
         */
        private static void getExport(XSSFSheet sheet, XSSFCellStyle style, CreationHelper createHelper, List<Test> exportList,
                XSSFCellStyle dateStyle) {
            // 遍历实例类的list集合
            for (int i = 0; i < exportList.size(); i++) {
                // 创建行
                XSSFRow row = sheet.createRow(i + 1);
                
                // 实体类
                Test export = exportList.get(i);
                
                // 第一列
                XSSFCell hotelId = row.createCell(0);
                hotelId.setCellStyle(style);
                
                // 第二列
                XSSFCell hotelName = row.createCell(1);
                hotelName.setCellStyle(dateStyle);
                
                // 第三列
                XSSFCell chargeCount = row.createCell(2);
                chargeCount.setCellStyle(style);
                
                // 设置值
                hotelId.setCellValue(export.getId());
                hotelName.setCellValue("测试");
                chargeCount.setCellValue(export.getName());
     
                // ta.append("写入excel开始,行数是" + (i + 1) + "
    ");
            }// for end
     
        }
    
        
        
        
        
        /**
         * 测试
         * 
         * @param args
         */
        public static void main(String[] args) {
            try {
                ExcelUtil.excelRead();
                ExcelUtil.excelXRead("D:/柱子.xlsx",0);
                ExcelUtil.excelXRead("D:/a.xls",0);
                List<Test> show = new ArrayList<Test>();
                Test test1 = new Test();
                test1.setId(1);
                test1.setName("xieh");
                
                Test test2 = new Test();
                test2.setId(2);
                test2.setName("xieh");
                show.add(test1);
                show.add(test2);
                ExcelUtil.writeXls(show, new File("D:/bbb.xls"));
                ExcelUtil.writeXls(show, new File("D:/aaa.xlsx"));
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }

    4、生成SQL表结构的工具类:

    package com.test.word;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 数据库建表工具类
     * @author xieh 2019/11/27
     *
     */
    public class SQLTableUtil {
        
        //private String mysql = "MYSQL";
        //private String mssql = "MSSQL";
        //private String oracle = "ORACLE";
        //private String psql = "PSQL";
        
        /**
         * MySQL数据库创建表SQL语句生成
         * @param listSqlFiled
         * @return
         */
        public static String createMYSQL(List<Map<String, String>> listSqlFiled){
            if(listSqlFiled != null && listSqlFiled.size()>0){
                List<String>  priKeyArray = new ArrayList<String>();// 主键集合
                StringBuilder sqlStr = new StringBuilder();
                // 获取第一个map,存在表名
                Map<String, String> mapFirst = listSqlFiled.get(0);
                /*int countMapFirst = 0;// 控制第一行的表名和表注释遍历次数
                for(Map.Entry<String, String> entry:mapFirst.entrySet()){
                    if(countMapFirst == 0){
                        sqlStr.append("DROP TABLE IF EXISTS `"+ entry.getValue() +"`;
    ");
                        sqlStr.append("CREATE TABLE `"+ entry.getValue() +"` (
    ");
                    }
                    
                }*/
                sqlStr.append("DROP TABLE IF EXISTS `"+ mapFirst.get("c0") +"`;
    ");
                sqlStr.append("CREATE TABLE `"+  mapFirst.get("c0") +"` (
    ");
                
                int length = listSqlFiled.size();
                // 遍历list集合
                for(int i = 1; i < length; i ++){
                    // 遍历map集合
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append("`"+ map.get("c1") +"`	 "+ map.get("c2") +"	");
                    // 是否为主键并且主键不能为空
                    if(map.get("c3").equalsIgnoreCase("Y")){
                        priKeyArray.add(map.get("c1"));
                        sqlStr.append("NOT NULL COMMENT '"+map.get("c5")+"',
    ");
                        //表示结束了到最后一行了,并且只有一个主键
                        if(i >= length - 1 && priKeyArray.size() == 1){// 只有一个主键时
                            sqlStr.append("PRIMARY KEY (`"+ priKeyArray.get(0) +"`)
    ");
                            sqlStr.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                        // 表示到最后一行了,并且存在多个主键
                        }else if(i >= length - 1 && priKeyArray.size() > 1){// 多个主键时
                            sqlStr.append("PRIMARY KEY (");
                            // 遍历主键
                            for(int k = 0; k < priKeyArray.size(); k ++){
                                // 到最后一个主键时
                                if(k == priKeyArray.size() - 1){
                                    sqlStr.append("`"+ priKeyArray.get(k) +"`) USING BTREE 
    ");
                                }else{
                                    sqlStr.append("`"+ priKeyArray.get(k) +"`,");
                                }
                            }
                            sqlStr.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                        }
                    
                    // 非主键,直接判断是否允许为空
                    }else {
                        // 表示没有主键,并且到最后一个了
                        if(priKeyArray.size() <=0 && i >= length - 1){
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append("DEFAULT NULL COMMENT '"+map.get("c5")+"'
    ");
                            }else{
                                sqlStr.append("NOT NULL COMMENT '"+map.get("c5")+"'
    ");
                            }
                            sqlStr.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                        
                        // 表示有主键,并且是到最后一行了
                        }else if(priKeyArray.size() >0 && i >= length - 1){
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append("DEFAULT NULL COMMENT '"+map.get("c5")+"',
    ");
                            }else{
                                sqlStr.append("NOT NULL COMMENT '"+map.get("c5")+"',
    ");
                            }
                            // 表示只有一个主键
                            if(priKeyArray.size() == 1){
                                sqlStr.append("PRIMARY KEY (`"+ priKeyArray.get(0) +"`)
    ");
                                sqlStr.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                            // 表示有多个主键    
                            }else{
                                sqlStr.append("PRIMARY KEY (");
                                // 遍历主键
                                for(int k = 0; k < priKeyArray.size(); k ++){
                                    // 到最后一个主键时
                                    if(k == priKeyArray.size() - 1){
                                        sqlStr.append("`"+ priKeyArray.get(k) +"`) USING BTREE 
    ");
                                    }else{
                                        sqlStr.append("`"+ priKeyArray.get(k) +"`,");
                                    }
                                }
                                sqlStr.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
                            }
                        
                        // 没有到最后一行继续追加
                        }else{
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append("DEFAULT NULL COMMENT '"+map.get("c5")+"',
    ");
                            }else{
                                sqlStr.append("NOT NULL COMMENT '"+map.get("c5")+"',
    ");
                            }
                        }
        
                    }//
        
                }// for end
            
                return sqlStr.toString();
            }else{
                return "";
            }
        }
        
        /**
         * sqlserver数据库创建表SQL语句
         * @param listSqlFiled
         * @return
         */
        public static String createMSSQL(List<Map<String, String>> listSqlFiled){
            if(listSqlFiled != null && listSqlFiled.size()>0){
                StringBuilder sqlStr = new StringBuilder();
                // 获取第一个map,存在表名
                Map<String, String> mapFirst = listSqlFiled.get(0);
                sqlStr.append("IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].["+ mapFirst.get("c0") +"]') AND type IN ('U'))
    ");
                sqlStr.append("DROP TABLE [dbo].["+  mapFirst.get("c0") +"]
    ");
                sqlStr.append("GO
    ");
                sqlStr.append("CREATE TABLE "+  mapFirst.get("c0") +" (
    ");
                
                int length = listSqlFiled.size();
                // 遍历list集合:生成基本表结构阶段
                for(int i = 1; i < length; i ++){
                    // 遍历map集合
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append("["+ map.get("c1") +"]	 "+ map.get("c2") +"	");
                    // 是否为主键并且主键不能为空
                    if(map.get("c3").equalsIgnoreCase("Y")){
                        if(i >= length - 1){// 表示最后一个并且是主键
                            sqlStr.append("primary key     NOT NULL
    ");
                            sqlStr.append(")");
                        }else{
                            sqlStr.append("primary key     NOT NULL ,
    ");
                        }
                    
                    // 非主键,直接判断是否允许为空
                    }else {
                        if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                            if(i >= length -1){// 表示允许为空并且是最后一个
                                sqlStr.append("DEFAULT NULL
    ");
                                sqlStr.append(")");
                            }else{// 表示允许为空继续追加
                                sqlStr.append("DEFAULT NULL ,
    ");
                            }
                        }else{// 不允许为空
                            if(i >= length -1){// 表示不允许为空并且是最后一个
                                sqlStr.append("NOT NULL
    ");
                                sqlStr.append(")");
                            }else{// 表示不允许为空继续追加
                                sqlStr.append("NOT NULL ,
    ");
                            }
                        }
                        
                    }//
        
                }// for end基本表结构生成完成
                
                // 开始追加注释阶段
                sqlStr.append("
    ");
                for(int i = 1; i < length; i ++){
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append("EXEC sp_addextendedproperty
    ");
                    sqlStr.append("'MS_Description', N'"+ map.get("c5") +"',
    ");
                    sqlStr.append("'SCHEMA', N'dbo',
    ");
                    sqlStr.append("'TABLE', N'"+  mapFirst.get("c0") +"',
    ");
                    sqlStr.append("'COLUMN', N'"+ map.get("c1") +"'
    ");
                    sqlStr.append("GO
    ");
                    sqlStr.append("
    ");
                }
                return sqlStr.toString();
            }else{
                return "";
            }
        }
        
        
        
        /**
         * Oracle数据创建表SQL语句
         * @param listSqlFiled
         * @param dbUserName
         * @return
         */
        public static String createORACLE(List<Map<String, String>> listSqlFiled,String dbUserName){
    
            if(listSqlFiled != null && listSqlFiled.size()>0){
                List<String>  priKeyArray = new ArrayList<String>();// 主键集合
                StringBuilder sqlStr = new StringBuilder();
                // 获取第一个map,存在表名
                Map<String, String> mapFirst = listSqlFiled.get(0);
                sqlStr.append("create table "+ dbUserName +"."+ mapFirst.get("c0") +"(
    ");
                int length = listSqlFiled.size();
                // 遍历list集合
                for(int i = 1; i < length; i ++){
                    // 遍历map集合
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append(""+ map.get("c1") +"	 "+ map.get("c2") +"	");
                    // 是否为主键并且主键不能为空
                    if(map.get("c3").equalsIgnoreCase("Y")){
                        priKeyArray.add(map.get("c1"));
                        sqlStr.append("NOT NULL,
    ");
                        //表示结束了到最后一行了,并且只有一个主键
                        if(i >= length - 1 && priKeyArray.size() == 1){// 只有一个主键时
                            sqlStr.append("PRIMARY KEY ("+ priKeyArray.get(0) +")
    ");
                            sqlStr.append(");
    ");
                        // 表示到最后一行了,并且存在多个主键
                        }else if(i >= length - 1 && priKeyArray.size() > 1){// 多个主键时
                            sqlStr.append("PRIMARY KEY (");
                            // 遍历主键
                            for(int k = 0; k < priKeyArray.size(); k ++){
                                // 到最后一个主键时
                                if(k == priKeyArray.size() - 1){
                                    sqlStr.append(""+ priKeyArray.get(k) +")
    ");
                                }else{
                                    sqlStr.append(""+ priKeyArray.get(k) +",");
                                }
                            }
                            sqlStr.append(");
    ");
                        }
                    
                    // 非主键,直接判断是否允许为空
                    }else {
                        // 表示没有主键,并且到最后一个了
                        if(priKeyArray.size() <=0 && i >= length - 1){
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append("
    ");
                            }else{
                                sqlStr.append("NOT NULL
    ");
                            }
                            sqlStr.append(");
    ");
                        
                        // 表示有主键,并且是到最后一行了
                        }else if(priKeyArray.size() >0 && i >= length - 1){
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append(",
    ");
                            }else{
                                sqlStr.append("NOT NULL,
    ");
                            }
                            // 表示只有一个主键
                            if(priKeyArray.size() == 1){
                                sqlStr.append("PRIMARY KEY ("+ priKeyArray.get(0) +")
    ");
                                sqlStr.append(");
    ");
                            // 表示有多个主键    
                            }else{
                                sqlStr.append("PRIMARY KEY (");
                                // 遍历主键
                                for(int k = 0; k < priKeyArray.size(); k ++){
                                    // 到最后一个主键时
                                    if(k == priKeyArray.size() - 1){
                                        sqlStr.append(""+ priKeyArray.get(k) +")
    ");
                                    }else{
                                        sqlStr.append(""+ priKeyArray.get(k) +",");
                                    }
                                }
                                sqlStr.append(");
    ");
                            }
                        
                        // 没有到最后一行继续追加
                        }else{
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append(",
    ");
                            }else{
                                sqlStr.append("NOT NULL,
    ");
                            }
                        }
        
                    }//
        
                }// for end
                
                sqlStr.append("
    ");
                // 添加字段注释
                for(int i = 1; i < length; i ++){
                    // 遍历map集合
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append("comment on column "+ dbUserName +"."+ mapFirst.get("c0") +"."+ map.get("c1")+" is '"+ map.get("c5")+"';
    ");    
                }    
                return sqlStr.toString();
            }else{
                return "";
            }
        
        }
        
        
        /**
         * PostgreSQL数据库创建表SQL语句
         * @param listSqlFiled
         * @return
         */
        public static String createPSQL(List<Map<String, String>> listSqlFiled){
            if(listSqlFiled != null && listSqlFiled.size()>0){
                List<String>  priKeyArray = new ArrayList<String>();// 主键集合
                StringBuilder sqlStr = new StringBuilder();
                // 获取第一个map,存在表名
                Map<String, String> mapFirst = listSqlFiled.get(0);
                sqlStr.append("create table "+ mapFirst.get("c0") +"(
    ");
                int length = listSqlFiled.size();
                // 遍历list集合
                for(int i = 1; i < length; i ++){
                    // 遍历map集合
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append(""+ map.get("c1") +"	 "+ map.get("c2") +"	");
                    // 是否为主键并且主键不能为空
                    if(map.get("c3").equalsIgnoreCase("Y")){
                        priKeyArray.add(map.get("c1"));
                        sqlStr.append("NOT NULL,
    ");
                        //表示结束了到最后一行了,并且只有一个主键
                        if(i >= length - 1 && priKeyArray.size() == 1){// 只有一个主键时
                            sqlStr.append("PRIMARY KEY ("+ priKeyArray.get(0) +")
    ");
                            sqlStr.append(");
    ");
                        // 表示到最后一行了,并且存在多个主键
                        }else if(i >= length - 1 && priKeyArray.size() > 1){// 多个主键时
                            sqlStr.append("PRIMARY KEY (");
                            // 遍历主键
                            for(int k = 0; k < priKeyArray.size(); k ++){
                                // 到最后一个主键时
                                if(k == priKeyArray.size() - 1){
                                    sqlStr.append(""+ priKeyArray.get(k) +")
    ");
                                }else{
                                    sqlStr.append(""+ priKeyArray.get(k) +",");
                                }
                            }
                            sqlStr.append(");
    ");
                        }
                    
                    // 非主键,直接判断是否允许为空
                    }else {
                        // 表示没有主键,并且到最后一个了
                        if(priKeyArray.size() <=0 && i >= length - 1){
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append("
    ");
                            }else{
                                sqlStr.append("NOT NULL
    ");
                            }
                            sqlStr.append(");
    ");
                        
                        // 表示有主键,并且是到最后一行了
                        }else if(priKeyArray.size() >0 && i >= length - 1){
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append(",
    ");
                            }else{
                                sqlStr.append("NOT NULL,
    ");
                            }
                            // 表示只有一个主键
                            if(priKeyArray.size() == 1){
                                sqlStr.append("PRIMARY KEY ("+ priKeyArray.get(0) +")
    ");
                                sqlStr.append(");
    ");
                            // 表示有多个主键    
                            }else{
                                sqlStr.append("PRIMARY KEY (");
                                // 遍历主键
                                for(int k = 0; k < priKeyArray.size(); k ++){
                                    // 到最后一个主键时
                                    if(k == priKeyArray.size() - 1){
                                        sqlStr.append(""+ priKeyArray.get(k) +")
    ");
                                    }else{
                                        sqlStr.append(""+ priKeyArray.get(k) +",");
                                    }
                                }
                                sqlStr.append(");
    ");
                            }
                        
                        // 没有到最后一行继续追加
                        }else{
                            if(map.get("c4").equalsIgnoreCase("Y")){// 允许为空
                                sqlStr.append(",
    ");
                            }else{
                                sqlStr.append("NOT NULL,
    ");
                            }
                        }
        
                    }//
        
                }// for end
                
                sqlStr.append("
    ");
                // 添加字段注释
                for(int i = 1; i < length; i ++){
                    // 遍历map集合
                    Map<String, String> map = listSqlFiled.get(i);
                    if(map.size() == 0){// 此处判断不准确,最好的办法就是把excle表的底部多余的行右键删除掉
                        System.out.println("SQL语句不准确,请把excle表底部多余的行右键删除掉!");
                        continue;
                    }
                    sqlStr.append("comment on column "+ mapFirst.get("c0") +"."+ map.get("c1")+" is '"+ map.get("c5")+"';
    ");    
                }    
                return sqlStr.toString();
            }else{
                return "";
            }
        
        
        }
        
        
        /**
         * 测试
         * @param args
         */
        public static void main(String[] args) {
            try {
                // 测试MySQL数据库
                List<Map<String, String>> excelXReadMYSQL = ExcelUtil.excelXRead("F:/cs.xlsx",0);
                System.out.println(createMYSQL(excelXReadMYSQL));
                
                // 测试SQLSERVER数据库
                List<Map<String, String>> excelXReadMSSQL = ExcelUtil.excelXRead("F:/cs.xlsx",1);
                System.out.println(createMSSQL(excelXReadMSSQL));
                
                // 测试Oracle数据库
                List<Map<String, String>> excelXReadORCL = ExcelUtil.excelXRead("F:/cs.xlsx",2);
                System.out.println(createORACLE(excelXReadORCL, "SCOTT"));
                
                // 测试PostgreSQL数据库
                List<Map<String, String>> excelXRead = ExcelUtil.excelXRead("F:/cs.xlsx",3);
                System.out.println(createPSQL(excelXRead));
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }

    使用注意:

    多个表时:

     

    程序空指针错误:

    测试结果演示:PostgreSQL

     

     

    create table T_ZHCS(
    F_ID     SERIAL    NOT NULL,
    F_CATA_ID     VARCHAR(100)    ,
    F_SSJCK     VARCHAR(100)    ,
    F_XXZYMC     VARCHAR(100)    ,
    F_XXZYDM     VARCHAR(100)    ,
    F_XXZYGS     VARCHAR(100)    ,
    F_DATASET_TYPE     VARCHAR(100)    ,
    F_REGION_CODE     VARCHAR(100)    ,
    F_ORGAN_CODE     VARCHAR(100)    ,
    F_XXZYTGF     VARCHAR(100)    ,
    F_GXLX     VARCHAR(100)    ,
    F_KFSX     VARCHAR(100)    ,
    F_SRC_UPDATE_TIME     TIMESTAMP    ,
    F_VALID_FLAG     VARCHAR(100)    ,
    F_DATA_SOURCE_ID     VARCHAR(100)    ,
    F_SYS_CREATE_TIME     TIMESTAMP    ,
    F_SYS_UPDATE_TIME     TIMESTAMP    ,
    F_SRC_TABLE_KEY     VARCHAR(100)    NOT NULL,
    PRIMARY KEY (F_ID,F_SRC_TABLE_KEY)
    );
    
    comment on column T_ZHCS.F_ID is '主键';
    comment on column T_ZHCS.F_CATA_ID is '资源目录ID(主键)';
    comment on column T_ZHCS.F_SSJCK is '所属基础库';
    comment on column T_ZHCS.F_XXZYMC is '信息资源名称';
    comment on column T_ZHCS.F_XXZYDM is '信息资源代码';
    comment on column T_ZHCS.F_XXZYGS is '信息资源格式';
    comment on column T_ZHCS.F_DATASET_TYPE is '资源格式分类';
    comment on column T_ZHCS.F_REGION_CODE is '区划编码';
    comment on column T_ZHCS.F_ORGAN_CODE is '信息资源提供方编码';
    comment on column T_ZHCS.F_XXZYTGF is '信息资源提供方名称';
    comment on column T_ZHCS.F_GXLX is '共享类型';
    comment on column T_ZHCS.F_KFSX is '开放属性';
    comment on column T_ZHCS.F_SRC_UPDATE_TIME is '源系统数据更新时间';
    comment on column T_ZHCS.F_VALID_FLAG is '数据有效标识';
    comment on column T_ZHCS.F_DATA_SOURCE_ID is '数据来源';
    comment on column T_ZHCS.F_SYS_CREATE_TIME is '系统登记时间';
    comment on column T_ZHCS.F_SYS_UPDATE_TIME is '系统更新时间';
    comment on column T_ZHCS.F_SRC_TABLE_KEY is '源表主键ID';

    数据库执行:

    如有错误的地方望大牛们指出错误,大家共同进步

    我只是把结果打在了控制台,其实大家可以拿着结果做其他操作,主要就是结果出来了,至于怎么玩,就看你们的了。哈哈

    博客中演示的excle文件:

    链接:https://pan.baidu.com/s/1prdb4Nk_8b5c7f-bi24U4A
    提取码:vhiz

     
  • 相关阅读:
    [方法] 如何做产品功能设计
    js如何去除一个数组中与另一个数组中的值相同的元素
    js 导出Excel2
    js 导出Excel
    CSS3动画
    没有欲望是一种什么样的感觉
    L9-DOM高级应用
    L8-DOM操作应用
    L7-DOM基础
    L6-js定时器的应用
  • 原文地址:https://www.cnblogs.com/xiejn/p/11946366.html
Copyright © 2011-2022 走看看