java数据导出为excel表格_将数据库表中数据导出到文本文件

java数据导出为excel表格_将数据库表中数据导出到文本文件公司开发新系统,需要创建几百个数据库表,建表的规则已经写好放到Excel中,如果手动创建的话需要占用较长的时间去做,而且字段类型的规则又被放到了另一张表,如果手动去一个一个去匹配就很麻烦,所以我先把两张表都导入数据库中,建表的数据如下:其中字段类型被存放到了另一个表中,根据字段的code从另一表去取字段类型:然后通过java程序的方式,从数据库中取出数据自动生成建表语句,代码如下:(主要是提供思路,对于不同的建表规则不能完全适用,SQL语句为oracle数据库SQL语句)importjava.i

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

公司开发新系统,需要创建几百个数据库表,建表的规则已经写好放到Excel中,如果手动创建的话需要占用较长的时间去做,而且字段类型的规则又被放到了另一张表,如果手动去一个一个去匹配就很麻烦,所以我先把两张表都导入数据库中,建表的数据如下:
在这里插入图片描述
其中字段类型被存放到了另一个表中,根据字段的code从另一表去取字段类型:
在这里插入图片描述

然后通过java程序的方式,从数据库中取出数据自动生成建表语句,生成的语句效果是这样的:
在这里插入图片描述

