我目前在我的Java程序中有一个方法,使用JDBC检查MySQL数据库中是否存在一个特定的表。我曾经出现过一个逻辑错误,DatabaseMetaData.getTables()方法从不同的数据库中返回一个同名表,现在我已经解决了这个问题,在语句中指定目录,如下图所示(table代表我所要找的表名)。
ResultSet tables = connectionToDatabase().getMetaData().getTables("snakeandladder", null, table, null);
但是,我研究了一下,看到很多人推荐使用Show Tables来代替,但实际上并没有解释为什么要使用Show tables而不是上面的。谁能给我解释一下使用上述语句的局限性,以及为什么Show Tables会是一个更好的选择?
DatabaseMetaData.getTables()的可移植性更强,大多数数据库(不仅仅是MySQL)应该能够通过定义的API提供信息。
另一方面,使用MySQL的特定查询 "show tables; "可能弊大于利。
你引入了一个可以被攻击者利用的查询字符串,而且代码现在包含了一个静态编译的查询字符串。
如果数据库提供者发生变化,那么代码将不得不更新(同样是可移植性)。