- 浏览: 33728 次
- 性别:
- 来自: 湖南
文章分类
最新评论
大部分项目在验收时都需要向客户提供一份详细的数据字典,而编写数据字典是一件既耗时又耗力的事情。为了解决这个问题,提高工作效率,本人写了一个工具类。该工具类能够根据现有的数据库快速的生成对应的数据字典,它可以为我们完成80%的工作量,我们只需要做剩下的20%的工作就可以了。该工具类目前支持Oracle、SqlServer数据库,操作简单,快捷。
1、以下是部分关键代码:
public class MetadataUtil { private Connection cn = null; private String catalog = null;//SqlServer use private String schemaPattern = "AGENTSKY";//Oracle use public MetadataUtil()throws Exception{ String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:CRM"; String uid = "agentsky"; String pwd = "agentsky"; Class.forName(driver); this.cn = DriverManager.getConnection(url,uid,pwd); } private String getTablePrimaryKeys(String tableName){ try{ DatabaseMetaData dbmd = cn.getMetaData(); ResultSet rs = dbmd.getPrimaryKeys(catalog, schemaPattern, tableName); StringBuffer sb = new StringBuffer(","); while(rs.next()){ sb.append(rs.getString("COLUMN_NAME") + ","); } rs.close(); return sb.toString(); }catch(Exception ex){ return ""; } } private boolean containFieldType(String fieldType){ List types = new ArrayList(); types.add("CHAR"); types.add("NCHAR"); types.add("NVARCHAR"); types.add("VARCHAR"); types.add("VARCHAR2"); return types.contains(fieldType.toUpperCase()); } /** * 取得表的备注信息 */ private Map<String, String> getTableComments()throws Exception{ Map<String, String> colMap = new HashMap<String, String>(); StringBuffer sb = new StringBuffer(); sb.append("select TABLE_NAME,TABLE_TYPE,COMMENTS from user_tab_comments"); PreparedStatement pstm = cn.prepareStatement(sb.toString()); ResultSet rs = pstm.executeQuery(); while(rs.next()){ colMap.put(rs.getString("TABLE_NAME").toUpperCase(), rs.getString("COMMENTS")); } rs.close(); pstm.close(); return colMap; } /** * 取得表字段的备注信息 */ private Map<String, String> getColumnComments(String tableName)throws Exception{ Map<String, String> colMap = new HashMap<String, String>(); StringBuffer sb = new StringBuffer(); sb.append(" select TABLE_NAME,COLUMN_NAME,COMMENTS from user_col_comments "); sb.append(" where upper(TABLE_NAME)=upper('" + tableName + "') "); PreparedStatement pstm = cn.prepareStatement(sb.toString()); ResultSet rs = pstm.executeQuery(); while(rs.next()){ colMap.put(rs.getString("COLUMN_NAME").toUpperCase(), rs.getString("COMMENTS")); } rs.close(); pstm.close(); return colMap; } public void createTableMetadata(String fileName){ try{ if(fileName == null || fileName.trim().length() == 0){ throw new IllegalArgumentException("argument fileName can not be null"); } File file = new File(fileName); //delete old file if(file.exists() && file.isFile()) file.delete(); //create sheet FileOutputStream out = new FileOutputStream(file); WritableWorkbook book = Workbook.createWorkbook(out); WritableSheet sheet = book.createSheet("数据字典",0); //表备注 Map<String, String> tableMap = getTableComments(); DatabaseMetaData dbmd = cn.getMetaData(); String[] types = {"TABLE"}; ResultSet rs = dbmd.getTables(catalog ,schemaPattern, null, types); int rowIndex = 0; int tableCount = 0; while(rs.next()){ try{ String tableName = rs.getString("TABLE_NAME"); if(tableName.indexOf("=")!=-1) continue; tableCount++; System.out.println(tableCount + "、" + tableName + " doing..."); //表字段备注信息 Map<String, String> colMap = getColumnComments(tableName); //表备注 String tableComment = tableMap.get(tableName); if(CommonUtil.isNotEmpty(tableComment)){ tableComment = ":" + tableComment; }else{ tableComment = CommonUtil.trim(tableComment); } //表名 sheet.mergeCells(0,rowIndex,6,rowIndex); //合并单元格,6数字要与表头的cell个数一致 sheet.addCell(new Label(0,rowIndex,tableName + tableComment)); rowIndex++; //表头 sheet.addCell(new Label(0,rowIndex,"序号")); sheet.addCell(new Label(1,rowIndex,"字段名")); sheet.addCell(new Label(2,rowIndex,"字段描述")); sheet.addCell(new Label(3,rowIndex,"字段类型")); sheet.addCell(new Label(4,rowIndex,"主键")); sheet.addCell(new Label(5,rowIndex,"可空")); sheet.addCell(new Label(6,rowIndex,"备注")); rowIndex++; //主键 String strPrimaryKeys = getTablePrimaryKeys(tableName); Statement stm = cn.createStatement(); stm.setMaxRows(1); ResultSet rsColumn = stm.executeQuery("select * from " + tableName); ResultSetMetaData rsmd = rsColumn.getMetaData(); int recordIndex = 1; for(int i=1;i<=rsmd.getColumnCount();i++){ sheet.addCell(new Label(0,rowIndex,String.valueOf(recordIndex))); //序号 sheet.addCell(new Label(1,rowIndex,rsmd.getColumnName(i))); //字段名 sheet.addCell(new Label(2,rowIndex,colMap.get(rsmd.getColumnName(i).toUpperCase()))); //描述 //字段类型 String fieldType = rsmd.getColumnTypeName(i); if(containFieldType(fieldType)){ fieldType += "(" + String.valueOf(rsmd.getColumnDisplaySize(i)) + ")"; } sheet.addCell(new Label(3,rowIndex,fieldType)); //是否主键 if(strPrimaryKeys.indexOf("," + rsmd.getColumnName(i) + ",") != -1){ sheet.addCell(new Label(4,rowIndex,"Y")); }else{ sheet.addCell(new Label(4,rowIndex,"")); } //是否可空 sheet.addCell(new Label(5,rowIndex,(rsmd.isNullable(i)==1)?"":"N")); //备注 sheet.addCell(new Label(6,rowIndex,"")); rowIndex++; recordIndex++; } rowIndex += 2; rsColumn.close(); stm.close(); }catch(Exception e){ e.printStackTrace(); } } rs.close(); book.write(); book.close(); }catch(Exception ex){ ex.printStackTrace(); }finally{ try{ if(cn != null)cn.close(); }catch(Exception e){ e.printStackTrace(); } } } public static void main(String[] args) { try{ System.out.println("start..."); MetadataUtil md = new MetadataUtil(); md.createTableMetadata("c:\\agentsky_audit.xls"); System.out.println("end"); }catch(Exception ex){ ex.printStackTrace(); } } }
- MetadataCreator.rar (2.1 KB)
- 下载次数: 0
发表评论
-
HttpClient容易忽视的细节——连接关闭
2012-03-02 09:15 612HttpClient client = new HttpCli ... -
HTTPClient的多线程编程
2012-03-02 09:09 1475Axis2的连接主要采用了HttpClient进行与服务器的服 ... -
HttpClient超时区别
2012-03-02 09:07 1070HttpClient 4 设置超时 httpclient 超时 ... -
HttpClient Theading
2012-03-01 10:49 666有技术兴趣的 请加28830308群. 这篇文章概括了怎样在 ... -
HttpClient使用
2012-03-01 10:43 713有技术兴趣的 请加28830308群. HttpClien ... -
线程请求执行,一个多线程程执行HTTP请求的例子。
2012-03-01 10:40 1752package cn.lake.util; import ... -
httpclient 4 下载 文件
2012-03-01 10:38 938import java.io.File; import ja ... -
使用了httpclient实现的上传商品的demo
2012-03-01 10:36 1150package com.taobao.top.sample.u ... -
socket简介
2012-02-07 10:58 679第一步 充分理解Socket ... -
转载socket
2012-02-07 10:57 559对TCP/IP、UDP、Socket编程这些词你不会很陌生吧? ... -
Java的synchronized关键字:同步机制总结
2012-02-07 10:54 570不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对 ... -
JAVA RMI
2012-02-07 10:53 573Java RMI 指的是远程方法调用 (Remote Meth ... -
JXL生成复杂的EXCEL
2011-12-26 13:52 1376public String ExcelTaskRepo ... -
在java中获取客户端真实的IP地址
2011-12-20 13:55 552public static String getRemoteA ... -
用JavaMail的API发送邮件
2011-12-20 13:55 5271、MimeMessage的包装类 public c ... -
在项目中整合FreeMarker框架
2011-12-16 15:40 579FreeMarker是一个用Java编写的模板引擎,既可以 ... -
Commons FTP范例
2011-12-16 15:33 501public class FtpUtil { privat ... -
Java实现的图片生成器
2011-12-16 15:32 517一、本图片生成器具有以下功能特性: 1、可以设置图 ... -
jacob学习总结
2011-12-16 15:27 439JACOB 就是 JAVA-COM Bridge的缩写,提供自 ... -
长短信发送范例
2011-12-16 15:25 686一、关键代码: private synchronized v ...
相关推荐
本资源提供的“数据库转成数据字典工具类”旨在帮助IT专业人士高效地从现有的数据库中生成详细的数据字典,以满足项目管理和汇报需求。 首先,我们需要理解什么是数据字典。数据字典是系统设计阶段的产物,它包含了...
利用提供的"数据库之数据字典"资源,开发者可以快速了解和适应现有的数据库结构,节省开发时间,并提高代码质量。同时,这也是一种良好的团队协作实践,因为它让团队成员对数据库有一个统一的理解。
游戏点卡销售系统是一种专为在线游戏点卡交易设计的平台,它涵盖了数据库管理、数据字典维护以及需求分析等多个关键领域。在这个系统中,数据库是核心,存储着所有与点卡销售相关的数据,如点卡类型、库存、交易记录...
标题和描述均提到了“PowerDesigner生成数据字典(包含反向工程生成方法)”,这表明文章主要聚焦于如何利用PowerDesigner这一强大的建模工具来生成数据字典,并特别强调了反向工程作为生成数据字典的一种方法。...
总结来说,ERwin生成数据字典是一项关键的数据库管理任务,它通过将复杂的数据库模型转化为易读的文档,提升了团队合作效率和数据库的透明度。掌握这一技能对于数据库专业人员来说是必要的,而"ERwin生成表清单"这样...
数据字典是数据库设计中的一个重要组成部分,它记录了数据库中各个表的详细信息,包括字段名、字段类型、长度、是否为主键、是否允许为空、默认值以及字段的描述等。通过这个数据字典,我们可以深入了解ecology-8...
数据字典是理解任何数据库系统的关键工具,它详细记录了数据库中的各个表、字段及其关系,为开发者提供了宝贵的参考信息。Thinksns的数据字典,特别是针对未加载插件的情况,为开发者提供了清晰的原始框架结构,这...
数据字典管理工具是软件开发过程中非常重要的辅助工具,它主要负责存储、管理和维护数据库中的元数据信息。元数据指的是关于数据的数据,如字段名、字段类型、字段长度、约束条件等。这样的工具可以帮助开发者更好地...
这个过程可以帮助数据库管理员和开发人员理解现有数据库的结构,或者快速创建和更新数据库结构。PowerDesigner提供了强大的建模工具,能够帮助优化数据库设计,并通过生成的SQL脚本方便地在数据库管理系统中实现这些...
- 数据安全与备份:了解数据字典有助于制定有效的数据备份策略,确保在出现问题时能够快速恢复。 - 系统扩展与升级:在对论坛进行功能扩展或升级时,数据字典可作为参考,避免对现有数据结构造成破坏。 2. **Jsp...
此外,文章还提到了在数据库中建立数据字典的概念。数据字典是对数据库中各个对象数据表的字段信息进行管理的工具,它可以帮助用户跟踪和理解数据库结构,提供元数据信息,使得维护和更新变得更加方便。 以GeoView...
在数据库管理中,数据字典是一个至关重要的文档,它包含了数据库中的所有对象,如表、字段、索引、视图等,以及它们之间的关系。mysqldict这款工具能够自动生成这些信息,极大地提高了工作效率,减少了手动编写和...
在讨论STEP数据模型在关系数据库SQL Server上的映射时,首先要建立数据字典。数据字典作为数据库管理系统的重要组成部分,记录了数据库结构和各种控制信息,为数据库的运行提供基本支持。在实现STEP数据模型映射过程...
总结来说,《交通监控系统数据字典规范》是一份详尽的指南,它通过定义和标准化交通监控系统中的数据元素和概念,促进了系统设计的规范化和效率,确保了数据的准确性和一致性,同时也为企业内部标准的建立提供了基础...
建立数据库的方法有三种:使用数据库配置助手(DBCA)、执行脚本手动创建,或者迁移或升级现有数据库。DBCA提供了一种图形化的简便方式,而手动创建则需要编辑和执行指令文件,有时可以参考Oracle提供的示例文件。如果...
Oracle提供了多种创建数据库的方式,包括使用Oracle Installer、定制脚本或现有数据库克隆等。DBA应根据实际情况和需求选择最合适的方法。例如,对于复杂环境或特定需求,编写定制脚本可能更为灵活和高效。 #### ...
#### ABAP数据字典与实际数据库的关系 数据字典在ABAP环境中扮演着至关重要的角色。它不仅管理着系统内的所有数据对象定义,还负责保持这些定义与实际数据库中的物理表结构一致。这种一致性确保了ABAP程序能够准确...
全景数据库项目通过对现有数据进行整合、清洗、转换和分析,构建了一个以客户为中心的数据视图,从而提高了数据的价值和利用率。通过分层的技术架构和逻辑架构,确保了数据处理的高效性和准确性。此外,通过精心设计...
数据库设计原则包括了解客户需求、了解企业业务、重视输入输出、创建数据字典和 ER 图表等。了解客户需求是指在设计数据库之前,需要理解客户需求,询问用户如何看待未来需求变化。了解企业业务是指了解企业业务可以...