使用Java获取JDBC元数据对象

前言

今天遇到一个问题,有一个需求,需要先判断数据库表是否存在,不存在则创建。按照我的第一思路,写一个SQL语句查询数据库表是否存在,不存在就创建好了

如以下的:

1
2
3
4
5
6
7
// SHOW TABLES: 显示当前数据库中所有表的名称
// SHOW TABLES FROM database_name; // 查询xx数据库下所有表名
SHOW TABLES LIKE 'tablename';


// 查询数据库所有表名:
SELECT * FROM information_schema.tables WHERE table_schema ='database_name' AND table_name = 'tablename';

然后发现了一个方法,如下:

1
2
3
4
5
6
7
8
9
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
DatabaseMetaData databaseMetaData = conn.getMetaData();
ResultSet resultSet = databaseMetaData.getTables(null, null, "tablename", null);
if (resultSet.next()) {
System.out.println("table exist!");
} else {
System.out.println("table not exist");
}

不使用SQL就可以查询到,那不是更方便吗。于是我就去了解了一下DatabaseMetaData这个类。

DatabaseMetaData接口获取JDBC元数据

什么是元数据

是描述存储在数据源中的数据的数据,是关于数据的数据,其中有两种类型的数据,关于数据结构的设计和规范的结构元数据以及关于资源和自身实例信息的识别的描述性元数据

元数据通常包括数据库中每个表的名称,大小和行数,以及每个表中的列,它们的数据类型,精度等。考虑到这一点,让我们从教程开始,了解如何从任何数据源获取元数据。

获取方式

首先, 获取DatabaseMetaData的方法其实在上面的方法中已经给出了,一行代码即可

1
DatabaseMetaData databaseMetaData = conn.getMetaData();

常用方法

1
2
3
4
5
6
7
8
9
10
getTables()     	// 得到指定参数的表信息参数说明 
getColumns() // 得到指定表的列信息
getPrimaryKeys() // 获取表的主键信息
getExportedKeys() // 获取表的外键信息
getTypeInfo() // 获取此数据库支持的所有数据类型的描述
// 参数说明:
catalog: 类别名称,一般为空
schema : 数据库名
tableName :表名
columnName :列名

其他方法

例:

1
2
3
4
5
6
7
8
9
10
11
12
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("数据库已知的用户: " + databaseMetaData.getUserName());
System.out.println("数据库URL: " + databaseMetaData.getURL());
System.out.println("是否允许只读:" + databaseMetaData.isReadOnly());
System.out.println("数据库的产品名称:" + databaseMetaData.getDatabaseProductName());
System.out.println("数据库的版本:" + databaseMetaData.getDatabaseProductVersion());
System.out.println("驱动程序的名称:" + databaseMetaData.getDriverName());
System.out.println("驱动程序的版本:" + databaseMetaData.getDriverVersion());
System.out.println("数据库的系统函数的逗号分隔列表: " + databaseMetaData.getSystemFunctions());
System.out.println("数据库的时间和日期函数的逗号分隔列表: " + databaseMetaData.getTimeDateFunctions());
System.out.println("数据库的字符串函数的逗号分隔列表: " + databaseMetaData.getStringFunctions());
System.out.println("数据库供应商用于 'schema' 的首选术语: " + databaseMetaData.getSchemaTerm());

显示:

总结

关于这个接口,我在开发过程中并没有真正用到过。不过这个接口的强大是毋庸置疑的,很多数据都可以通过其获取。但是据说对于JDBC元数据的操作非常消耗性能,应尽量避免使用。当然咯,具体的事情具体再看吧

参考:

Interface DatabaseMetaData

JDBC Tutorial: Extracting Database Metadata via JDBC Driver

JDBC DatabaseMetaData Example

JDBC元数据操作(一)– DatabaseMetaData接口详解