查询数据库结构信息

        JDBC是各大数据库供应商共同制定并遵循的标准,数据库的结构信息对于JDBC来说是完全透明的。JDBC通过元数据DatebaseMetadata、ResultSetMetaData、ParameterMetadatal来描述有关结构信息。JadePool在给定数据库连接的前提下,通过使用元数据获取相关的结构信息,使用DbCenter、Table、Field等Db族类实现数据库结构的面向对象的编程。DbCenter通过实现有限多例模式中的某一个实例来管理数据库的结构信息,通过该实例的Map<String, Table> tableMap变量管理该数据库下所有表的结构信息,每一个Table对象通过Map<String, Field> fieldMap变量管理该表下的所有字段的结构信息。由此,在DbCenter的某一个实例中完整地记录了数据库的全部相关结构信息。 Db族类的建立给JDBC编程带了一场革命性的变化,成为HashMap关系数据映射技术最重要的基础,这样我们就可以在更高更深的层次考虑怎样实现数据库的CRUD操作
        在JadePool中,怎样实现数据库结构信息的查询?
        ProcessVO类中提供了两个方法:String queryDbInfo()和String queryTableInfo(String tableName), 这两个方法可以帮助我们在编程的过程中、或在调试的过程中查看详细的数据库的结构信息或者某一个表的结构信息。下面演示一下这两个方法的效果。

        以下是调用queryDbInfo()的输出结果

        /*
         
         Catalog :             qicity
         Connection driver name :    Microsoft SQL Server JDBC Driver 3.0

         TABLE[0]: ad----------------------------------

         FieldName :    ad_id;
         IsPrimarykey :    true;
         TypeName :    bigint;
         DataType :    -5;
         BufferLength :    8;
         Position :    1;
         ThisSize :    19;
         Decimal :    0;
         DefaultValue :    null;
         Remark :    null;
         NullAble :    false;
         className :    java.lang.Long
         
         ...
          
         */

        调用queryTableInfo("columns")的输出结果
        /*
         
         TABLE:     columns
         ------------------------------------------------------

         FieldName :    columns_id;
         TypeName :    bigint;
         DataType :    -5;
         BufferLength :    8;
         Position :    1;
         ThisSize :    19;
         Decimal :    0;
         DefaultValue :    null;
         Remark :    null;
         NullAble :    false;
         className :    java.lang.Long

         
         FieldName :    title;
         TypeName :    varchar;
         DataType :    12;
         BufferLength :    100;
         Position :    4;
         ThisSize :    100;
         Decimal :    null;
         DefaultValue :    null;
         Remark :    null;
         NullAble :    true;
         className :    java.lang.String

         ......

         FieldName :    uptime;
         TypeName :    datetime;
         DataType :    93;
         BufferLength :    16;
         Position :    18;
         ThisSize :    23;
         Decimal :    3;
         DefaultValue :    null;
         Remark :    null;
         NullAble :    true;
         className :    java.sql.Timestamp
         */

        ProcessVO类中另外提供了public DbCenter getDb()方法,获取DbCenter对象,以下是DbCenter中有关数据库结构信息的部分方法。

java.lang.String getCatalog()  
java.sql.Connection getCon()  
java.lang.String getDriverName()  
Field getField(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldBufferLength(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldDecimal(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldDefaultValue(java.lang.String tableName, java.lang.String fieldName)  
java.util.Map<java.lang.String,Field> getFieldMap(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldPosition(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldRegex(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldRemark(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String[] getFields(java.lang.String tableName)  
java.lang.String getFieldSize(java.lang.String tableName, java.lang.String fieldName)  
int getFieldSqlType(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldTypeClassName(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String getFieldTypeName(java.lang.String tableName, java.lang.String fieldName)  
java.lang.String[] getKeys(java.lang.String tableName)  
java.lang.String[] getKeysType(java.lang.String tableName)//主键类型
 java.lang.String getSchema()  
Table getTable(java.lang.String tableName)  
java.util.Map<java.lang.String,Table> getTableMap()  
java.lang.String[] getTableNames()  
static DbCenter instance(java.sql.Connection con, int connectionType)  
boolean isExistField(java.lang.String tableName, java.lang.String fieldName)  
boolean isExistKeyField(java.lang.String tableName, java.lang.String fieldName)  
boolean isExistTable(java.lang.String tableName)  
boolean isFieldNullable(java.lang.String tableName, java.lang.String fieldName)  
boolean isFieldPrimarykey(java.lang.String tableName, java.lang.String fieldName)  

以下是一个查询数据库结构信息的范例
public static void queryDb() throws SQLException {
        ProcessVO pvo = new ProcessVO();
        try {
            String s0 = pvo.queryDbInfo();//查询完整的数据库结构信息
            System.out.println(s0);
            String s1 = pvo.queryTableInfo("news");//查询资讯表news的结构信息
            System.out.println(s1);
            Db db=pvo.getDb();
            String[] tableNames=db.getTableNames();//查询数据库中包含的所有的表的名称
            Table table=db.getTable("news");//查询表的名称为"news"的Table对象
            Map<String,Field> fileds=table.getFieldMap();//查询一个表中包含的字段的集合
            Field field=fileds.get("title");//查询字段名是"title"的Field字段对象
            
        } finally {
            pvo.closeCon();
        }
    }

更多信息,可以参与源代码和帮助文档



你可能感兴趣的:(查询数据库结构信息)