JDBC DatabaseMetaData接口

时间:2020-01-09 10:35:21  来源:igfitidea点击:

使用java.sql.DatabaseMetaData接口,我们可以获得有关所连接数据库的元数据。

Java中的DatabaseMetaData接口具有获取有关以下信息的方法

  • 数据库,例如DB产品名称和版本,DB中可用的方案。
  • JDBC驱动程序,例如驱动程序的名称和版本
  • 任何数据库架构中的表,
  • 模式中的视图
  • 存储过程和功能

如何获取DatabaseMetaData对象

我们可以通过调用Connection类的getMetaData()方法来获取DatabaseMetaData实例。

DatabaseMetaData databaseMetaData = connection.getMetaData();

使用DatabaseMetaData的数据库产品,版本和用户信息

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MetaDataInfo {
  public static void main(String[] args) {
    Connection connection = null;
    try {
      Class.forName("com.mysql.cj.jdbc.Driver");
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/theitroad", 
                        "root", "admin");
      // DBMetaData instance
      DatabaseMetaData dbMetaData = connection.getMetaData();
      // Database information
      System.out.println("DB Name - " + dbMetaData.getDatabaseProductName());
      System.out.println("DB Version - " + dbMetaData.getDatabaseProductVersion());
      System.out.println("DB Major Version - " + dbMetaData.getDatabaseMajorVersion());
      System.out.println("DB Minor Version - " + dbMetaData.getDatabaseMinorVersion());
      System.out.println("DB User - " + dbMetaData.getUserName());
      
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      if(connection != null) {
        try {
          connection.close();
        } catch (SQLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      } 
    }
  }
}

JDBC驱动程序名称,使用DatabaseMetaData的版本信息

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MetaDataInfo {
  public static void main(String[] args) {
    Connection connection = null;
    try {
      Class.forName("com.mysql.cj.jdbc.Driver");
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/theitroad", 
                        "root", "admin");
      // DBMetaData instance
      DatabaseMetaData dbMetaData = connection.getMetaData();
      // Driver information
      System.out.println("Driver Name - " + dbMetaData.getDriverName());
      System.out.println("Driver Version - " + dbMetaData.getDriverVersion());
      System.out.println("Driver Major Version - " + dbMetaData.getDriverMajorVersion());
      System.out.println("Driver Minor Version - " + dbMetaData.getDriverMinorVersion());
      System.out.println("JDBC Major Version - " + dbMetaData.getJDBCMajorVersion());
      System.out.println("JDBC Minor Version - " + dbMetaData.getJDBCMinorVersion());
      
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      if(connection != null) {
        try {
          connection.close();
        } catch (SQLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      } 
    }
  }
}

使用DatabaseMetaData列出数据库中的表

我们可以使用getTables()方法获取数据库中的表列表。

getTables(字符串目录,字符串schemaPattern,字符串tableNamePattern,字符串[]类型)

传递给此方法的参数是

  • catalog-目录名称

  • schemaPattern-模式名称模式

  • tableNamePattern-表名称模式

  • 类型-表类型的列表。典型类型为"表","视图","系统表","全局临时","局部临时","别名","同步"。

如果为这些参数中的任何一个传递值,则有助于缩小搜索范围并限制返回的表数。我们可以将所有这些参数作为null传递,以返回所有表类型。

getTables()方法返回一个ResultSet,其中每一行都包含一个表描述。该表描述由10列组成。为了获取表名,我们将必须从ResultSet中的每一行中获取第三列值。

TABLE_CAT –表目录
TABLE_SCHEM –表架构
TABLE_NAME –表名
TABLE_TYPE –表格类型
备注–桌上的解释性评论
TYPE_CAT –类型目录
TYPE_SCHEM –类型架构
TYPE_NAME –类型名称
SELF_REFERENCING_COL_NAME –类型表中指定的"标识符"列的名称
REF_GENERATION –指定如何在SELF_REFERENCING_COL_NAME中创建值。值是" SYSTEM"," USER"," DERIVED"。

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MetaDataInfo {
  public static void main(String[] args) {
    Connection connection = null;
    try {
      Class.forName("com.mysql.cj.jdbc.Driver");
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/theitroad", 
                        "root", "admin");
      // DBMetaData instance
      DatabaseMetaData dbMetaData = connection.getMetaData();
      ResultSet rs = dbMetaData.getTables(null, null, null, null);
      while (rs.next()){
       // Third column for table name
       System.out.println("Table name " + rs.getString(3));
      }
      
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      if(connection != null) {
        try {
          connection.close();
        } catch (SQLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      } 
    }
  }
}

如果只想列出表,则可以通过将表类型作为表传递来限制搜索。

String table[] = {"table"};
ResultSet rs = dbMetaData.getTables(null, null, null, table);

如果只想列出视图,则可以通过将表类型作为视图传递来限制搜索。

String table[] = {"view"};
ResultSet rs = dbMetaData.getTables(null, null, null, table);

使用DatabaseMetaData的数据库表的列

我们可以使用getColumns()方法获取特定表的列名。

getColumns(字符串目录,字符串schemaPattern,字符串tableNamePattern,字符串columnNamePattern)

传递给此方法的参数是

  • catalog-目录名称

  • schemaPattern-模式名称模式

  • tableNamePattern-表名称模式

  • columnNamePattern-列名称模式

getColumns()方法返回一个ResultSet,其中每一行都包含一个列说明。该列描述由24列组成。为了获取列名,我们将必须从ResultSet中的每一行获取第四列值。

public class MetaDataInfo {
  public static void main(String[] args) {
    Connection connection = null;
    try {
      Class.forName("com.mysql.cj.jdbc.Driver");
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/theitroad", 
                        "root", "admin");
      // DBMetaData instance
      DatabaseMetaData dbMetaData = connection.getMetaData();
      ResultSet rs = dbMetaData.getColumns(null, null, "Employee", null);
     
      while (rs.next()){
       System.out.println("Column name-" + rs.getString(4));
      }
      
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      if(connection != null) {
        try {
          connection.close();
        } catch (SQLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      } 
    }
  }
}