1. 程式人生 > >JDBC如何判斷資料庫的表是否存在

JDBC如何判斷資料庫的表是否存在

實現原理:主要是利用DatabaseMetaData.getTables(...)這個方法實現的,但是每一種資料庫還存在一些差異,具體見下面詳解。

 一、getTables(...)方法說明

Java程式碼  收藏程式碼
  1. ResultSet DatabaseMetaData.getTables(String catalog,   
  2.                                    String schemaPattern,  
  3.                                    String tableNamePattern,   
  4.                                    String types[]) throws
     SQLException;  
  • catalog - 資料庫目錄名稱,可設為null,(具體JDBC驅動的實現不一樣在MySQL中指資料庫名)。
  • schemaPattern - 方案名稱的樣式,可設為null, 具體JDBC驅動的實現不一樣, 在Oracle中指使用者名稱)。
  • tableNamePattern - 表名稱的樣式,可以包含匹配符比如:"TEST%"
  • types - 要包括的表型別組成的列表,可設為null,表示所有的。
  • types的常量值為:
  1. "TABLE"
  2. "VIEW"
  3. "SYSTEM TABLE"
  4. "GLOBAL TEMPORARY"
  5. "LOCAL TEMPORARY"
  6. "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驅動原始碼後你就會明白其中原因了,我摘錄一部分實現程式碼具體如下:

Java程式碼  收藏程式碼
  1. String sql = "SELECT TABLE_SCHEMA AS TABLE_CAT, "  
  2.         + "NULL AS TABLE_SCHEM, TABLE_NAME, "  
  3.         + "CASE WHEN TABLE_TYPE='BASE TABLE' THEN 'TABLE' WHEN TABLE_TYPE='TEMPORARY' THEN 'LOCAL_TEMPORARY' ELSE TABLE_TYPE END AS TABLE_TYPE, "  
  4.         + "TABLE_COMMENT AS REMARKS "  
  5.         + "FROM INFORMATION_SCHEMA.TABLES WHERE "  
  6.         + "TABLE_SCHEMA LIKE ? AND TABLE_NAME LIKE ? AND TABLE_TYPE IN (?,?,?) "  
  7.         + "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程式碼  收藏程式碼
  1. package michael.jdbc;  
  2. import java.sql.Connection;  
  3. import java.sql.DatabaseMetaData;  
  4. import java.sql.DriverManager;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. /** 
  8.  * @blog http://sjsky.iteye.com 
  9.  * @author Michael 
  10.  */  
  11. public class JdbcCheckTableExitDemo {  
  12.     private static String url = "jdbc:mysql://localhost:3306/michaeldemo";  
  13.     private static String user = "root";  
  14.     private static String password = "";  
  15.     private static String driver = "com.mysql.jdbc.Driver";  
  16.     // private static String url = "jdbc:oracle:thin:@localhost:1521:ORA11g";  
  17.     // private static String user = "demo";  
  18.     // private static String password = "111111";  
  19.     // private static String driver = "oracle.jdbc.driver.OracleDriver";  
  20.     /** 
  21.      * @param args 
  22.      */  
  23.     public static void main(String[] args) {  
  24.         Connection conn = null;  
  25.         String tableName = "TB_MYTEST";  
  26.         try {  
  27.             Class.forName(driver);  
  28.             conn = DriverManager.getConnection(url, user, password);  
  29.             conn.setAutoCommit(false);  
  30.             DatabaseMetaData meta = conn.getMetaData();  
  31.             // 第一個引數catalog在MySQL中對應資料庫名:michaeldemo  
  32.             ResultSet rsTables = meta.getTables("michaeldemo"null, tableName,  
  33.                     new String[] { "TABLE" });  
  34.             // 第二個引數schemaPattern在ORACLE中對應使用者名稱:demo  
  35.             // ResultSet rsTables = meta.getTables(null, "DEMO", tableName,  
  36.             // new String[] { "TABLE" });  
  37.             System.out.println("getTables查詢資訊如下:");  
  38.             System.out  
  39.                     .println("TABLE_CAT \t TABLE_SCHEM \t TABLE_NAME \t TABLE_TYPE");  
  40.             while (rsTables.next()) {  
  41.                 System.out.println(rsTables.getString("TABLE_CAT") + "\t"  
  42.                         + rsTables.getString("TABLE_SCHEM") + "\t"  
  43.                         + rsTables.getString("TABLE_NAME") + "\t"  
  44.                         + rsTables.getString("TABLE_TYPE"));  
  45.             }  
  46.             rsTables.close();  
  47.         } catch (Exception e) {  
  48.             e.printStackTrace();  
  49.         } finally {  
  50.             try {  
  51.                 if (null != conn) {  
  52.                     conn.close();  
  53.                 }  
  54.             } catch (SQLException e) {  
  55.                 e.printStackTrace();  
  56.             }  
  57.         }  
  58.     }  
  59. }  

 Oracle中執行結果:

getTables查詢資訊如下:
TABLE_CAT      TABLE_SCHEM    TABLE_NAME     TABLE_TYPE
null                  DEMO                 TB_MYTEST         TABLE

 MySQL中執行結果:

getTables查詢資訊如下:
TABLE_CAT          TABLE_SCHEM              TABLE_NAME               TABLE_TYPE
michaeldemo             null                         TB_MYTEST                  TABLE