- 浏览: 1419747 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (409)
- Java (48)
- Spring (29)
- struts2 (17)
- hibernate (4)
- 设计模式 (24)
- jbpm (1)
- JavaScript (5)
- 统计报表 (7)
- ExtJS_3.0 (35)
- struts1 (1)
- 分析设计 (3)
- Flex3 (24)
- UML (2)
- 数据库 (18)
- PowerDesigner (2)
- 应用服务器 (3)
- WebService (5)
- ActiveMQ_5.3.2 (6)
- Java通信技术 (11)
- GWT (6)
- OSGi (15)
- android (11)
- liferay6.0.6 (13)
- jquery (13)
- Linux (3)
- java.util.concurrent (16)
- guava (9)
- 开发模式 (1)
- 大数据 (2)
- 互联网金融 (4)
- treegrid-3.0 (7)
- 分布式 (8)
- GO语言 (4)
- maven (1)
- 缓存技术 (6)
- 其他 (2)
- 前端页面 (1)
- heasy (1)
- spring cloud(F版) (21)
- springboot (12)
- springmvc (5)
- mybatis (3)
- dubbo (1)
- 物联网 (0)
最新评论
-
raymond.chen:
谢谢您的分享
使用Ngrok解决通过外网访问内网web应用 -
wangyudong:
速度有点慢,不过在也找到了一个开源的holer,配置一个key ...
使用Ngrok解决通过外网访问内网web应用 -
a1006458222:
...
Axis2的部署和应用 -
偷师来了:
不好意思 这样的博客我觉得就灭有必要分享出来了 命令大家都会看 ...
Consul框架介绍 -
lliiqiang:
怎么直接删除文件夹啊?固定的几个文件可以删除,不固定的呢?需要 ...
Flex AIR —— 文件读写
大部分项目在验收时都需要向客户提供一份详细的数据字典,而编写数据字典是一件既耗时又耗力的事情。为了解决这个问题,提高工作效率,本人写了一个工具类。该工具类能够根据现有的数据库快速的生成对应的数据字典,它可以为我们完成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(); } } }
发表评论
-
keytool的使用
2019-08-28 15:12 457keytool是密钥和数字证书的管理工具。它使用户能够管理 ... -
Bitset数据结构的使用
2019-03-08 13:53 1834Bitset是Java中的一种数据结构。Bitset中主要 ... -
Disruptor:高性能低延迟的内存有界队列框架
2019-02-24 10:45 891Disruptor是用于在多个线程之间通信的高性能低延时的 ... -
java的类加载机制
2019-02-18 21:37 356ClassLoader的双亲委派模 ... -
ThreadLocal的使用范例
2019-02-16 19:30 491ThreadLocal用于保存某个线程的共享变量。 Thr ... -
反射工具包Reflections的使用
2019-02-16 17:51 2937Reflections 通过扫描 classpath,索引元 ... -
使用CGLIB对实现类进行动态代理
2019-01-31 19:12 2375CGLIB(Code Generation Library ... -
基于JDK动态代理实现Mybatis的Mapper功能
2019-01-31 18:40 853Mybatis通过定义Mapper接口类,类中的方法与map ... -
Java8新特性
2019-01-20 22:04 4991、Lambda表达式 ... -
使用百度API识别图片文字
2018-09-21 22:41 24531、注册百度账号 https://login.bce.b ... -
HanLP自然语言处理包的使用
2018-09-16 23:06 3057HanLP是由一系列模型与算法组成的Java工具包,目标是 ... -
org.apache.commons常用类的使用
2018-09-14 23:29 783/** * 文本相似度计算 */ ... -
图片转换为单色
2017-04-01 00:10 1425/** * 转为单色图片 */ privat ... -
Java事件机制范例
2016-11-28 15:22 2448java事件机制的参与者: event object:事件 ... -
编程方式的quartz2例子
2016-11-09 14:53 640Job类: public class MyJob imp ... -
数字证书格式
2016-11-06 20:44 1929PFX 或 P12 指以pkcs#12 ... -
Drools6使用范例
2016-10-15 23:50 27491、创建kmodule.xml文件 在s ... -
生成带logo的二维码图片
2016-05-25 18:21 1338源码如下: private static final in ... -
用HttpClient访问CXF的RESTful接口
2016-05-18 16:50 4410用CXF可以开发RESTful服务,服务接口的输入和输出支持 ... -
commons-configuration使用范例
2016-05-02 23:50 14701、访问属性文件 PropertiesConfigurat ...
相关推荐
为什么要进行数据库的再组织和再构造? 23.现有一局部应用,包括两个实体:"出版社"和"作者",这两个实体是多对多的联 系,请读者自己设计恰当的属性,画出E- R图,再将其转换为关系模型(包括关系名、属性名、码和...
也可导出现有数据库结构,并为其创建数据库自动部署程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 数据库平台中进行数据库自动安装和任意迁移。系统会自动进行语法、数据类型转换。 ...
系统提供了一个完整的软件开发工具Developer2000,包括交互式应用程序生成器、报表打印软件、字处理软件以及集中式数据字典,用户可以利用这些工具生成自己的应用程序。Orcale以二维表的形式表示数据,并提供了SQL...
既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...
现有地址输入提示方法涉及标准地址和POI的研究较少,地址字符串的索引大多采用Trie(字典)树索引,但Trie树建立时内存消耗巨大,在面临海量数据时,问题更加突出。针对以上问题,提出一种基于key-value数据库的快速...
既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...
既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...
目录 第一章 前言 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处理...
也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 数据库平台中进行数据库自动安装和任意迁移。系统会自动进行语法、数据类型转换。 ...
可以了解JAVA框架下中间件的设计 目 录 ...(3)数据字典的建立 (4)系统运作流程图 (5)系统运行界面 (6)查询速度测试 七、总结与展望 1.总结 2.展望 参考文献 致谢 攻读学位期间发表的学术论文目录
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结构设计 ...
该管理系统以VB为主要开发工具,通过ADO方式与后台数据库Microsoft access 2000 相连接,建立了一个基于C/S(客户机/服务器)的数据库应用管理系统。维护工作方便 ,由于access 2000的易用性,使得后台的操作十分...
该管理系统以VB为主要开发工具,通过ADO方式与后台数据库Microsoft access 2000 相连接,建立了一个基于C/S(客户机/服务器)的数据库应用管理系统。维护工作方便 ,由于access 2000的易用性,使得后台的操作十分...
724.2 理解关系型数据库 744.3 使用Access数据库文件和表 754.3.1 Access系统数据库 754.3.2 Access 库数据库 754.4 创建一个新数据库 754.5 理解表和字段的属性 774.6 选择字段数据类型、大小和格式 804.6.1 为数值...
D 记录、表和属性 17、在关系数据库中实现了数据表示的单一性,实体和实体之间的联系都用一种什么数 据结 构表示 ( C ) A 数据字典 B 文件 C 表 D 数据库 18、在E-R图中,用长方形表示 ;用椭圆形表示 ( C) A ...
3 工欲善其事, 必先利其器 4 获取数据模式资源手册 4 畅想未来,但不可忘了过去的教训 4 在物理实践之前进行逻辑设计 5 了解你的业务 5 创建数据字典和 ER 图表 5 创建模式 5 从输入输出下手 5 报表技巧 5 理解客户...
既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其创建数据库自动安装程序。 2、跨数据库平台:只需按熟悉的数据库平台进行一次定义,就可在上述各个 ...
(3)文档中至少要包括:ER模型图、系统功能图、数据字典、表关系的详细说明。 (4)用户界面设计:采用图形界面菜单驱动,界面要友好,操作要简单,C/S和B/S架 构自由选择。 (5)用户手册,描述软件系统所具有的...