`

分析数据库版本不一致的小程序

    博客分类:
  • J2SE
阅读更多

由于我们在开发过程中无法实时地与每个客户的数据库保持一致,因此,经过一段时间,出现数据库各个学校不尽统一的情况也在所难免,现上传一个今天刚写的分析两个不同的库之间表和字段是否一致的小程序与大家共享。
为了便于理解,现需要说明如下:
1.连接数据库的部分不要使用带上下文的,写个简单的数据库连接即可
2.程序中采用内部类来记录数据信息,同时对内部类的构造函数使用了多态
3.为了实现程序的通用,对于需要比较的数据库,我定义成了常量,因此,在程序中只需修改这两个常量的值,程序其他地方不需要做任何改动便可以分析出你想要的比对结果。
 

java 代码
  1. /*******************************************************************************  
  2.  * @author danlley  
  3.  * @version 1.06.06.12  
  4.  * @since 2006-06-12  
  5.  *   
  6.  
  7. Description: 此类用于分析客户库之间,或者开发库与客户库之间出现的不一致问题!  
  8.  *                 要比较两个库中的数据之间差异,只需对常量:DATABASE_A  
  9.  *                                                     DATABASE_B  
  10.  *                 修改成所需批对的数据库即可。  
  11.  *           注意:  在整个处理过程中,表和视图完全按照同一概念处理.  
  12.  
  13.  
  14.  *******************************************************************************/  
  15. package cc.c37c.newscore.business;   
  16.   
  17. import java.util.Collection;   
  18. import java.util.ArrayList;   
  19. import java.util.Iterator;   
  20. import java.sql.Connection;   
  21. import java.sql.PreparedStatement;   
  22. import java.sql.ResultSet;   
  23. import org.danlley.ora.DBConnection;//用于没有通过上下文进行连接数据库(属于简单连接方式)   
  24.   
  25. public class CompareCertainDB{   
  26.     /**  
  27.      * 定义两个要进行比较的数据库名常量,可根据需要进行修改  
  28.      */  
  29.     private static final String DATABASE_A="WLJW";   
  30.     private static final String DATABASE_B="JWGL";   
  31.     Connection conn=null;   
  32.     PreparedStatement ps=null;   
  33.     ResultSet rs=null;   
  34.   
  35.     /**  
  36.      * 说明:此方法用于比较两个不同库中是否有相同表名,相同字段名的字段中字段大小不一致的情况  
  37.      *      如果有,则返回一个集合类用于保存查询结果.  
  38.      *      其中,每条信息都保存在一个内部类 IntityClass 的属性 T_NAME , C_NAME ,  
  39.      *                                                    C_SIZE , CC_SIZE 中.  
  40.      * @return  
  41.      * @throws java.lang.Exception  
  42.      */  
  43.     public Collection com_comp_len_col_both_DB() throws Exception{   
  44.         try{   
  45.             ArrayList com_comp_len_col=new ArrayList();   
  46.             StringBuffer strSQL=new StringBuffer();   
  47.             strSQL.append("select a.atable_name,a.acolumn_name,a.adata_length,b.bdata_length from ");   
  48.             strSQL.append(" (");   
  49.             strSQL.append("     select table_name atable_name, column_name acolumn_name,data_length adata_length");   
  50.             strSQL.append("      from all_tab_columns where owner='WLJW'");   
  51.             strSQL.append(" )a,");   
  52.             strSQL.append(" (");   
  53.             strSQL.append("     select table_name btable_name, column_name bcolumn_name,data_length bdata_length ");   
  54.             strSQL.append("      from all_tab_columns where owner='JWGL'");   
  55.             strSQL.append(" )b ");   
  56.             strSQL.append("where a.acolumn_name=b.bcolumn_name and ");   
  57.             strSQL.append("      a.atable_name=b.btable_name and");   
  58.             strSQL.append("  a.adata_length<>b.bdata_length");   
  59.             conn=DBConnection.getConn();   
  60.             System.out.println(   
  61.                 "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");   
  62.             System.out.println(strSQL.toString());   
  63.             System.out.println(   
  64.                 "++++++++++++++++++++++++++++++++++++++++++++++");   
  65.             ps=conn.prepareStatement(strSQL.toString());   
  66.             rs=ps.executeQuery();   
  67.             while(rs.next()){   
  68.                 String T_NAME=null//表名   
  69.                 String C_NAME=null//字段名称   
  70.                 String C_SIZE=null//字段大小   
  71.                 String CC_SIZE=null//被比对字段大小   
  72.                 T_NAME=rs.getString("atable_name");   
  73.                 C_NAME=rs.getString("acolumn_name");   
  74.                 C_SIZE=rs.getString("adata_length");   
  75.                 CC_SIZE=rs.getString("bdata_length");   
  76.                 IntityClass intityClass=new IntityClass(T_NAME,C_NAME,C_SIZE,CC_SIZE);   
  77.                 com_comp_len_col.add(intityClass);   
  78.             }   
  79.             int size=com_comp_len_col.size();   
  80.             com_comp_len_col.add(new IntityClass("大小不一致的字段共有:"+size+"个!",null,null,null));   
  81.             return com_comp_len_col;   
  82.         } catch(Exception e){   
  83.             e.printStackTrace();   
  84.             e.getMessage();   
  85.             throw new Exception(e);   
  86.         } finally{   
  87.             DBConnection.close(rs);   
  88.             DBConnection.close(ps);   
  89.             DBConnection.freeConn(conn);   
  90.         }   
  91.     }   
  92.   
  93.     /**  
  94.      * 说明:此方法用于比对在两个库同一名称的表中,字段名称在一个库中存在,而在另一个库中不存在的情况  
  95.      * @param type 用来决定两个库的比对方式,此参数由 DATABASE_A 和 DATABASE_B  
  96.      *             来取值.  
  97.      *             如果类型为 DATABASE_A ,则查找 DATABASE_A 库中存在而  
  98.      *             DATABASE_B库中不存在的表.  
  99.      *             如果类型为 DATABASE_B ,则查找 DATABASE_B 库中存在,而 DATABASE_A  
  100.      *             库中不存在的情况.  
  101.      * @return  
  102.      * @throws java.lang.Exception  
  103.      */  
  104.     public Collection compCols_in_one_notin_other(String type) throws Exception{   
  105.         ArrayList diff_cols_li=new ArrayList();   
  106.         try{   
  107.             StringBuffer strSQL=new StringBuffer();   
  108.             String typeA="";   
  109.             String typeB="";   
  110.             /********************************************  
  111.              ******            决定查询方式         *******  
  112.              ********************************************/  
  113.             if(CompareCertainDB.DATABASE_A.equals(type)){   
  114.                 typeA=CompareCertainDB.DATABASE_A;   
  115.                 typeB=CompareCertainDB.DATABASE_B;   
  116.             }   
  117.             if(CompareCertainDB.DATABASE_B.equals(type)){   
  118.                 typeB=CompareCertainDB.DATABASE_A;   
  119.                 typeA=CompareCertainDB.DATABASE_B;   
  120.             }   
  121.             strSQL.append("select table_name,column_name,data_type from ");   
  122.             strSQL.append("    (");   
  123.             strSQL.append("        select table_name,column_name,data_type from ");   
  124.             strSQL.append("  (");   
  125.             strSQL.append("      select table_name,column_name,data_type from all_tab_columns where owner='"+typeA+"'");   
  126.             strSQL.append("  )");   
  127.             strSQL.append("        where table_name in (select distinct(table_name) btablename from all_tab_columns where owner ='"+typeB+"')");   
  128.             strSQL.append("    )B ");   
  129.             strSQL.append(" where B.column_name not in (select column_name from all_tab_columns where owner ='"+typeB+"')");   
  130.             conn=DBConnection.getConn();   
  131.             System.out.println(   
  132.                 "+++++++++++++++++++++++++++++++++++++++++++");   
  133.             System.out.println(strSQL.toString());   
  134.             System.out.println(   
  135.                 "++++++++++++++++++++++++++++++++++++++++++++++++");   
  136.             ps=conn.prepareStatement(strSQL.toString());   
  137.             rs=ps.executeQuery();   
  138.             String diff_cols=null;   
  139.             while(rs.next()){   
  140.                 String T_NAME=null;   
  141.                 String C_NAME=null;   
  142.                 String C_TYPE=null;   
  143.                 T_NAME=rs.getString("table_name");   
  144.                 C_NAME=rs.getString("column_name");   
  145.                 C_TYPE=rs.getString("data_type");   
  146.                 IntityClass intityClass=new IntityClass(T_NAME,C_NAME,C_TYPE);   
  147.                 diff_cols_li.add(intityClass);   
  148.             }   
  149.             int size=diff_cols_li.size();   
  150.             diff_cols_li.add(new IntityClass(null,"共有 "+size+" 个字段",null)); //);   
  151.             return diff_cols_li;   
  152.         } catch(Exception e){   
  153.             e.printStackTrace();   
  154.             e.getMessage();   
  155.             throw new Exception(e);   
  156.         } finally{   
  157.             DBConnection.close(rs);   
  158.             DBConnection.close(ps);   
  159.             DBConnection.freeConn(conn);   
  160.         }   
  161.     }   
  162.   
  163.     /**  
  164.      *   
  165.  
  166. Title: 内部类  
  167.  
  168.  
  169.      *   
  170. Description:由于在处理过程中将会大量用到字段名称和字段类型,此处如果新建一个类  
  171.      *                去处理由于仅仅包含五个对象属性,因此有些得补偿失,所以采用内部类,  
  172.      *                这样:  
  173.      *                    首先省去了建一个新的class  
  174.      *                    解决了代码重复定义和使用的臃肿现象  
  175.      *                此内部类中包含五个对象属性:  
  176.      *                     T_NAME    表名  
  177.      *                     C_NAME    字段名称  
  178.      *                     C_TYPE    字段类型  
  179.      *                     C_SIZE    字段大小  
  180.      *                     CC_SIZE   被比对字段大小  
  181.  
  182.  
  183.      * @author danlley  
  184.      * @version 1.0  
  185.      */  
  186.     public static class IntityClass{   
  187.         /**  
  188.          * 以下三个属性主要用于用于比对字段类型,同时,除C_TYPE外,其余两属性还将用于  
  189.          * 比对字段大小  
  190.          */  
  191.         String T_NAME=null//表名   
  192.         String C_NAME=null//字段名称   
  193.         String C_TYPE=null//字段类型   
  194.         /**  
  195.          * 下面3个字段与T_NAME,C_NAME一起用于比对字段大小  
  196.          */  
  197.         String C_SIZE=null//字段大小   
  198.         String CC_SIZE=null//被比对字段大小   
  199.         /**  
  200.          * 说明: 此方法用于比对字段类型  
  201.          * @param T_NAME    表名  
  202.          * @param C_NAME    字段名称  
  203.          * @param C_TYPE    字段类型  
  204.          */  
  205.         public IntityClass(String T_NAME,String C_NAME,String C_TYPE){   
  206.             this.T_NAME=T_NAME;   
  207.             this.C_NAME=C_NAME;   
  208.             this.C_TYPE=C_TYPE;   
  209.         }   
  210.   
  211.         /**  
  212.          * 说明:此方法用于比对字段大小  
  213.          * @param T_NAME    表名  
  214.          * @param C_NAME    字段名称  
  215.          * @param C_SIZE    字段大小  
  216.          * @param CC_SIZE   被比对字段大小  
  217.          */  
  218.         public IntityClass(String T_NAME,String C_NAME,String C_SIZE,String CC_SIZE){   
  219.             this.T_NAME=T_NAME;   
  220.             this.C_NAME=C_NAME;   
  221.             this.C_SIZE=C_SIZE;   
  222.             this.CC_SIZE=CC_SIZE;   
  223.         }   
  224.     }   
  225.   
  226.     /**  
  227.      * 说明:此方法用于比较并返回两个库中属于一个库,但又不属于另一个库的表信息  
  228.      * @param type 如果传入的参数为“DATABASE_A”,则找出WLJW中存在,但JWGL中不存在的表。  
  229.      *             如果传入的参数为“DATABASE_B”,则找出JWGL中存在,但WLJW中不存在的表。  
  230.      * @return  
  231.      * @throws java.lang.Exception  
  232.      */  
  233.     public Collection tabShldDel(String type) throws Exception{   
  234.         try{   
  235.             ArrayList dutyTabLi=new ArrayList();   
  236.             StringBuffer strSQL=new StringBuffer();   
  237.             String typeA="";   
  238.             String typeB="";   
  239.             /********************************************  
  240.              ******            决定查询方式         *******  
  241.              ********************************************/  
  242.             if(CompareCertainDB.DATABASE_A.equals(type)){   
  243.                 typeA=CompareCertainDB.DATABASE_A;   
  244.                 typeB=CompareCertainDB.DATABASE_B;   
  245.             }   
  246.             if(CompareCertainDB.DATABASE_B.equals(type)){   
  247.                 typeB=CompareCertainDB.DATABASE_A;   
  248.                 typeA=CompareCertainDB.DATABASE_B;   
  249.             }   
  250.             strSQL.append("select atablename from ");   
  251.             strSQL.append("    (");   
  252.             strSQL.append("        select distinct(table_name) atablename from all_tab_columns where owner like '%"+typeA+"%'");   
  253.             strSQL.append("    )A ");   
  254.             strSQL.append(" where A.atablename not in ( ");   
  255.             strSQL.append("select distinct(table_name) btablename from all_tab_columns where owner ='"+typeB+"'");   
  256.             strSQL.append(" ) ");   
  257.             conn=DBConnection.getConn();   
  258.             System.out.println(   
  259.                 "++++++++++++++++++++++++++++++");   
  260.             System.out.println(strSQL.toString());   
  261.             System.out.println(   
  262.                 "++++++++++++++++++++++++++++++++++");   
  263.             ps=conn.prepareStatement(strSQL.toString());   
  264.             rs=ps.executeQuery();   
  265.             while(rs.next()){   
  266.                 String tableName=rs.getString("atablename");   
  267.                 dutyTabLi.add(tableName);   
  268.             }   
  269.             int size=dutyTabLi.size();   
  270.             dutyTabLi.add("共有 "+size+" 张表");   
  271.             return dutyTabLi;   
  272.         } catch(Exception e){   
  273.             e.printStackTrace();   
  274.             e.getMessage();   
  275.             throw new Exception(e);   
  276.         } finally{   
  277.             DBConnection.close(rs);   
  278.             DBConnection.close(ps);   
  279.             DBConnection.freeConn(conn);   
  280.         }   
  281.     }   
  282.   
  283.     /**  
  284.      * 说明:用于返回两个库中的交集表信息  
  285.      * @return  
  286.      * @throws java.lang.Exception  
  287.      */  
  288.     public Collection commonTabLi() throws Exception{   
  289.         try{   
  290.             ArrayList comTabLi=new ArrayList();   
  291.             StringBuffer strSQL=new StringBuffer();   
  292.             strSQL.append("select atablename from ");   
  293.             strSQL.append("    ( ");   
  294.             strSQL.append("        select distinct(table_name) atablename from all_tab_columns where owner='"+CompareCertainDB.DATABASE_A+"'");   
  295.             strSQL.append("    )A ");   
  296.             strSQL.append("where A.atablename in (select distinct(table_name) btablename from all_tab_columns where owner ='"+   
  297.                           CompareCertainDB.DATABASE_B+"')");   
  298.             conn=DBConnection.getConn();   
  299.             System.out.println(   
  300.                 "++++++++++++++++++++++++++++++++");   
  301.             System.out.println(strSQL.toString());   
  302.             System.out.println(   
  303.                 "++++++++++++++++++++++++++++++++++++++++");   
  304.             ps=conn.prepareStatement(strSQL.toString());   
  305.             rs=ps.executeQuery();   
  306.             String comTab=null;   
  307.             while(rs.next()){   
  308.                 comTab=rs.getString("atablename");   
  309.                 comTabLi.add(comTab);   
  310.             }   
  311.             int size=comTabLi.size();   
  312.             comTabLi.add("共有 "+size+" 张表");   
  313.             return comTabLi;   
  314.         } catch(Exception e){   
  315.             e.printStackTrace();   
  316.             e.getMessage();   
  317.             throw new Exception(e);   
  318.         } finally{   
  319.             DBConnection.close(rs);   
  320.             DBConnection.close(ps);   
  321.             DBConnection.freeConn(conn);   
  322.         }   
  323.     }   
  324.     /**  
  325.      * 说明:程序处理入口  
  326.      * @param args  
  327.      */  
  328.     public static void main(String[] args){   
  329.         try{   
  330.             CompareCertainDB compCertDB=new CompareCertainDB();   
  331.             System.out.println("==================================================");   
  332.             System.out.println("          以下为"+CompareCertainDB.DATABASE_A+"中存在但在"+CompareCertainDB.DATABASE_B+"中不存在的表        ");   
  333.             System.out.println("==================================================");   
  334.             Collection inWLJWnotJWGL=compCertDB.tabShldDel(CompareCertainDB.DATABASE_A);   
  335.             Iterator iter_wljw=inWLJWnotJWGL.iterator();   
  336.             String tabinWLJW=null;   
  337.             while(iter_wljw.hasNext()){   
  338.                 tabinWLJW=(String)iter_wljw.next();   
  339.                 System.out.println(""+tabinWLJW);   
  340.             }   
  341.             System.out.println("==================================================\n\n\n\n");   
  342.           &nb
分享到:
评论

相关推荐

    AI面相分析小程序,后端采用PHP代码和MySQL数据库

    AI面相分析小程序是一款基于人工智能技术的面相分析应用,后端采用PHP代码和MySQL数据库开发。该小程序可以通过上传用户的面部照片,进行面相分析,分析用户的性格、健康、财运等方面的特征,为用户提供面相分析报告...

    软件工程实践案例分析+报告(微信小程序+mysql数据库+web后台管理).zip

    软件工程实践案例分析+报告(微信小程序+mysql数据库+web后台管理).zip软件工程实践案例分析+报告(微信小程序+mysql数据库+web后台管理).zip软件工程实践案例分析+报告(微信小程序+mysql数据库+web后台管理)....

    数据库备份文件读取小程序

    这个小程序设计的目标是为了方便用户对数据库备份进行管理和分析,确保数据的安全性和可用性。 在数据库管理中,备份通常有全备、增量备和差异备份等多种类型。全备份是完全复制所有数据库的数据,而增量备份只复制...

    基于微信小程序数独小游戏(毕业设计,包括数据库,源码,教程).zip

    微信小程序毕业设计,微信小程序课程设计,基于微信小程序开发的,含有代码注释,新手也可看懂,可作为毕业设计,课程设计。 包含:项目源码、数据库脚本、部署说明等,该项目可以作为课程设计使用,前后端代码都在...

    微信小程序互动打卡小程序源码数据库.zip

    【微信小程序互动打卡小程序源码数据库】是一个针对微信平台开发的轻量级应用程序,主要用于实现用户之间的互动打卡功能。此项目适用于毕业设计、教学实践或个人项目开发,它结合了微信小程序的技术栈与数据库管理,...

    一个MFC数据库编程(ODBC)小程序

    在这个名为“一个MFC数据库编程(ODBC)小程序”的项目中,我们将深入探讨如何利用MFC和ODBC技术进行数据库操作。 首先,MFC通过CDatabase类提供了对ODBC接口的封装,使得开发者可以使用C++的对象模型来操作数据库。...

    微信小程序用Servlet连接数据库源码.zip

    微信小程序是一种轻量级的应用开发平台,主要用于在微信内运行应用程序,无需下载安装即可使用。...通过分析和实践这个项目,可以深入了解微信小程序的API使用、Servlet的请求处理机制以及数据库的连接与操作。

    基于微信小程序的兵马俑小程序(含语音画册与实时导览)(毕业设计,包括数据库,源码,教程).zip

    微信小程序项目实战,微信小程序课程设计,基于微信小程序开发的,含有简单代码注册,下载下来简单部署即可使用。 包含:项目源码、数据库脚本、部署说明等,该项目可以作为课程设计使用,前后端代码都在里面。 ...

    毕业设计: 基于小程序的精准扶贫数据收集(源码 + 数据库 + 说明文档)

    毕业设计: 基于小程序的精准扶贫数据收集(源码 + 数据库 + 说明文档) 第2章 系统分析 3 2.1 开发工具及技术 3 2.1.1 系统开发环境 3 2.1.2 Mysql数据库简介 3 2.1.3 微信小程序开发者工具 3 2.2 系统可行性分析 3 ...

    小程序云开发云函数数据库活动报名

    在本文中,我们将深入探讨“小程序云开发云函数数据库活动报名”这一主题,这涉及到微信小程序的云开发技术,以及如何使用云函数和数据库来实现活动报名功能。首先,我们来了解一下微信小程序的基础知识。 微信小...

    Java小程序+access数据库

    Java小程序+access数据库是开发一个简单的学生成绩管理系统的核心技术组合。这个系统是为初学者设计的,旨在帮助他们理解如何使用Java编程语言与数据库进行交互,以实现数据的存储、查询和管理。 首先,Java是一种...

    微信小程序牙齿健康科普小程序源码数据库.zip

    源码数据库包含了整个小程序的开发资源,是理解并进一步扩展这个小程序的关键。 1. **微信小程序开发**:微信小程序的开发环境基于腾讯自家的开发工具WeChat Developer Tools,它提供了代码编辑、预览、调试和发布...

    微信小程序医院预约挂号小程序源码数据库.zip

    在这个“微信小程序医院预约挂号小程序源码数据库”中,我们可以深入探讨以下几个关键知识点: 1. **微信小程序开发**:微信小程序采用的是微信自己的开发框架WXML(WeiXin Markup Language)和WXSS(WeiXin Style ...

    基于GPS的家教微信小程序的数据库分析与设计.pdf

    根据提供的文件信息,本文主要探讨了基于GPS的家教微信小程序的数据库分析与设计。通过这份文档,我们可以了解到开发一个家教微信小程序所需关注的关键数据库设计原则、实现功能、市场需求分析以及微信小程序的应用...

    微信小程序在线阅读系统微信小程序源码数据库.zip

    描述中的信息与标题一致,再次确认了这是关于微信小程序的源码和数据库,特别是针对在线阅读功能的实现。这意味着源码可能包括了用户界面设计、书籍数据管理、阅读体验优化等方面的内容。 【标签解析】 标签“毕业...

    数据库查询示例程序

    学习者可以通过分析和运行这个程序,理解数据库查询的原理,并掌握如何在实际环境中实现这些查询。同时,提供的辅助文件如Readme和说明文档可以帮助用户更好地理解和使用这个程序,从而提升他们的数据库应用技能。

    微信小程序二手物品交易小程序源码数据库论文.docx

    这篇论文主要讨论了微信小程序二手物品交易小程序的设计和实现,涵盖了多个方面的知识点,包括微信小程序的概念和特点、开发技术、需求分析、系统设计思想、数据库设计、小程序的测试和维护等。

    微信小程序精准扶贫数据收集小程序平台源码数据库论文.docx

    "微信小程序精准扶贫数据收集小程序平台源码数据库论文" 微信小程序精准扶贫数据收集小程序平台源码数据库论文是基于微信小程序开发的一款精准扶贫数据收集小程序平台的设计和实现。该小程序平台利用微信小程序的...

    记账程序 acess数据库 图表分析

    本文将深入探讨如何利用Access数据库设计记账程序以及进行图表分析。 首先,我们需要了解Access数据库的基本结构。Access数据库由多个对象组成,包括表(Table)、查询(Query)、窗体(Form)、报表(Report)、宏...

    微信小程序-基于微信小程序的专利分析android小程序(包括源码,数据库,教程).zip

    小程序完整项目,包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以...

Global site tag (gtag.js) - Google Analytics