实现原理:主要是利用DatabaseMetaData.getTables(...)这个方法实现的,但是每一种数据库还存在一些差异,具体见下面详解。
?
?一、getTables(...)方法说明
?
Java代码
?
ResultSet DatabaseMetaData.getTables(String catalog,
String schemaPattern,
String tableNamePattern,
String types[]) throws SQLException;
?? 各种数据库系统对Catalog和Schema的支持和实现方式是不一样的,针对具体问题需要参考具体的产品说明书,比较简单而常用的实现方式是使用数据库名作为Catalog名,使用用户名作为Schema名,具体可参见下表:
?
??? 常用数据库Catalog和Schema对照表
供应商
Catalog支持
Schema支持
Oracle
不支持
Oracle User ID
MySQL
不支持
数据库名
MS SQL Server
数据库名
对象属主名,2005版开始有变
DB2
指定数据库对象时,Catalog部分省略
Catalog属主名
Sybase
数据库名
数据库属主名
Informix
不支持
不需要
PointBase
不支持
数据库名
?
二、常用数据库举例
?
1. MySQL示例
????? url = jdbc:mysql://localhost:3306/michaeldemo
????? user = "root";
????? getTables("michaeldemo", null, tableName,new String[] { "TABLE" });
看到这有人会问,你上面的对照表中不是说过MySQL不支持Catalog,而是支持Schema,这里怎么又设置第一个参数呢?不是互相矛盾么?的确是有这个疑问,不过当你看过MySQL的JDBC驱动源码后你就会明白其中原因了,我摘录一部分实现代码具体如下:
?
Java代码
?
String sql = "SELECT TABLE_SCHEMA AS TABLE_CAT, " + "NULL AS TABLE_SCHEM, TABLE_NAME, " + "CASE WHEN TABLE_TYPE='BASE TABLE' THEN 'TABLE' WHEN TABLE_TYPE='TEMPORARY' THEN 'LOCAL_TEMPORARY' ELSE TABLE_TYPE END AS TABLE_TYPE, " + "TABLE_COMMENT AS REMARKS " + "FROM INFORMATION_SCHEMA.TABLES WHERE " + "TABLE_SCHEMA LIKE ? AND TABLE_NAME LIKE ? AND TABLE_TYPE IN (?,?,?) " + "ORDER BY TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME";
?可知参数catalog在MySQL中实际是当做Schema来用的,所以这就解释了为什么mysql中设置的却是 参数catalog的值。
?
2. Oracle示例
????? url = jdbc:oracle:thin:@localhost:1521:ORA11g
????? user = "demo";
????? getTables(null, "DEMO", tableName,new String[] { "TABLE" });
?
? 二、测试代码
?
JdbcCheckTableExitDemo.java
Java代码
?
package michael.jdbc;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @blog http://sjsky.iteye.com
* @author Michael
*/
public class JdbcCheckTableExitDemo {
private static String url = "jdbc:mysql://localhost:3306/michaeldemo";
private static String user = "root";
private static String password = "";
private static String driver = "com.mysql.jdbc.Driver";
// private static String url = "jdbc:oracle:thin:@localhost:1521:ORA11g";
// private static String user = "demo";
// private static String password = "111111";
// private static String driver = "oracle.jdbc.driver.OracleDriver";
/**
* @param args
*/
public static void main(String[] args) {
Connection conn = null;
String tableName = "TB_MYTEST";
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
DatabaseMetaData meta = conn.getMetaData();
// 第一个参数catalog在MySQL中对应数据库名:michaeldemo
ResultSet rsTables = meta.getTables("michaeldemo", null, tableName,
new String[] { "TABLE" });
// 第二个参数schemaPattern在ORACLE中对应用户名:demo
// ResultSet rsTables = meta.getTables(null, "DEMO", tableName,
// new String[] { "TABLE" });
System.out.println("getTables查询信息如下:");
System.out
.println("TABLE_CAT \t TABLE_SCHEM \t TABLE_NAME \t TABLE_TYPE");
while (rsTables.next()) {
System.out.println(rsTables.getString("TABLE_CAT") + "\t"
+ rsTables.getString("TABLE_SCHEM") + "\t"
+ rsTables.getString("TABLE_NAME") + "\t"
+ rsTables.getString("TABLE_TYPE"));
}
rsTables.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
?
?
?Oracle中运行结果:
?
getTables查询信息如下:?
? MySQL中运行结果:
getTables查询信息如下:?
?
?
?
转载请注明来自:Michael's blog @ http://sjsky.iteye.com
?