博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC如何判断数据库的表是否存在
阅读量:5135 次
发布时间:2019-06-13

本文共 4076 字,大约阅读时间需要 13 分钟。

zt:

实现原理:主要是利用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

 

转载于:https://www.cnblogs.com/rattersnake/archive/2012/03/06/2381647.html

你可能感兴趣的文章
falsk 请求钩子
查看>>
8-过滤器Filter和监听器Listener
查看>>
从头开始学JavaScript (十三)——Date类型
查看>>
spring mvc 解决csrf跨站请求攻击
查看>>
linux syslog 3
查看>>
PLSQL Developer 特点
查看>>
C#datagridview 合并数据相同的行
查看>>
LINUX环境并发服务器的三种实现模型
查看>>
理解闭包 js回收机制
查看>>
Mac - 如何安全地还原 Mac 的默认字体
查看>>
ubuntu14.04安装搜狗输入法
查看>>
4.你认为一些军事方面的软件系统采用什么样的开发模型比较合适?
查看>>
日常开发需要掌握的Maven知识
查看>>
Java数据结构和算法(四)--链表
查看>>
JIRA
查看>>
ssl介绍以及双向认证和单向认证原理
查看>>
【BZOJ2441】【中山市选2011】小W的问题(树状数组+权值线段树)
查看>>
Python的字符串
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>