`
raymond.chen
  • 浏览: 1419747 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何快速的为现有数据库建立数据字典?

    博客分类:
  • Java
阅读更多

大部分项目在验收时都需要向客户提供一份详细的数据字典,而编写数据字典是一件既耗时又耗力的事情。为了解决这个问题,提高工作效率,本人写了一个工具类。该工具类能够根据现有的数据库快速的生成对应的数据字典,它可以为我们完成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();
		}
	}
	
}

 

  • 大小: 86.6 KB
分享到:
评论

相关推荐

    数据库设计.doc

    为什么要进行数据库的再组织和再构造? 23.现有一局部应用,包括两个实体:"出版社"和"作者",这两个实体是多对多的联 系,请读者自己设计恰当的属性,画出E- R图,再将其转换为关系模型(包括关系名、属性名、码和...

    数据库设计和数据库部署工具BDB 2007 Pro V2.3

    也可导出现有数据库结构,并为其创建数据库自动部署程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 数据库平台中进行数据库自动安装和任意迁移。系统会自动进行语法、数据类型转换。 ...

    数据库学习基础之名词解释

    系统提供了一个完整的软件开发工具Developer2000,包括交互式应用程序生成器、报表打印软件、字处理软件以及集中式数据字典,用户可以利用这些工具生成自己的应用程序。Orcale以二维表的形式表示数据,并提供了SQL...

    数据库设计/自动安装工具BDB 2007 V2.3(For Oracle/MS SQLServer/Access/MySQL/SQLAnyWhere/Sybase)

    既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...

    论文研究-一种基于key-value数据库的快速地名地址输入提示方法.pdf

    现有地址输入提示方法涉及标准地址和POI的研究较少,地址字符串的索引大多采用Trie(字典)树索引,但Trie树建立时内存消耗巨大,在面临海量数据时,问题更加突出。针对以上问题,提出一种基于key-value数据库的快速...

    BDB 2007数据库开发工具

    既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...

    数据库设计工具BDB 2007 V2.0

    既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...

    数据库课程设计(图书管理系统).doc

    目录 第一章 前言 1 第二章 数据库设计需求分析和系统设计 2 1.1 需求分析 2 1.2 任务概述 3 1.2.1目标 3 1.2.2运行环境 3 1.3数据字典 4 1.3.1数据项 4 1.3.2数据结构 4 1.33数据流 4 1.3.4数据存储 4 1.3.5处理...

    数据库设计软件BDB 2007(for Oracle/SQLServer/MySQL/Access/SQLAnywhere) V2.1

    也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 数据库平台中进行数据库自动安装和任意迁移。系统会自动进行语法、数据类型转换。 ...

    基于XML和JAVA的异构数据库集成中间件系统的研究和实现

    可以了解JAVA框架下中间件的设计 目 录 ...(3)数据字典的建立 (4)系统运作流程图 (5)系统运行界面 (6)查询速度测试 七、总结与展望 1.总结 2.展望 参考文献 致谢 攻读学位期间发表的学术论文目录

    投票系统数据库设计说明.doc

    1引言 2 1.1编写目的 2 1.2 定义 2 1.3参考资料 2 2需求分析 2 2 .1功能分析 2 2 .2业余活动 3 2 .3数据字典 .................................. 3 2 .4数据流图 .................................. 5 3结构设计 ...

    医院住院系统数据库设计.doc

    该管理系统以VB为主要开发工具,通过ADO方式与后台数据库Microsoft access 2000 相连接,建立了一个基于C/S(客户机/服务器)的数据库应用管理系统。维护工作方便 ,由于access 2000的易用性,使得后台的操作十分...

    医院住院系统数据库设计(1).doc

    该管理系统以VB为主要开发工具,通过ADO方式与后台数据库Microsoft access 2000 相连接,建立了一个基于C/S(客户机/服务器)的数据库应用管理系统。维护工作方便 ,由于access 2000的易用性,使得后台的操作十分...

    Access 2000数据库系统设计(PDF)---025

    724.2 理解关系型数据库 744.3 使用Access数据库文件和表 754.3.1 Access系统数据库 754.3.2 Access 库数据库 754.4 创建一个新数据库 754.5 理解表和字段的属性 774.6 选择字段数据类型、大小和格式 804.6.1 为数值...

    1在设计数据库前.doc

    D 记录、表和属性 17、在关系数据库中实现了数据表示的单一性,实体和实体之间的联系都用一种什么数 据结 构表示 ( C ) A 数据字典 B 文件 C 表 D 数据库 18、在E-R图中,用长方形表示 ;用椭圆形表示 ( C) A ...

    数据库设计经验谈.pdf

    3 工欲善其事, 必先利其器 4 获取数据模式资源手册 4 畅想未来,但不可忘了过去的教训 4 在物理实践之前进行逻辑设计 5 了解你的业务 5 创建数据字典和 ER 图表 5 创建模式 5 从输入输出下手 5 报表技巧 5 理解客户...

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...

    超市管理数据库课程设计大作业.doc

    (3)文档中至少要包括:ER模型图、系统功能图、数据字典、表关系的详细说明。 (4)用户界面设计:采用图形界面菜单驱动,界面要友好,操作要简单,C/S和B/S架 构自由选择。 (5)用户手册,描述软件系统所具有的...

Global site tag (gtag.js) - Google Analytics