JDBC DatabaseMetaData接口
使用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(); } } } } }