1.简介
在本教程中,我们将研究如何使用JDBC和纯SQL检查数据库中是否存在表。
2.使用DatabaseMetaData
JDBC为我们提供了读写数据到数据库的工具。除了存储在表中的实际数据之外,我们还可以读取描述数据库的元数据。为此,我们将使用可以从JDBC连接获得DatabaseMetaData
DatabaseMetaData databaseMetaData = connection.getMetaData();
DatabaseMetaData
提供了许多有用的方法,但我们只需要一种方法: getTables
。让我们用它来打印所有可用的表:
ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] {"TABLE"});
while (resultSet.next()) {
String name = resultSet.getString("TABLE_NAME");
String schema = resultSet.getString("TABLE_SCHEM");
System.out.println(name + " on schema " + schema);
}
因为我们没有提供前三个参数,所以我们获得了所有目录和模式中的所有表。我们还可以将查询范围缩小到例如仅一个模式:
ResultSet resultSet = databaseMetaData.getTables(null, "PUBLIC", null, new String[] {"TABLE"});
3.检查表是否存在DatabaseMetaData
如果我们要检查表是否存在,则不需要遍历结果集。我们只需要检查结果集是否为空。首先创建一个“ EMPLOYEE”表:
connection.createStatement().executeUpdate("create table EMPLOYEE (id int primary key auto_increment, name VARCHAR(255))");
现在,我们可以使用元数据对象来断言刚刚创建的表确实存在:
boolean tableExists(Connection connection, String tableName) throws SQLException {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, tableName, new String[] {"TABLE"});
return resultSet.next();
}
请注意,尽管SQL不区分大小写,但getTables
方法的实现是区分大小写的。即使我们用小写字母定义一个表,它也将以大写形式存储。因此, getTables
方法将对大写的表名进行操作,因此我们需要使用“ EMPLOYEE”而不是“ employee”。
4.检查表是否存在SQL
虽然DatabaseMetaData
很方便,但我们可能需要使用纯SQL才能实现相同的目标。**为此,我们需要查看模式“ information_schema
” tables
**它是SQL-92标准的一部分,并且由大多数主要的数据库引擎实现(Oracle除外)。
让我们查询“ tables
”表并计算获取多少结果。如果表存在,我们期望一个,如果表不存在,我们期望为零:
SELECT count(*) FROM information_schema.tables
WHERE table_name = 'EMPLOYEE'
LIMIT 1;
将其与JDBC一起使用是创建一个简单的预准备语句,然后检查结果计数是否不等于零的问题:
static boolean tableExistsSQL(Connection connection, String tableName) throws SQLException {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT count(*) "
+ "FROM information_schema.tables "
+ "WHERE table_name = ?"
+ "LIMIT 1;");
preparedStatement.setString(1, tableName);
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
return resultSet.getInt(1) != 0;
}
5.结论
在本教程中,我们学习了如何在数据库中查找有关表存在的信息。我们同时使用了JDBC的DatabaseMetaData
和纯SQL。
0 评论