数据库静态表结构导出及分析对比工具

背景

随着系统一次次迭代升级,数据库不断更新维护,不同环境数据库表差异性逐渐增多,表结构设计缺陷也逐渐增多; 随着数据量增多,原有正常表,也会成为风险表(主键ID类型问题,索引缺失、无效,备注缺失等问题)。

系统遇到两次数据库问题(一次索引失效,一次任务表ID触达上线)

访问外部系统获取商品列表过长(外部系统没创建索引)

解决这些问题是遇见而不是预见,细思极恐。。。。。

 

数据静态表结构解析对比工具

 

1).生成数据库表结构文档(给懒人使用,不用写数据库文档了)

2).解析数据库表结构设计是否合理(主键是否创建,类型是否合理,索引是否创建,备注是否确实)

3).对应不同数据源表结构差异对比

 

工具代码解读(主要方法介绍)

1) .fills.main.Db2WordMain.java (程序入口)

   Java 原生awt工具,实现数据库表生成word的前端窗口

不做过多描述,见图

mysql对比库的表结构是否一致 工具 数据库表结构对比工具_mysql

注:所有字段必填

 

2) .fills.tools.action.DoDb2WordUtil.java(生成word业务逻辑)

A. DoDb2WordUtil.createDb2Word(String type, List<Map<String, String>> listMap)
/**
 * @Function: DoDb2WordUtil.java
 * @Description: 导出word文档对外暴露接口
 * @param:@param type 业务类型  errorFlag:分析表结构,contrastFlag:对比表结构
 * @param:@param listMap 数据库配置列表信息
 * @return:void
*/
B. DoDb2WordUtil.createDb2Word(Map<String,String> map,Map<String,Map<String,List<String[]>>> mapMapListArrays,boolean checkFlag)
/**
 *
 * @Function: DoDb2WordUtil.java
 * @Description: 导出word文档内部处理接口
 *
 * @param:@param map 数据库配置
 * @param:@param mapMapListArrays 封装需要对比数据集合
 * @param:@param checkFlag  是否分析表结构标识
 * @return:void
*/
C. DoDb2WordUtil.createDbContrast(String org,String cont,String downLoadPath,Map<String,Map<String,List<String[]>>> mapMapListArrays)
 /**
 *
 * @Function: DoDb2WordUtil.java
 * @Description: 导出不同数据源对比差异内部接口
 *
 * @param:@param org  源数据库
 * @param:@param cont 对比数据库
 * @param:@param downLoadPath 存储地址
 * @param:@param mapMapListArrays 封装对比数据源
 * @return:void
*/
D. DoDb2WordUtil.checkOrgAndCont(String org,String cont,Map<String,Map<String,List<String[]>>> mapMapListArrays,List<String[]> listError)
/**
 *
 * @Function: DoDb2WordUtil.java
 * @Description: 不同数据源对比逻辑处理
 *
 * @param:@param org  源数据名称
 * @param:@param cont 对比数据源名称
 * @param:@param mapMapListArrays  封装对比源数据
 * @param:@param listError  封装返回对比差异信息
 * @param:@throws Exception
 * @return:void
*/
E. DoDb2WordUtil.checkTypes(String talbel,String types,String[] orgArrays,String[] contArrays,List<String[]> listError)
/**
 *
 * @Function: DoDb2WordUtil.java
 * @Description: 对比字段具体差异规则
 *
 * @param:@param talbel 对比表名
 * @param:@param types  对比字段
 * @param:@param orgArrays 源字段详情
 * @param:@param contArrays 对比字段详情
 * @param:@param listError  封装返回差异信息列表
 * @return:void
*/
F. DoDb2WordUtil.checkDb(List<String[]> list,List<String[]> tableError,String tableName,String tableNameCn)
/**
 *
 * @Function: DbToWordUtil.java
 * @Description: 分析表结构信息是否合理
 *
 * @param:@param list 表字段列表信息
 * @param:@param tableError 封装返回不合理列表
 * @param:@param tableName  表名
 * @param:@param tableNameCn 表备注信息
 * @return:void
*/

3).fills.tools.other.JdbcConnectionUtil(JDBC链接工具)

A.JdbcConnectionUtil.initConfig(String url,String name,String pass,String driver)

/**
     *
     * @Function: JdbcConnectionUtil.java
     * @Description: 初始化数据库配置信息
     *
     * @param:@param url 数据库连接
     * @param:@param name 用户名
     * @param:@param pass 用户密码
     * @param:@param driver 数据库驱动
     * @return:void
*/
B. JdbcConnectionUtil.getDbTables()
/**
     *
     * @Function: JdbcConnectionUtil.java
     * @Description: 获取数据库表列表
     *
     * @param:@return
     * @return:List<String[]> 返回数据库列表及对应名称
*/
C.JdbcConnectionUtil.getTableCommont(String tableName)
 /**
     *
     * @Function: JdbcConnectionUtil.java
     * @Description: 获取表备注信息
     *
     * @param:@param tableName 数据库表名
     * @param:@return
     * @return:String 返回表备注信息
*/
D.JdbcConnectionUtil.getTableProperty(String tableName)
  /**
     *
     * @Function: JdbcConnectionUtil.java
     * @Description: 获取表结构信息
     *
     * @param:@param tableName 表名
     * @param:@return
     * @return:List<String[]> 返回表结构信息
*/

4).fills.tools.file.FileCreateWordTableUtil

  1. FileCreateWordTableUtil.createTable(XWPFDocument xdoc,int[] column_widths,String[] FILEDS,List<String[]> list,String tableName,String fintSize)
/**
 *
 * @Function: FileCreateWordTableUtil.java
 * @Description: 生成word表格
 *
 * @param:@param xdoc word文档
 * @param:@param column_widths 列宽
 * @param:@param FILEDS  字段列表内容
 * @param:@param list 生成表格源数据
 * @param:@param tableName 表名
 * @param:@param fintSize 表格内容字体大小
 * @param:@throws Exception
 * @return:void
*/
B.FileCreateWordTableUtil.saveDocument(XWPFDocument document, String savePath)
/**
 *
 * @Function: FileCreateWordTableUtil.java
 * @Description: 创建word文档
 *
 * @param:@param document word文档
 * @param:@param savePath 保存地址
 * @param:@throws Exception
 * @return:void
*/

5) .fills.tools.file.FileUtil(创建文件工具)

A.FileUtil.createFile(String filePath)

/**
     * @Author ysf
     * @Description   创建文件
     * @Param  filePath 创建文件地址
     * @return void
  */

 

工具包

Db2WordTable工具

 

下载加压如下,双击 bat文件即可,需要配置JDK环境,jdk1.8

mysql对比库的表结构是否一致 工具 数据库表结构对比工具_mysql对比库的表结构是否一致 工具_02

窗口如小图

mysql对比库的表结构是否一致 工具 数据库表结构对比工具_mysql对比库的表结构是否一致 工具_03

源码包

fillsJavaTools

总结

  1. 目前我们研发设计没有数据库文档,通过该工具可以生成数据库文档;不用每次反向操作去看测试环境和生产环境的表结构(痛点是增加维护成本,需要定期更新)
  2. 对数据库静态表结构做了分析 (缺点:目前只是做了简单表结构分析:是否有主键,索引,字段备注,判定主键类型)
  3. 不同环境数据库表结构对比(目前只是对比差异,具体情况需要研发人员排查以哪个环境为准)