`
namezhou
  • 浏览: 158596 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

根据数据库注释自动生成数据库文档【支持Oracle和Mysql】

阅读更多

公司项目比较乱,很多时候都是需要先完成项目再准备文档。

数据库文档是最基本的文档了,整理起来比较麻烦,如果数据库建表的时候能把列注释都能写好的话,理论上自动生成数据库文档应该是很好实现的。

自己简单做了个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;
	}
}

 

  • 大小: 29.3 KB
分享到:
评论
1 楼 wcnmbbbb 2017-09-29  
com.lowagie.text  对应的包呢?

相关推荐

    mysql或者Oracle通过表注释生成word数据库文档

    这个过程不仅可以自动化地生成数据库文档,还可以作为持续集成的一部分,每当数据库结构发生变化时自动更新文档,确保文档与实际数据库状态保持一致。 总之,通过编程方式将数据库的表注释整理成Word文档是一种有效...

    Oracle|Sqlserver|MySql数据库表结构一键生成工具

    "Oracle|Sqlserver|MySql数据库表结构一键生成工具" 提供了一种高效的方法来自动化这个过程,大大减轻了手动编写文档的工作量。这款工具能够支持三种主流的关系型数据库管理系统:Oracle、SQL Server和MySQL。 ...

    数据库文档生成器,根据数据库表DDL生成markdown和word文档.zip

    数据库文档生成是数据库管理中的一个重要环节,它有助于开发者和DBA更好地理解和维护数据库结构。本资源提供了一个工具,能够根据数据库表的DDL(Data Definition Language)自动生成Markdown和Word格式的文档,极大...

    mysql、oracle 数据库生成文档源码

    这通常指的是一个程序或脚本,它可以连接到MySQL和Oracle数据库,然后自动生成包含数据库表结构、字段信息、索引和约束的文档。这样的工具可以大大节省手动编写文档的时间,提高工作效率。 数据库生成文档的核心...

    自动生成数据库说明文档

    总的来说,"自动生成数据库说明文档"是一项实用的工具,能够帮助我们更好地管理和理解数据库,提升开发和维护的效率。无论是在数据库设计阶段,还是在后期的运维工作中,都能发挥出其强大的作用。

    mybatis自动生成实例支持oracle和MySQL

    在"mybatis自动生成实例支持oracle和MySQL"的场景中,我们可以理解为该压缩包包含了一个能够帮助开发者自动生成针对Oracle和MySQL数据库的相关代码的工具或教程。 1. **MyBatis自动化工具**: MyBatis Generator ...

    Mysql数据库文档生成工具

    4. **数据库兼容性**:MySQL数据库文档生成工具一般会支持多种数据库系统,除了MySQL之外,可能还包括Oracle、SQL Server、PostgreSQL等,以满足跨平台的需求。这意味着即使项目中使用了不同的数据库,也能方便地...

    基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.0.0版_JAR)

    支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO等,可以自动去除表前缀,支持单个和批量生成JavaBean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有注释了...

    数据库结构文档生成工具

    1. 本程序基于VS2010+.NET4.0框架开发,开发语言C#。...2. 软件主要功能是根据现有数据库,逆向导出Excel格式的表结构说明文档。 3. 支持MSSQL、Oracle、Mysql。 本人应届生,编程新手,欢迎指导和教育。

    使用powerdesigner 生成数据库设计文档

    本篇文章将详细介绍如何利用PowerDesigner来生成数据库设计文档,解决手动编写文档带来的繁琐和易出错的问题。 首先,我们需要理解数据库设计文档的重要性。它不仅记录了数据库的结构,包括表、字段、关系等,还...

    数据库文档自动生成工具

    数据库文档自动生成工具是一种高效且实用的软件工具,它的主要功能是帮助IT专业人士快速地将数据库中的结构信息,包括数据表、字段、索引等详细信息,整理并生成清晰、规范的Word文档。这种工具极大地简化了数据库...

    MYSQL、ORACLE数据库、JAVA代码文档生成器

    它支持MySQL和Oracle两种主流的关系型数据库,这意味着无论是小型项目还是大型企业级应用,都可以利用此工具进行数据库文档的生成。MySQL以其轻量级和易用性在Web开发中广泛使用,而Oracle则因其强大的性能和企业级...

    数据库表结构说明文档自动生成工具

    5. **自动文档生成**:通过此工具,开发者无需手动编写繁琐的数据库文档,只需配置好数据库连接信息,程序就能自动获取表结构、字段信息、索引和约束条件等,大大提高了工作效率。 6. **信息提取与格式化**:工具能...

    基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.8.0版_JAR)

    一直以来根据数据库表结构自动生成JavaBean、自动生成MyBaits的Mapper映射配置文件、自动生成数据库设计文档都是一件让人很头痛的事情,既浪费时间又很繁琐,看着几十上百个表的成千上万个字段,真是一件让人痛苦的...

    解决动软代码生成器v2.78 mysql下生成数据库文档时没有备注的问题

    总的来说,解决动软代码生成器v2.78在MySQL下生成数据库文档时没有备注的问题,需要从数据库连接、生成器配置、第三方工具验证、源码调试以及寻求官方支持等多个方面进行排查和解决。在IT开发中,遇到问题并不可怕,...

    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0.pdf

    7. 生成数据库文档时,用户可自定义ER图的字体设置,提升了文档的视觉效果。 8. JSON参数配置增强了文件操作功能和字段数据类型映射转换,使配置更加灵活。 9. 优化了JSON参数配置,允许同时使用表命名方式和驼峰...

    数据库设计文档一键生成工具(支持多数据源).zip

    该工具的最大特点是支持多数据源,这意味着它可以处理来自不同数据库管理系统(如MySQL、Oracle、SQL Server、PostgreSQL等)的数据。这样的功能使得开发人员和DBA在处理跨平台或多数据库环境的项目时,能够更加便捷...

    基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.0.0版_EXE)

    支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO等,可以自动去除表前缀,支持单个和批量生成JavaBean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有注释了...

    自动生成数据库文档工具.zip

    "自动生成数据库文档工具.zip" 提供了一个自动化解决方案,使得数据库设计者和开发者无需手动编写文档,从而节省时间和减少错误。 这个工具的核心在于`org.sqlToDoc.DbDocUI`类,它包含了主要的功能逻辑。运行该类...

Global site tag (gtag.js) - Google Analytics