`

DatabaseMetaData类的使用

    博客分类:
  • java
 
阅读更多

DatabaseMetaData类

DatabaseMetaData类是java.sql包中的类,利用它可以获取我们连接到的数据库的结构、存储等很多信息。如:

         1、数据库与用户,数据库标识符以及函数与存储过程。
         2、数据库限制。
         3、数据库支持不支持的功能。
         4、架构、编目、表、列和视图等。

        通过调用DatabaseMetaData的各种方法,程序可以动态的了解一个数据库。由于这个类中的方法非常的多那么就介绍几个常用的方法来给大家参考。

    (1) DatabaseMetaData实例的获取

        Connection conn = DriverManager.getConnection(……);
        DatabaseMetaData dbmd = Conn.getMetaData();

        创建了这个实例,就可以使用它的方法来获取数据库得信息。主要使用如下的方法:

   (2) 获得当前数据库以及驱动的信息

        dbmd.getDatabaseProductName():用以获得当前数据库是什么数据库。比如oracle,access等。返回的是字符串。
        dbmd.getDatabaseProductVersion():获得数据库的版本。返回的字符串。
        dbmd.getDriverVersion():获得驱动程序的版本。返回字符串。
        dbmd.getTypeInfo()
 :获得当前数据库的类型信息

   (3)  获得当前数据库中表的信息

        dbmd.getTables(String catalog,String schema,String tableName,String[] types),

        这个方法带有四个参数,它们表示的含义如下:
        String catalog:要获得表所在的编目。"“”"意味着没有任何编目,Null表示所有编目。

        String schema:要获得表所在的模式。"“”"意味着没有任何模式,Null表示所有模式。

        String tableName:指出要返回表名与该参数匹配的那些表,

        String types:一个指出返回何种表的数组。

        可能的数组项是:"TABLE"、"VIEW"、"SYSTEM TABLE", "GLOBAL TEMPORARY","LOCAL  TEMPORARY","ALIAS","SYSNONYM"。

        通过getTables()方法返回的结果集中的每个表都有下面是10字段的描述信息,而且只有10个。通常我们用到的也就是标红的几个字段。而且在结果集中直接使用下面字段前面的序号即可获取字段值。

        1.TABLE_CAT        (String)   => 表所在的编目(可能为空)  

        2.TABLE_SCHEM (String)   => 表所在的模式(可能为空) 

        3.TABLE_NAME    (String)   => 表的名称

        4.TABLE_TYPE     (String)    => 表的类型。

                典型的有 "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL  TEMPORARY", "ALIAS", "SYNONYM". 

        5.REMARKS          (String)       => 解释性的备注

        6.TYPE_CAT          (String)      =>编目类型(may be null) 

        7.TYPE_SCHEM   (String)      => 模式类型(may be null) 

        8.TYPE_NAME      (String)      => 类型名称(may be null) 

        9.SELF_REFERENCING_COL_NAME    (String) => name of the designated "identifier" column of a typed table (may be null) 

       10.REF_GENERATION   (String)    => specifies how values in SELF_REFERENCING_COL_NAME are created.

                   它的值有:"SYSTEM"、"USER"、"DERIVED",也可能为空。

  (4)获得某个表的列信息

        dbmd.getColumns(String catalog,String schama,String tablename,String columnPattern,

        通过getColumns()方法返回的结果集中的每一列都有下面是23个字段段的描述信息,而且只有23个。通常我们用到的也就是标红的字段。而且在结果集中直接使用下面字段前面的序号即可获取字段值。

        1.TABLE_CAT String => table catalog (may be null)

        2.TABLE_SCHEM String => table schema (may be null)

        3.TABLE_NAME String => table name (表名称)

        4.COLUMN_NAME String => column name(列名)

        5.DATA_TYPE int => SQL type from java.sql.Types(列的数据类型)

        6.TYPE_NAME String => Data source dependent type name, for a UDT the type name is fully qualified

        7.COLUMN_SIZE int => column size.

        8.BUFFER_LENGTH is not used.

        9.DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.

       10.NUM_PREC_RADIX int => Radix (typically either 10 or 2)

       11.NULLABLE int => is NULL allowed.

       12.REMARKS String => comment describing column (may be null)

       13.COLUMN_DEF String => default value for the column, (may be null)

       14.SQL_DATA_TYPE int => unused

       15.SQL_DATETIME_SUB int => unused

       16.CHAR_OCTET_LENGTH int => for char types the maximum number of bytes in the column

       17.ORDINAL_POSITION int => index of column in table (starting at 1)

       18.IS_NULLABLE String => ISO rules are used to determine the nullability for a column.

       19.SCOPE_CATLOG String => catalog of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF)

        20.SCOPE_SCHEMA String => schema of table that is the scope of a reference attribute (null if the DATA_TYPE isn't REF)

        21.SCOPE_TABLE String => table name that this the scope of a reference attribure (null if the DATA_TYPE isn't REF)

        22.SOURCE_DATA_TYPE short => source type of a distinct type or user-generated Ref type, SQL type from java.sql.Types

       23.IS_AUTOINCREMENT String => Indicates whether this column is auto incremented

  (5)获得表的关键字信息

        dbmd.getPrimaryKeys(String catalog, String schema, String table),

       通过getPrimaryKeys方法返回的结果集中的每一列都有下面是6个字段段的描述信息,而且只有6个。通常我们用到的也就是标红的字段。而且在结果集中直接使用下面字段前面的序号即可获取字段值。

       1.TABLE_CAT String => table catalog (may be null)

       2.TABLE_SCHEM String => table schema (may be null)

       3.TABLE_NAME String => table name

       4.COLUMN_NAME String => column name

       5.KEY_SEQ short => sequence number within primary key

       6.PK_NAME String => primary key name (may be null)

        这两个方法中的参数的含义和上面的介绍的是相同的。凡是pattern的都是可以用通配符匹配的。getColums()返回的是结果集,这个结果集包括了列的所有信息,类型,名称,可否为空等。getPrimaryKey()则是返回了某个表的关键字的结果集。

  (6)获取指定表的外键信息

        dbmd.getExportedKeys(String catalog, String schema, String table) 

        通过getPrimaryKeys方法返回的结果集中的每一列都有下面是11个字段段的描述信息,而且只有11个。通常我们用到的也就是标红的字段。而且在结果集中直接使用下面字段前面的序号即可获取字段值。

         1.PKTABLE_CAT String => primary key table catalog (may be null) 

         2.PKTABLE_SCHEM String => primary key table schema (may be null) 

         3.PKTABLE_NAME String => primary key table name 

         4.PKCOLUMN_NAME String => primary key column name 

         5.FKTABLE_CAT String => foreign key table catalog (may be null) being exported (may be null) 

         6.FKTABLE_SCHEM String => foreign key table schema (may be null) being exported (may be null) 

         7.FKTABLE_NAME String => foreign key table name being exported 

         8.FKCOLUMN_NAME String => foreign key column name being exported 

         9.KEY_SEQ short => sequence number within foreign key

        10.UPDATE_RULE short => What happens to foreign key when primary is updated:

        11.DELETE_RULE short => What happens to the foreign key when primary is deleted.

  (7)反向设计表

     通过getTables(),getColumns(),getPrimaryKeys()就可以完成表的反向设计了。主要步骤如下:

      1、通过getTables()获得数据库中表的信息。
      2、对于每个表使用,getColumns(),getPrimaryKeys()获得相应的列名,类型,限制条件,关键字等。
      3、通过1,2获得信息可以生成相应的建表的SQL语句。

      通过上述三步完成反向设计表的过程。

  (8)代码示例

        下面我做了一个将DataBaseMetaData与Dom4j相结合的例子来实现数据库中的表转换成xml文件,代码已通过测试

首先借助jdk 6.x自带的的Derby数据库创建一个名为DerByDB的数据库

package com.bjsxt.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JavaDBTest {
    public static void main(String[] args) {
        try {
         // load the driver
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
            System.out.println("Load the driver");
            Connection conn = null;
            Properties props = new Properties();
            props.put("user", "user1");  props.put("password", "user1");
            //create and connect the database named helloDB
            conn=DriverManager.getConnection("jdbc:derby:DerByDB;create=true", props);
            System.out.println("create and connect to DerByDB");
            conn.setAutoCommit(false);
            //创建一个学生表(student),并插入两条记录         

            Statement sm = conn.createStatement();
            sm.execute("create table student(name varchar(40) primary key, score int)");
            System.out.println("Created table student");
            sm.execute("insert into student values('jack', 86)");
            sm.execute("insert into student values('kice', 92)");
            //创建一个教师表(teacher),并插入两条记录 

            sm.execute("create table teacher(name varchar(40), age int)");
            System.out.println("Created table teacher");
            sm.execute("insert into teacher values('wang li', 47)");
            sm.execute("insert into teacher values('liu hua', 52)");
            // list the two records from student
            ResultSet rs1 = sm.executeQuery("SELECT name, score FROM student ORDER BY score");
            System.out.println("==============");
            System.out.println("name\tscore");
            while(rs1.next()) {
                StringBuilder builder = new StringBuilder(rs1.getString(1));
                builder.append("\t");
                builder.append(rs1.getInt(2));
                System.out.println(builder.toString());
            }
            rs1.close();
            // list the two records from teacher
            ResultSet rs2 = sm.executeQuery("SELECT name, age FROM teacher ORDER BY age");
            System.out.println("==============");
            System.out.println("name\tage");
            while(rs2.next()) {
                StringBuilder builder = new StringBuilder(rs2.getString(1));
                builder.append("\t");
                builder.append(rs2.getInt(2));
                System.out.println(builder.toString());
            }
            System.out.println("==============");
            rs2.close();
            sm.close();
            System.out.println("Closed resultset and statement");
            conn.commit();
            conn.close();
            System.out.println("Committed transaction and closed connection");
           
            try { // perform a clean shutdown
                DriverManager.getConnection("jdbc:derby:;shutdown=true");
            } catch (SQLException se) {
                System.out.println("Database shut down normally");
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("SimpleApp finished");
    }
}

然后利用DataBaseMetaData与Dom4j 实现Derby数据库中的表转换成xml文件,代码如下:

package com.bjsxt.jdbc;
import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class DatabaseMetaDataTest {
 public static void main(String[] args) throws Exception {
  Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
         System.out.println("Load the driver");
         Connection conn = null;
         Properties props = new Properties();
         props.put("user", "user1");  props.put("password", "user1");
         conn=DriverManager.getConnection("jdbc:derby:DerByDB;create=false", props);
         System.out.println("connect to DerByDB");
         DatabaseMetaData dbmd = conn.getMetaData();
         System.out.println("====getTables()方法====");
         ResultSet rs1 = dbmd.getTables(null, null, "STUDENT", new String[]{"TABLE"});
         while(rs1.next()) {    //其实结果集中只有一项,那就是TEACHER这个表。
         String tname=rs1.getString(3); //获取表名
         String ttype=rs1.getString(4);  //获取表类型
         Document document = DocumentHelper.createDocument(); //建立document对象 
         Element databaseElement = document.addElement("database");
         Element stuElement=databaseElement.addElement(tname);
         stuElement.addAttribute("表类型",ttype);
         try{
               OutputFormat opf=OutputFormat.createPrettyPrint();  //美化格式
               //解决中文乱码问题,在生成的xml文档声明中可以看到设置的编码。
               opf.setEncoding("gbk");   
               // 将document中的内容写入文件中
               XMLWriter writer = new XMLWriter(new FileWriter(new File("student.xml")),opf); 
               writer.write(document);
               writer.close();           
        
}catch(Exception ex){
               ex.printStackTrace();
        }
        }
        System.out.println("getTables is over");
        System.out.println("====getColumns()方法====");  

        //最后一个null表示取出所有的列
        ResultSet rs2 = dbmd.getColumns(null, null, "STUDENT", null); 
        while(rs2.next()) {                    
             String colName=rs2.getString(4);        //列名称
             int dataType = rs2.getInt("DATA_TYPE"); //数据类型
             String dt=null;
              if(dataType==Types.VARCHAR) {
                      dt="varchar";           
              }else if (dataType==Types.INTEGER) {
                      dt="int";
              }
              try {
                   SAXReader saxReader = new SAXReader();
                   Document document = saxReader.read("student.xml");            
                   Node node = document.selectSingleNode("//STUDENT");
                   Element studentElement = (Element)node;
                   studentElement.addElement(colName).setText(dt);
                   //美化格式,此时的xml文档多行书写
                   OutputFormat opf=OutputFormat.createPrettyPrint();
                   //解决中文乱码问题,在生成的xml文档声明中可以看到设置的编码。 
                   opf.setEncoding("gbk");
                   //将document中的内容写入文件中     
                   XMLWriter writer = new XMLWriter(new FileWriter("student.xml"),opf);
                   writer.write(document);
                   writer.close();             
               }catch (Exception e) {
                        e.printStackTrace();
               }
          }
         System.out.println("getColumns is over");
         System.out.println("====getPrimaryKeys()方法====");
         ResultSet rs3 =dbmd.getPrimaryKeys(null, null, "STUDENT");
         while(rs3.next()) {
         String  pname=rs3.getString(4);     //列名称
         System.out.println(pname);
          try {
                 SAXReader saxReader = new SAXReader();
                 Document document = saxReader.read("student.xml");
                 List<Node> list = document.selectNodes("//STUDENT");
                 Iterator<Node> iter=list.iterator();
                 while(iter.hasNext()){
                      Element studentElement = (Element)iter.next();
                      studentElement.addAttribute("primary", pname);
                 }                
//              Node node = document.selectSingleNode("//STUDENT");
//              Element studentElement = (Element)node;
//              studentElement.addAttribute("primary", pname);              
//              Node node = document.selectSingleNode("//STUDENT/@表类型");
//              Attribute stype = (Attribute)node;
//              stype.setValue("table");
//              Element studentElement = (Element)node;
                //美化格式,此时的xml文档多行书写
                OutputFormat opf=OutputFormat.createPrettyPrint();  
                //解决中文乱码问题,在生成的xml文档声明中可以看到设置的编码。  
                opf.setEncoding("gbk");      
                //将document中的内容写入文件中 
                XMLWriter writer = new XMLWriter(new FileWriter("student.xml"),opf); 
                writer.write(document);
                writer.close();
            }catch (Exception e) {
                e.printStackTrace();
            }         
         }
         rs1.close();
         rs2.close();
         rs3.close();
         conn.close();
         try {
             DriverManager.getConnection("jdbc:derby:;shutdown=true");
         } catch (SQLException se) {
                  System.out.println("Database shut down normally");
         }
     }
}

 

分享到:
评论

相关推荐

    java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    jdbc基础和参考

    使用类加载器(使用反射的方式) Class.forName(driverName); 2.实例化Driver Driver driver = new oracle.jdbc.driver.OracleDriver(); DriverManager.registerDriver(driver); 3.加虚拟机参数jdbc....

    metadata:oracle,mysql,sql server 元数据管理表生成

    MetaData元数据管理小工具。作用:可以自动将所有的表信息和字段信息存入元数据表中,便于统一查阅。(注释需要保证库本身已经包含了对于表和字段的注释)方式用于为数据库提供两张表。 meta_field, meta_model。表...

    数据库原理网上授课平台(二).doc

    利用DatabaseMetaData接口提供关于DBMS的描述性信息,从而使应用程序能适应每个DBMS。  b.可在现有数据库上实现。  c.提供与其它Java系统一致的界面。这说明开发人员可以采用一致的编程界面来处理数据库编程。  d...

    数据库原理网上授课平台(一).doc

    利用DatabaseMetaData接口提供关于DBMS的描述性信息,从而使应用程序能适应每个DBMS。  b.可在现有数据库上实现。  c.提供与其它Java系统一致的界面。这说明开发人员可以采用一致的编程界面来处理数据库编程。  d...

    Java数据库编程宝典2

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典4

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    疯狂JAVA讲义

    9.6.5 使用类文件代替资源文件 350 9.6.6 使用NumberFormat格式化数字 350 9.6.7 使用DateFormat格式化日期 352 9.7 本章小结 355 本章练习 355 第10章 异常处理 356 10.1 异常概述 357 10.2 异常处理机制 ...

    Java数据库编程宝典1

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典3

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Hibernate自动生成数据库表映射实体类

    DatabaseMetaData metaData = connection.getMetaData(); ResultSet result = metaData.getColumns(null, null, NameOfTable, null); String strInJava = ""; String typeInJava; while (result.next()) { ...

    schemadoc-8-handler:一个Maven插件,可以从数据库中生成基础数据库模式的图像

    schemadoc-8处理程序jdbc-8-maven-plugin的处理程序,可直接从数据库生成基础数据库模式的映像。 要查看此处理程序的实际操作示例,请查看 ,它会从嵌​... databaseMetaData 构成数据库架构的值对象。tableFilter jsql

    Python库 | py-database_connector-Orinnass-2.3.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:py-database_connector-Orinnass-2.3.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    元数据

    1.数据库元数据(DataBaseMetaData) (借助Connection获取元数据) public static void databaseMetaData() { try { Class.forName(DRIVERE); Connection connection = DriverManager.getConnection(URL, ...

    数据库工具类DatabaseUtil.java

    * 返回记录总数, 使用方法: getAllCount("SELECT count(ID) from tableName") 2004-06-09 * 可滚动的 Statement 不能执行 SELECT MAX(ID) 之类的查询语句(SQLServer 2000) * * @param sql * 需要执行的 SQL *...

    Devart Entity Developer v6.4.719 Professional破解版,支持vs2019

    Data Transfer Object 提供转换器类和Data Annotations metadata类。 适用于各种.NET ORM的可视设计器 Entity Developer可以帮助您在一个统一的界面中为各种.NET ORM设计模型。您可以在一个工具中获得对所有ORM的...

    Hibernate中文详细学习文档

    9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...

    Hibernate+中文文档

    9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...

    hibernate 体系结构与配置 参考文档(html)

    混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射...

Global site tag (gtag.js) - Google Analytics