公司开发新系统,需要创建几百个数据库表,建表的规则已经写好放到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>();//用来暂时存放主键字段名的listint 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();//清空PKlistPK.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;}
}

关于使用java程序从excel或者数据库中取出建表规则数据,自动生成数据库建表语句(适用于批量建数据库表)相关推荐

  1. excel中如何et vb根据数据自动生成表格_如何实现excel与PPT互联互通(动态生成PPT)...

    因为经常要做周报.月报PPT,每次重复的的操作效率很低,这里整理了一套可以自动生成PPT的办法. 首先,大概思路是这样的.周报.月报这类经营分析类PPT一般都是由表格.图表以及分析文字组成的,整体结构 ...

  2. java实现这个无表头空表格,《java程序导出excel表格是空白的没有数据?》 java怎么导入数据库...

    java程序导出excel表格是空白的没有数据? 看一下是否可以链接上数据库,或者查看一下链接的数据库是否有数据 java从数据库中导出excel poi 建议你使用pageoffice. java ...

  3. oracle 中某张表备份,张表系统流程(java程序备份及恢复SQL2000中数据库中的某张表)...

    java程序备份及恢复SQL2000中数据库中的某张表 你可以现在数据库里面建立一张视图,视图里面的SQL语句就是查询该数据库中的表明,这就是访问系统表的内容,只提供单独一个列,然后展示给客户,当客户 ...

  4. JAVA导出excel表格标题加粗,【excle特定文字加粗】java如何设置excel单元格中部分文字加粗 例如:标题(加粗): 内容(不加粗)...

    java如何设置excel单元格中部分文字加粗 例如:标题(加粗): 内容(不加粗) HSSFCellStyle style = (HSSFCellStyle) wb.createCellStyle( ...

  5. c 将图片存入到mysql数据库中_如何将图片转换存入到数据库中,并从数据库中取出转换成图片...

    有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来. 首先,我们要把图片存 ...

  6. Mybatis的批量插入数据库的两种方法及代码自动生成工具的使用方法

    文章目录 常规批量插入.(通过foreach,生成很长的SQL) ExecutorType.BATCH方式执行批量操作 在这里简单介绍一下,自动生成工具的使用方法 常规批量插入.(通过foreach, ...

  7. PowerDesigner,如何将Oracle数据库建表语句转化成Mysql数据库建表语句。

    在实际工作中,一张表,我们可能需要在Mysql数据库中建表,又要在Oracle数据库中建表.表中每个字段的数据类型.中文注释.是否可为NULL 问题,非常影响我们建表的效率.本篇文章,以Oracle数 ...

  8. PowerDesigner,如何将Mysql数据库建表语句转化成Oracle数据库建表语句。

    在实际工作中,一张表,我们可能需要在Mysql数据库中建表,又要在Oracle数据库中建表.表中每个字段的数据类型.中文注释.是否可为NULL 问题,非常影响我们建表的效率.本篇文章,以Mysql数据 ...

  9. 从NCBI当中SRA数据库中下载高通量测序数据

    从NCBI当中SRA数据库中下载高通量测序数据 NCBI sra 数据下载 用迅雷替代官方的prefetch批量下载SRA测序数据,更快更稳定! 用别人的数据,发自己的文章 由于大多数杂志在文章发表前 ...

最新文章

  1. 辽宁大连花灯闹新春 逾万民众赏灯迎新年
  2. Spring Boot 面试题
  3. 4 SAP权限PFCG操作手册
  4. 说说C#的async和await
  5. JDK动态代理运行期生成的字节码文件class,获取反编译方法
  6. 单例模式中的多线程分析synchronized
  7. Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】
  8. 用PARL训练mini-alphaGO
  9. Spark项目实践--基于 TMDB 数据集的电影数据分析
  10. 正交试验minitab
  11. ZOOM视频会议总是很卡连接不上
  12. FPGA 之 SOPC 系列(五)Nios II 软件使用与程序开发 I
  13. 暴躁的一天从Ubuntu搜狗拼音开始
  14. [愚见]Lightening Network for Low-LightImage Enhancement
  15. 程序员月入好几万?10年老程序员告诉你真实的情况!!
  16. Dubbo 2 Dubbo 概述 2.1 Dubbo 概念 2.2 Dubbo 架构
  17. 系统性综述:特征点检测与匹配
  18. SIM800C的二次开发(EAT开发)
  19. 德馨食品冲刺A股上市:计划募资9亿元,林志勇为实际控制人
  20. 【自动控制原理_B站网课笔记】第一章自动控制的一般概念part2

热门文章

  1. 嵌入式全键盘拼音输入法
  2. Figure size 640x480 with 3 Axes
  3. 用39条Python语句完成“数字华容道”游戏
  4. 微信小程序SDK使用实例
  5. 2022金属非金属矿山(露天矿山)主要负责人考试模拟100题及在线模拟考试
  6. java收集器Collector
  7. 中国人的区块链技术闯入国际学术顶会
  8. 深圳大学AMD 线程撕裂者调整建议
  9. Expected tensor for argument #1 'input' to have the same device as tensor for argument #2 'weight';
  10. a标签不跳转的3种实现方式