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. 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

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

JDBC如何判断数据库的表是否存在相关推荐

  1. SqlServer判断数据库、表、字段、存储过程、函数是否存在

    原文:SqlServer判断数据库.表.字段.存储过程.函数是否存在 判断数据库是否存在 if exists (select * from sys.databases where name = '数据 ...

  2. koa mysql 存储过程_Sql中判断数据库、表、临时表、存储过程和列是否存在...

    --判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME = '库名') PRINT 'exists ' else PR ...

  3. mysql 查询视图是否存在_sql server判断数据库、表、列、视图是否存在

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否 ...

  4. SqlServer判断数据库、表、存储过程、函数是否存在

    假设场景是: 需要给一个脚本给客户更新, 这个对象可能存在或不存在 -- 更新存储过程 USE [数据库名] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ...

  5. SQL语句判断数据库、表、字段是否存在

    --判断[TestDB]是否存在 if exists(select 1 from master..sysdatabases where name='TestDB')     print 'TestDB ...

  6. 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录

    如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录

  7. SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

    – SQL SERVER 判断是否存在某个触发器.储存过程 – 判断储存过程,如果存在则删除 IF (EXISTS(SELECT * FROM sysobjects WHERE name='proce ...

  8. sql server 判断是否存在数据库,表,列,视图

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名')    drop database [数据库名] 2 判断 ...

  9. SQL语句判断指定的数据库、表、字段、存储过程是否存在

    SQL语句判断指定的数据库.表.字段.存储过程是否存在 直接上代码,对大家有用就好! 代码 --判断[TestDB]是否存在 if exists(select 1 from master..sysda ...

最新文章

  1. 基克的聚合 机器人_新版本辅助装大改 基克的聚合不能错过
  2. ASP.NET设置焦点到输入框
  3. php 页面加载进度条,HTML5/CSS3 网页加载进度条的实现,下载进度条等经典案例
  4. java mysql order by,java-使用LIMIT和MySQL进行ORDER BY
  5. BatchNorm中forward未被调用原因
  6. Tkinter编写Mac应用(-)
  7. mac 2k显示器字体发虚_精准色彩体验-优派VP2785-2K
  8. 牛客网编程题——字符串_确定两串乱序同构
  9. java字符串怎么拼接字符串_Java中String使用+ 拼接字符串的原理是什么?
  10. 【OpenCV学习笔记】【函数学习】三(cvGetCaptureProperty函数)
  11. hdu1274 展开字符串
  12. ★★★★★手把手教你如何利用凤凰实现破 解后台权限以及升级固件(刷机)★★★★★...
  13. 如何在vs2017编写java程序_VS2017开发Linux平台上的程序
  14. android 修复工具,安卓手机修复工具下载 牛学长安卓手机修复工具(安卓手机修复助手) v2.4.0.15 官方免费安装版 下载-脚本之家...
  15. python中导入win32com.client出错问题
  16. ansys中使用模态叠加法进行谐响应分析与模态分析的关系
  17. juniper服务器连接显示都是网关,Juniper防火墙,LVS DR mode 与 HTTP keepalive 丢包问题追查...
  18. JSP项目进度管理系统myeclipse开发sql数据库BS模式java编程网页结构
  19. 无域控AlwaysOn实战教学 (一)
  20. AISHELL-1 语音识别实战

热门文章

  1. 公布几个流氓软件分析报告——哇哇资讯精灵
  2. 伤感网络验证系统_网络攻防演练中弱密码安全治理的几点建议
  3. [网址链接]格林童话故事的原始素材
  4. 让C#语言充当自身脚本!——.NET中的动态编译
  5. C#多线程学习(三) 生产者和消费者 2
  6. C#图片处理之:图片缩放和剪裁
  7. mongodb 字符串转bson_MongoDB之bson的介绍
  8. mysql数据库创建交叉表查询_sql – 我需要知道如何创建交叉表查询
  9. Vertica数据库系列:这几天踩过时间函数的坑
  10. Android点赞头像列表