代码如下:(主要是提供思路,对于不同的建表规则不能完全适用,SQL语句为oracle数据库SQL语句)

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TableBuild { 
   
    public static void main(String[] args) throws Exception { 
   
        TableBuild tableBuild = new TableBuild();
        tableBuild.ready();
    }

    void ready() throws Exception { 
   //数据准备,先从数据库中取出建表的表名字段等信息,全部添加到datalist中
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/createtable?characterEncoding=UTF-8&serverTimezone=UTC","root", "root");
        Statement statement = con.createStatement();
        String sql1 = "select * from data";
        ResultSet rs = statement.executeQuery(sql1);
        List<Data> datalist = new ArrayList<Data>();
        while(rs.next()) { 
   
            Data d = new Data();
            d.setTablename(rs.getString("tablename"));//表名
            d.setTablecname(rs.getString("tablecname"));//表注释
            d.setFiledname(rs.getString("filedname"));//字段名
            d.setFiledcname(rs.getString("filedcname"));//字段注释
            d.setIskey(rs.getString("iskey"));//是否为主键
            d.setIsnull(rs.getString("isnull"));//是否可为空
            d.setCode(rs.getString("code"));//用来匹配字段格式的
            datalist.add(d);
        }
        build(con,datalist);
    }

    void build(Connection con,List<Data> datalist) throws SQLException, IOException { 
   //生成建表语句文本
        StringBuffer CT = new StringBuffer();//用来生成建表语句
        StringBuffer AddTip = new StringBuffer();//用来生成添加注释语句
        StringBuffer PK = new StringBuffer();//用来生成联合主键语句
        StringBuffer createtablesql = new StringBuffer();//最终组合成的完整建表语句
        List<String> PKlist = new ArrayList<String>();//用来暂时存放主键字段名的list
        int i;
        for(i=0;i<=(datalist.size()-1);i++){ 
   
            if(datalist.get(i).getTablename().length()==0) continue;//如果表名为空的数据项,则跳过
            if(datalist.get(i).getFiledname().length()==0){ 
   //一个新表开始,重新创建一个表,因为数据库存储的数据,每一个表结束会另起一行,数据中只包含表名,没有数据名,
                System.out.println(datalist.get(i).getTablename()+"表创建");//控制台打印建表提示
                CT.append("create table " + datalist.get(i).getTablename() + "(\r\n");//添加建表语句
                AddTip.append("comment on table "+datalist.get(i).getTablename()+" is '"+datalist.get(i).getTablecname()+"';\r\n");//添加表注释
                continue;
            }else{ 
   //除去创建一个新表,剩下的为字段的创建
                System.out.println("\t"+datalist.get(i).getFiledname()+"字段创建");//控制台打印字段提示
                CT.append("\t"+datalist.get(i).getFiledname());//字段名

                //以下为字段类型的取值,针对其他不同的数据规则以下代码一般不适用,由于本次任务字段类型被放到了另一张表中,所以需要使用data表中的code去匹配对应的type表中的type类型,以此来确定字段类型
                String code = datalist.get(i).getCode();//
                String sql2 = "select type from type where code = '"+code+"'";
                Statement statement = con.createStatement();
                ResultSet rs = statement.executeQuery(sql2);
                String type = null;
                while (rs.next()){ 
   
                    type = rs.getString("type");
                }
                if(type.equals("YYYY-MM-DD")||type.equals("YYYY-MM-DD HH:MM:SS")){ 
   //日期类型
                    CT.append(" date");
                }else if(type.indexOf("n(")!=-1){ 
   //形如18n(2)这种type为number类型,写成number(18,2)
                    String t1 = "";
                    String t2 = "";
                    List<String> t = Arrays.asList(type.split(""));
                    for(int j = 0;j<t.size();j++){ 
   
                        if(t.get(j).charAt(0)>=48 && t.get(j).charAt(0)<=57){ 
   
                            t1 += t.get(j);
                        }
                        else break;
                    }
                    for(int j=0;j<t.size();j++){ 
   
                        if(t.get(j).charAt(0)==40){ 
   
                            for(int k=j+1;k<t.size();k++){ 
   
                                if(type.charAt(k) >= 48 && type.charAt(k) <= 57){ 
   
                                    t2 += t.get(k);
                                }
                            }
                        }
                    }
                    CT.append(" number("+t1+","+t2+")");
                }else if(type.indexOf("n")!=-1) { 
   //剩下为varchar2类型
                    String t = "";
                    for (int j = 0; j < type.length(); j++) { 
   
                        if (type.charAt(j) >= 48 && type.charAt(j) <= 57) { 
   
                            t += type.charAt(j);
                        }
                    }
                    CT.append(" varchar2(" + t + ")");
                }else{ 
   }
                //字段类型结束

                if(datalist.get(i).getIskey().equals("Y")){ 
   //字段是否是联合主键
                    PKlist.add(datalist.get(i).getFiledname());//是则把字段名加入到联合主键集合中
                }

                if(datalist.get(i).getIsnull().equals("N")){ 
   //字段是否可为空
                    CT.append(" not null");
                }
                CT.append(",");

                //把联合主键拼接到建表语句的末尾
                if(i==(datalist.size()-1)||!datalist.get(i).getTablename().equals(datalist.get(i+1).getTablename())){ 
   //当下一条数据开始为新的表时
                    if(PKlist.size()>0){ 
   
                        //添加联合主键
                        PK.append("\tCONSTRAINT PK_" + datalist.get(i).getTablename() + " PRIMARY KEY (");
                        for(String str : PKlist){ 
   //把存有主键的list用逗号分隔开转化成String类型
                            PK.append(str).append(",");
                        }
                        PK = PK.deleteCharAt(PK.length()-1);//去掉拼接完成后最后一个逗号
                        PKlist.clear();//清空PKlist
                        PK.append(")");

                        CT.append("\r\n");
                        CT.append(PK);//把生成的主键语句拼接到建表语句中
                        PK.delete(0,PK.length());//拼接完后清空创建主键语句
                        CT.append("\r\n);");
                    }
                }
                CT.append("\r\n");
                //添加字段注释
                AddTip.append("comment on column "+datalist.get(i).getTablename()+'.'+datalist.get(i).getFiledname()+" is '"+datalist.get(i).getFiledcname()+"';\r\n");
                
                //在建表语句结束之后拼接上注释语句,一起放到汇总的sql语句当中
                if(i==(datalist.size()-1)||!datalist.get(i).getTablename().equals(datalist.get(i+1).getTablename())){ 
   //当下一条数据开始为新的表时
                    createtablesql.append(CT);
                    createtablesql.append(AddTip);
                    CT.delete(0,CT.length());
                    AddTip.delete(0,AddTip.length());
                }
            }
        }

        //输出到文本文件
        File f = new File("1.txt");
        if(!f.exists()){ 
   
            f.createNewFile();
        }
        BufferedWriter output = new BufferedWriter(new FileWriter(f));
        output.write(createtablesql.toString());
        output.close();
    }
}

Data类代码:

public class Data { 
   
    private String tablename;
    private String tablecname;
    private String filedname;
    private String filedcname;
    private String iskey;
    private String isnull;
    private String code;

    public String getTablename() { 
   
        return tablename;
    }

    public void setTablename(String tablename) { 
   
        this.tablename = tablename;
    }

    public String getTablecname() { 
   
        return tablecname;
    }

    public void setTablecname(String tablecname) { 
   
        this.tablecname = tablecname;
    }

    public String getFiledname() { 
   
        return filedname;
    }

    public void setFiledname(String filedname) { 
   
        this.filedname = filedname;
    }

    public String getFiledcname() { 
   
        return filedcname;
    }

    public void setFiledcname(String filedcname) { 
   
        this.filedcname = filedcname;
    }

    public String getIskey() { 
   
        return iskey;
    }

    public void setIskey(String iskey) { 
   
        this.iskey = iskey;
    }

    public String getIsnull() { 
   
        return isnull;
    }

    public void setIsnull(String isnull) { 
   
        this.isnull = isnull;
    }

    public String getCode() { 
   
        return code;
    }

    public void setCode(String code) { 
   
        this.code = code;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196066.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么叫侧面指纹识别_屏下指纹和侧面指纹触控有什么区别

    什么叫侧面指纹识别_屏下指纹和侧面指纹触控有什么区别指纹识别作为一种生物识别方案,在手机上的应用为用户日常使用带来了极大的便利,从解锁手机到应用加密再到支付等场景,原本需要输密码的繁琐场景如今按一下手指就行。随着手机的发展,指纹解锁也出现了不同的解决方案,比如OPPOK3所采用的目前主流的屏下指纹解锁,以及荣耀9X所采用侧面指纹解锁。那么在实际应用场景中,哪种指纹识别更实用呢?采用了屏幕指纹的OPPOK3与侧面指纹的荣耀9X都有着真全面屏的设计…

    2022年6月30日
    44
  • 端口timewait如何解决_如何检测端口状态

    端口timewait如何解决_如何检测端口状态网上查了一下端口状态的资料,我下面总结了一下,自己学习学习:TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:C……

    2025年9月26日
    4
  • javascript中的字符串编码转换

    javascript中的字符串编码转换起因 自定义的一个 spider 在抓取来的数据中 有各式各样的数据存储编码 有些编码是 uxxxx uxxxx 的方式 这就涉及到一个 unicode 到可见字符的转换 比如转换为 gb2312 这样才能方便我们离开浏览器后也能阅读 原文链接 http ddbiz com p 194 在网上找了很多次方面的编码转换对照表 不过几乎没有一个完整 所以自己整理了一份 希望对大家有帮助 它

    2025年7月3日
    1
  • intellijidea激活码【最新永久激活】

    (intellijidea激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    178
  • Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、检查操作

    Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、检查操作

    2022年1月1日
    54
  • linux 虚拟网络_macvlan原理

    linux 虚拟网络_macvlan原理      macvlan是Linux操作系统内核提供的网络虚拟化方案之一,更准确的说法是网卡虚拟化方案。它可以为一张物理网卡设置多个mac地址,相当于物理网卡施展了影分身之术,由一个变多个,同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。macvlan应该很简单。1.环境准备         假设有一块物理…

    2022年8月10日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号