数据库静态表结构导出及分析对比工具
背景
随着系统一次次迭代升级,数据库不断更新维护,不同环境数据库表差异性逐渐增多,表结构设计缺陷也逐渐增多; 随着数据量增多,原有正常表,也会成为风险表(主键ID类型问题,索引缺失、无效,备注缺失等问题)。
系统遇到两次数据库问题(一次索引失效,一次任务表ID触达上线)
访问外部系统获取商品列表过长(外部系统没创建索引)
解决这些问题是遇见而不是预见,细思极恐。。。。。
数据静态表结构解析对比工具
1).生成数据库表结构文档(给懒人使用,不用写数据库文档了)
2).解析数据库表结构设计是否合理(主键是否创建,类型是否合理,索引是否创建,备注是否确实)
3).对应不同数据源表结构差异对比
工具代码解读(主要方法介绍)
1) .fills.main.Db2WordMain.java (程序入口)
Java 原生awt工具,实现数据库表生成word的前端窗口
不做过多描述,见图
注:所有字段必填
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
- 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
*/
工具包
下载加压如下,双击 bat文件即可,需要配置JDK环境,jdk1.8
窗口如小图
源码包
fillsJavaTools
总结
- 目前我们研发设计没有数据库文档,通过该工具可以生成数据库文档;不用每次反向操作去看测试环境和生产环境的表结构(痛点是增加维护成本,需要定期更新)
- 对数据库静态表结构做了分析 (缺点:目前只是做了简单表结构分析:是否有主键,索引,字段备注,判定主键类型)
- 不同环境数据库表结构对比(目前只是对比差异,具体情况需要研发人员排查以哪个环境为准)