公司项目比较乱,很多时候都是需要先完成项目再准备文档。
数据库文档是最基本的文档了,整理起来比较麻烦,如果数据库建表的时候能把列注释都能写好的话,理论上自动生成数据库文档应该是很好实现的。
自己简单做了个Oracle和MySQL版本的,感觉还很好用。当然前提是你字段注释写的标准。
用到类库是IText 用来生成Word文档的。
先看效果图:
代码比较乱,简单实用:
Mysql版:
package dbdoc; import java.awt.Color; import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Table; import com.lowagie.text.rtf.RtfWriter2; /** * 数据字典生成器 Mysql * @author Eric zhou * */ public class MySQL_DBDocer { //键类型字典 private static Map<String,String> keyType = new HashMap<String,String>(); //初始化jdbc static{ try { keyType.put("PRI", "主键"); keyType.put("UNI", "唯一键"); Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private static String url = "jdbc:mysql://127.0.0.1:3308/test";//链接url private static String username = "root"; //用户名 private static String password = "123456"; //密码 private static String schema = "test"; //目标数据库 名 //查询所有表的sql语句 private static String sql_get_all_tables = "select table_name,TABLE_COMMENT from INFORMATION_SCHEMA.tables where TABLE_SCHEMA='"+schema+"' and TABLE_TYPE='BASE TABLE'"; //查询所有字段的sql语句 private static String sql_get_all_columns = "select column_name,data_type,character_octet_length,COLUMN_COMMENT,is_nullable,COLUMN_key from information_schema.`COLUMNS` where TABLE_NAME='{table_name}' and TABLE_SCHEMA='"+schema+"'"; public static void main(String[] args) throws Exception { //初始化word文档 Document document = new Document(PageSize.A4); RtfWriter2.getInstance(document,new FileOutputStream("E:/word.doc")); document.open(); //查询开始 Connection conn = getConnection(); //获取所有表 List tables = getDataBySQL(sql_get_all_tables,conn); int i=1; for (Iterator iterator = tables.iterator(); iterator.hasNext();) { String [] arr = (String []) iterator.next(); //循环获取字段信息 System.out.print(i+".正在处理数据表-----------"+arr[0]); addTableMetaData(document,arr,i); List columns = getDataBySQL(sql_get_all_columns.replace("{table_name}", arr[0]),conn); addTableDetail(document,columns); addBlank(document); System.out.println("...done"); i++; } document.close(); conn.close(); } /** * 添加一个空行 * @param document * @throws Exception */ public static void addBlank(Document document)throws Exception{ Paragraph ph = new Paragraph(""); ph.setAlignment(Paragraph.ALIGN_LEFT); document.add(ph); } /** * 添加包含字段详细信息的表格 * @param document * @param arr1 * @param columns * @throws Exception */ public static void addTableDetail(Document document,List columns)throws Exception{ Table table = new Table(6); table.setWidth(100f);//表格 宽度100% table.setBorderWidth(1); table.setBorderColor(Color.BLACK); table.setPadding(0); table.setSpacing(0); Cell cell1 = new Cell("序号");// 单元格 cell1.setHeader(true); Cell cell2 = new Cell("列名");// 单元格 cell2.setHeader(true); Cell cell3 = new Cell("类型");// 单元格 cell3.setHeader(true); Cell cell4 = new Cell("长度");// 单元格 cell4.setHeader(true); Cell cell5 = new Cell("键");// 单元格 cell5.setHeader(true); Cell cell6 = new Cell("说明");// 单元格 cell6.setHeader(true); //设置表头格式 table.setWidths(new float[]{8f,30f,15f,8f,10f,29f}); cell1.setHorizontalAlignment(Cell.ALIGN_CENTER); cell1.setBackgroundColor(Color.gray); cell2.setHorizontalAlignment(Cell.ALIGN_CENTER); cell2.setBackgroundColor(Color.gray); cell3.setHorizontalAlignment(Cell.ALIGN_CENTER); cell3.setBackgroundColor(Color.gray); cell4.setHorizontalAlignment(Cell.ALIGN_CENTER); cell4.setBackgroundColor(Color.gray); cell5.setHorizontalAlignment(Cell.ALIGN_CENTER); cell5.setBackgroundColor(Color.gray); cell6.setHorizontalAlignment(Cell.ALIGN_CENTER); cell6.setBackgroundColor(Color.gray); table.addCell(cell1); table.addCell(cell2); table.addCell(cell3); table.addCell(cell4); table.addCell(cell5); table.addCell(cell6); table.endHeaders();// 表头结束 int x = 1; for (Iterator iterator = columns.iterator(); iterator.hasNext();) { String [] arr2 = (String []) iterator.next(); Cell c1 = new Cell(x+""); Cell c2 = new Cell(arr2[0]); Cell c3 = new Cell(arr2[1]); Cell c4 = new Cell(arr2[2]); String key = keyType.get(arr2[5]); if(key==null)key = ""; Cell c5 = new Cell(key); Cell c6 = new Cell(arr2[3]); c1.setHorizontalAlignment(Cell.ALIGN_CENTER); c2.setHorizontalAlignment(Cell.ALIGN_CENTER); c3.setHorizontalAlignment(Cell.ALIGN_CENTER); c4.setHorizontalAlignment(Cell.ALIGN_CENTER); c5.setHorizontalAlignment(Cell.ALIGN_CENTER); c6.setHorizontalAlignment(Cell.ALIGN_CENTER); table.addCell(c1); table.addCell(c2); table.addCell(c3); table.addCell(c4); table.addCell(c5); table.addCell(c6); x++; } document.add(table); } /** * 增加表概要信息 * @param dcument * @param arr * @param i * @throws Exception */ public static void addTableMetaData(Document dcument,String [] arr,int i) throws Exception{ Paragraph ph = new Paragraph(i+". 表名: "+arr[0]+" 说明: "+(arr[1]==null?"":arr[1])); ph.setAlignment(Paragraph.ALIGN_LEFT); dcument.add(ph); } /** * 把SQL语句查询出列表 * @param sql * @param conn * @return */ public static List getDataBySQL(String sql,Connection conn){ Statement stmt = null; ResultSet rs = null; List list = new ArrayList(); try { stmt = conn.createStatement(); rs = stmt.executeQuery(sql); while(rs.next()){ String [] arr = new String[rs.getMetaData().getColumnCount()]; for(int i=0;i<arr.length;i++){ arr[i] = rs.getString(i+1); } list.add(arr); } } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(rs!=null)rs.close(); if(stmt!=null)stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } return list; } /** * 获取数据库连接 * @return */ public static Connection getConnection(){ try { return DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } return null; } }
Oracle版与Mysql版基本就只是两个核心SQL语句的区别,如下:
package dbdoc; import java.awt.Color; import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Table; import com.lowagie.text.rtf.RtfWriter2; /** * 数据库文档生成器 Oracle版 * @author Eric zhou * */ public class Oracle_DBDocer { //键类型字典 private static Map<String,String> keyType = new HashMap<String,String>(); //初始化jdbc static{ try { keyType.put("P", "主键"); // keyType.put("C", "Check"); Class.forName("oracle.jdbc.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";//链接url private static String username = "test"; //用户名.需要设置默认表空间哈 private static String password = "test"; //密码 private static String schema = "TEST"; //目标数据库名 //查询所有表的sql语句 private static String sql_get_all_tables = "select a.TABLE_NAME,b.COMMENTS from user_tables a,user_tab_comments b WHERE a.TABLE_NAME=b.TABLE_NAME order by TABLE_NAME"; //查询所有字段的sql语句 private static String sql_get_all_columns = "select T1.column_name,T1.data_type,T1.data_length,t2.comments,T1.NULLABLE,(select max(constraint_type) from user_constraints x left join user_cons_columns y on x.constraint_name=y.constraint_name where x.table_name=t1.TABLE_NAME and y.COLUMN_NAME=T1.column_name) from user_tab_cols t1, user_col_comments t2, user_tab_comments t3 where t1.TABLE_NAME=t2.table_name(+) and t1.COLUMN_NAME=t2.column_name(+) and t1.TABLE_NAME=t3.table_name(+) and t1.TABLE_NAME='{table_name}' order by T1.COLUMN_ID "; public static void main(String[] args) throws Exception { //初始化word文档 Document document = new Document(PageSize.A4); RtfWriter2.getInstance(document,new FileOutputStream("E:/word.doc")); document.open(); //查询开始 Connection conn = getConnection(); //获取所有表 List tables = getDataBySQL(sql_get_all_tables,conn); int i=1; for (Iterator iterator = tables.iterator(); iterator.hasNext();) { String [] arr = (String []) iterator.next(); //循环获取字段信息 System.out.print(i+".正在处理数据表-----------"+arr[0]); addTableMetaData(document,arr,i); List columns = getDataBySQL(sql_get_all_columns.replace("{table_name}", arr[0]),conn); addTableDetail(document,columns); addBlank(document); System.out.println("...done"); i++; } document.close(); conn.close(); } /** * 添加一个空行 * @param document * @throws Exception */ public static void addBlank(Document document)throws Exception{ Paragraph ph = new Paragraph(""); ph.setAlignment(Paragraph.ALIGN_LEFT); document.add(ph); } /** * 添加包含字段详细信息的表格 * @param document * @param arr1 * @param columns * @throws Exception */ public static void addTableDetail(Document document,List columns)throws Exception{ Table table = new Table(6); table.setWidth(100f); table.setBorderWidth(1); table.setBorderColor(Color.BLACK); table.setPadding(0); table.setSpacing(0); Cell cell1 = new Cell("序号");// 单元格 cell1.setHeader(true); Cell cell2 = new Cell("列名");// 单元格 cell2.setHeader(true); Cell cell3 = new Cell("类型");// 单元格 cell3.setHeader(true); Cell cell4 = new Cell("长度");// 单元格 cell4.setHeader(true); Cell cell5 = new Cell("键");// 单元格 cell5.setHeader(true); Cell cell6 = new Cell("说明");// 单元格 cell6.setHeader(true); //设置表头格式 table.setWidths(new float[]{8f,30f,15f,8f,10f,29f}); cell1.setHorizontalAlignment(Cell.ALIGN_CENTER); cell1.setBackgroundColor(Color.gray); cell2.setHorizontalAlignment(Cell.ALIGN_CENTER); cell2.setBackgroundColor(Color.gray); cell3.setHorizontalAlignment(Cell.ALIGN_CENTER); cell3.setBackgroundColor(Color.gray); cell4.setHorizontalAlignment(Cell.ALIGN_CENTER); cell4.setBackgroundColor(Color.gray); cell5.setHorizontalAlignment(Cell.ALIGN_CENTER); cell5.setBackgroundColor(Color.gray); cell6.setHorizontalAlignment(Cell.ALIGN_CENTER); cell6.setBackgroundColor(Color.gray); table.addCell(cell1); table.addCell(cell2); table.addCell(cell3); table.addCell(cell4); table.addCell(cell5); table.addCell(cell6); table.endHeaders();// 表头结束 int x = 1; for (Iterator iterator = columns.iterator(); iterator.hasNext();) { String [] arr2 = (String []) iterator.next(); Cell c1 = new Cell(x+""); Cell c2 = new Cell(arr2[0]); Cell c3 = new Cell(arr2[1]); Cell c4 = new Cell(arr2[2]); String key = keyType.get(arr2[5]); if(key==null)key = ""; Cell c5 = new Cell(key); Cell c6 = new Cell(arr2[3]); c1.setHorizontalAlignment(Cell.ALIGN_CENTER); c2.setHorizontalAlignment(Cell.ALIGN_CENTER); c3.setHorizontalAlignment(Cell.ALIGN_CENTER); c4.setHorizontalAlignment(Cell.ALIGN_CENTER); c5.setHorizontalAlignment(Cell.ALIGN_CENTER); c6.setHorizontalAlignment(Cell.ALIGN_CENTER); table.addCell(c1); table.addCell(c2); table.addCell(c3); table.addCell(c4); table.addCell(c5); table.addCell(c6); x++; } document.add(table); } /** * 增加表概要信息 * @param dcument * @param arr * @param i * @throws Exception */ public static void addTableMetaData(Document dcument,String [] arr,int i) throws Exception{ Paragraph ph = new Paragraph(i+". 表名: "+arr[0]+" 说明: "+(arr[1]==null?"":arr[1])); ph.setAlignment(Paragraph.ALIGN_LEFT); dcument.add(ph); } /** * 把SQL语句查询出列表 * @param sql * @param conn * @return */ public static List getDataBySQL(String sql,Connection conn){ Statement stmt = null; ResultSet rs = null; List list = new ArrayList(); try { stmt = conn.createStatement(); rs = stmt.executeQuery(sql); while(rs.next()){ String [] arr = new String[rs.getMetaData().getColumnCount()]; for(int i=0;i<arr.length;i++){ arr[i] = rs.getString(i+1); } list.add(arr); } } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(rs!=null)rs.close(); if(stmt!=null)stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } return list; } /** * 获取数据库连接 * @return */ public static Connection getConnection(){ try { return DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } return null; } }
相关推荐
这个过程不仅可以自动化地生成数据库文档,还可以作为持续集成的一部分,每当数据库结构发生变化时自动更新文档,确保文档与实际数据库状态保持一致。 总之,通过编程方式将数据库的表注释整理成Word文档是一种有效...
"Oracle|Sqlserver|MySql数据库表结构一键生成工具" 提供了一种高效的方法来自动化这个过程,大大减轻了手动编写文档的工作量。这款工具能够支持三种主流的关系型数据库管理系统:Oracle、SQL Server和MySQL。 ...
数据库文档生成是数据库管理中的一个重要环节,它有助于开发者和DBA更好地理解和维护数据库结构。本资源提供了一个工具,能够根据数据库表的DDL(Data Definition Language)自动生成Markdown和Word格式的文档,极大...
这通常指的是一个程序或脚本,它可以连接到MySQL和Oracle数据库,然后自动生成包含数据库表结构、字段信息、索引和约束的文档。这样的工具可以大大节省手动编写文档的时间,提高工作效率。 数据库生成文档的核心...
总的来说,"自动生成数据库说明文档"是一项实用的工具,能够帮助我们更好地管理和理解数据库,提升开发和维护的效率。无论是在数据库设计阶段,还是在后期的运维工作中,都能发挥出其强大的作用。
在"mybatis自动生成实例支持oracle和MySQL"的场景中,我们可以理解为该压缩包包含了一个能够帮助开发者自动生成针对Oracle和MySQL数据库的相关代码的工具或教程。 1. **MyBatis自动化工具**: MyBatis Generator ...
4. **数据库兼容性**:MySQL数据库文档生成工具一般会支持多种数据库系统,除了MySQL之外,可能还包括Oracle、SQL Server、PostgreSQL等,以满足跨平台的需求。这意味着即使项目中使用了不同的数据库,也能方便地...
支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO等,可以自动去除表前缀,支持单个和批量生成JavaBean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有注释了...
1. 本程序基于VS2010+.NET4.0框架开发,开发语言C#。...2. 软件主要功能是根据现有数据库,逆向导出Excel格式的表结构说明文档。 3. 支持MSSQL、Oracle、Mysql。 本人应届生,编程新手,欢迎指导和教育。
本篇文章将详细介绍如何利用PowerDesigner来生成数据库设计文档,解决手动编写文档带来的繁琐和易出错的问题。 首先,我们需要理解数据库设计文档的重要性。它不仅记录了数据库的结构,包括表、字段、关系等,还...
数据库文档自动生成工具是一种高效且实用的软件工具,它的主要功能是帮助IT专业人士快速地将数据库中的结构信息,包括数据表、字段、索引等详细信息,整理并生成清晰、规范的Word文档。这种工具极大地简化了数据库...
它支持MySQL和Oracle两种主流的关系型数据库,这意味着无论是小型项目还是大型企业级应用,都可以利用此工具进行数据库文档的生成。MySQL以其轻量级和易用性在Web开发中广泛使用,而Oracle则因其强大的性能和企业级...
5. **自动文档生成**:通过此工具,开发者无需手动编写繁琐的数据库文档,只需配置好数据库连接信息,程序就能自动获取表结构、字段信息、索引和约束条件等,大大提高了工作效率。 6. **信息提取与格式化**:工具能...
一直以来根据数据库表结构自动生成JavaBean、自动生成MyBaits的Mapper映射配置文件、自动生成数据库设计文档都是一件让人很头痛的事情,既浪费时间又很繁琐,看着几十上百个表的成千上万个字段,真是一件让人痛苦的...
总的来说,解决动软代码生成器v2.78在MySQL下生成数据库文档时没有备注的问题,需要从数据库连接、生成器配置、第三方工具验证、源码调试以及寻求官方支持等多个方面进行排查和解决。在IT开发中,遇到问题并不可怕,...
7. 生成数据库文档时,用户可自定义ER图的字体设置,提升了文档的视觉效果。 8. JSON参数配置增强了文件操作功能和字段数据类型映射转换,使配置更加灵活。 9. 优化了JSON参数配置,允许同时使用表命名方式和驼峰...
该工具的最大特点是支持多数据源,这意味着它可以处理来自不同数据库管理系统(如MySQL、Oracle、SQL Server、PostgreSQL等)的数据。这样的功能使得开发人员和DBA在处理跨平台或多数据库环境的项目时,能够更加便捷...
支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO等,可以自动去除表前缀,支持单个和批量生成JavaBean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有注释了...
"自动生成数据库文档工具.zip" 提供了一个自动化解决方案,使得数据库设计者和开发者无需手动编写文档,从而节省时间和减少错误。 这个工具的核心在于`org.sqlToDoc.DbDocUI`类,它包含了主要的功能逻辑。运行该类...