实现原理:主要是利用DatabaseMetaData.getTables(…)这个方法实现的,但是每一种数据库还存在一些差异,具体见下面详解。
一、getTables(…)方法说明
1 2 3 4 |
ResultSet DatabaseMetaData.getTables(String catalog, String schemaPattern, String tableNamePattern, String types[]) throws SQLException; |
- catalog – 数据库目录名称,可设为null,具体JDBC驱动的实现不一样在MySQL中指数据库名。
- schemaPattern – 方案名称的样式,可设为null,具体JDBC驱动的实现不一样,在Oracle中指用户名。
- tableNamePattern – 表名称的样式,可以包含匹配符比如:”TEST%”
- types – 要包括的表类型组成的列表,可设为null,表示所有的。types的常量值为:”TABLE”,”VIEW”, “SYSTEM TABLE”, “GLOBAL TEMPORARY”, “LOCAL TEMPORARY”, “ALIAS”, “SYNONYM”
各种数据库系统对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驱动源码后你就会明白其中原因了,我摘录一部分实现代码具体如下:
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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://www.micmiu.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中运行结果:
1 2 3 |
getTables查询信息如下: TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE null DEMO TB_MYTEST TABLE |
MySQL中运行结果:
1 2 3 |
getTables查询信息如下: TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE michaeldemo null TB_MYTEST TABLE |
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
本文链接地址: http://www.micmiu.com/j2ee/jdbc-tech/jdbc-check-table/
0 条评论。