JDBC如何判斷數據庫的表是否存在


zt:http://sjsky.iteye.com/blog/1119394

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

 

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

 

Java代碼 復制代碼  收藏代碼
  1. ResultSet DatabaseMetaData.getTables(String catalog,    
  2.                                    String schemaPattern,   
  3.                                    String tableNamePattern,    
  4.                                    String types[]) throws SQLException;  
 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驅動源碼后你就會明白其中原因了,我摘錄一部分實現代碼具體如下:

 

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.   
  3. import java.sql.Connection;   
  4. import java.sql.DatabaseMetaData;   
  5. import java.sql.DriverManager;   
  6. import java.sql.ResultSet;   
  7. import java.sql.SQLException;   
  8.   
  9. /**  
  10.  * @blog http://sjsky.iteye.com  
  11.  * @author Michael  
  12.  */  
  13. public class JdbcCheckTableExitDemo {   
  14.   
  15.     private static String url = "jdbc:mysql://localhost:3306/michaeldemo";   
  16.     private static String user = "root";   
  17.     private static String password = "";   
  18.     private static String driver = "com.mysql.jdbc.Driver";   
  19.   
  20.     // private static String url = "jdbc:oracle:thin:@localhost:1521:ORA11g";   
  21.     // private static String user = "demo";   
  22.     // private static String password = "111111";   
  23.     // private static String driver = "oracle.jdbc.driver.OracleDriver";   
  24.   
  25.     /**  
  26.      * @param args  
  27.      */  
  28.     public static void main(String[] args) {   
  29.         Connection conn = null;   
  30.         String tableName = "TB_MYTEST";   
  31.         try {   
  32.             Class.forName(driver);   
  33.             conn = DriverManager.getConnection(url, user, password);   
  34.             conn.setAutoCommit(false);   
  35.   
  36.             DatabaseMetaData meta = conn.getMetaData();   
  37.   
  38.             // 第一個參數catalog在MySQL中對應數據庫名:michaeldemo   
  39.             ResultSet rsTables = meta.getTables("michaeldemo"null, tableName,   
  40.                     new String[] { "TABLE" });   
  41.   
  42.             // 第二個參數schemaPattern在ORACLE中對應用戶名:demo   
  43.             // ResultSet rsTables = meta.getTables(null, "DEMO", tableName,   
  44.             // new String[] { "TABLE" });   
  45.   
  46.             System.out.println("getTables查詢信息如下:");   
  47.             System.out   
  48.                     .println("TABLE_CAT \t TABLE_SCHEM \t TABLE_NAME \t TABLE_TYPE");   
  49.   
  50.             while (rsTables.next()) {   
  51.                 System.out.println(rsTables.getString("TABLE_CAT") + "\t"  
  52.                         + rsTables.getString("TABLE_SCHEM") + "\t"  
  53.                         + rsTables.getString("TABLE_NAME") + "\t"  
  54.                         + rsTables.getString("TABLE_TYPE"));   
  55.             }   
  56.             rsTables.close();   
  57.         } catch (Exception e) {   
  58.             e.printStackTrace();   
  59.         } finally {   
  60.             try {   
  61.                 if (null != conn) {   
  62.                     conn.close();   
  63.                 }   
  64.             } catch (SQLException e) {   
  65.                 e.printStackTrace();   
  66.             }   
  67.         }   
  68.     }   
  69. }  

 

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM