JDBC如何判断数据库的表是否存在
zt:http://sjsky.iteye.com/blog/1119394
实现原理:主要是利用DatabaseMetaData.getTables(...)这个方法实现的,但是每一种数据库还存在一些差异,具体见下面详解。
一、getTables(...)方法说明
- ResultSet DatabaseMetaData.getTables(String catalog,
- String schemaPattern,
- String tableNamePattern,
- 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驱动源码后你就会明白其中原因了,我摘录一部分实现代码具体如下:
- 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
- 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://sjsky.iteye.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中运行结果:
TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE
null DEMO TB_MYTEST TABLE
MySQL中运行结果:
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如何判断数据库的表是否存在相关推荐
- SqlServer判断数据库、表、字段、存储过程、函数是否存在
原文:SqlServer判断数据库.表.字段.存储过程.函数是否存在 判断数据库是否存在 if exists (select * from sys.databases where name = '数据 ...
- koa mysql 存储过程_Sql中判断数据库、表、临时表、存储过程和列是否存在...
--判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME = '库名') PRINT 'exists ' else PR ...
- mysql 查询视图是否存在_sql server判断数据库、表、列、视图是否存在
1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否 ...
- SqlServer判断数据库、表、存储过程、函数是否存在
假设场景是: 需要给一个脚本给客户更新, 这个对象可能存在或不存在 -- 更新存储过程 USE [数据库名] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ...
- SQL语句判断数据库、表、字段是否存在
--判断[TestDB]是否存在 if exists(select 1 from master..sysdatabases where name='TestDB') print 'TestDB ...
- 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录
如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录
- SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数
– SQL SERVER 判断是否存在某个触发器.储存过程 – 判断储存过程,如果存在则删除 IF (EXISTS(SELECT * FROM sysobjects WHERE name='proce ...
- sql server 判断是否存在数据库,表,列,视图
1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断 ...
- SQL语句判断指定的数据库、表、字段、存储过程是否存在
SQL语句判断指定的数据库.表.字段.存储过程是否存在 直接上代码,对大家有用就好! 代码 --判断[TestDB]是否存在 if exists(select 1 from master..sysda ...
最新文章
- 基克的聚合 机器人_新版本辅助装大改 基克的聚合不能错过
- ASP.NET设置焦点到输入框
- php 页面加载进度条,HTML5/CSS3 网页加载进度条的实现,下载进度条等经典案例
- java mysql order by,java-使用LIMIT和MySQL进行ORDER BY
- BatchNorm中forward未被调用原因
- Tkinter编写Mac应用(-)
- mac 2k显示器字体发虚_精准色彩体验-优派VP2785-2K
- 牛客网编程题——字符串_确定两串乱序同构
- java字符串怎么拼接字符串_Java中String使用+ 拼接字符串的原理是什么?
- 【OpenCV学习笔记】【函数学习】三(cvGetCaptureProperty函数)
- hdu1274 展开字符串
- ★★★★★手把手教你如何利用凤凰实现破 解后台权限以及升级固件(刷机)★★★★★...
- 如何在vs2017编写java程序_VS2017开发Linux平台上的程序
- android 修复工具,安卓手机修复工具下载 牛学长安卓手机修复工具(安卓手机修复助手) v2.4.0.15 官方免费安装版 下载-脚本之家...
- python中导入win32com.client出错问题
- ansys中使用模态叠加法进行谐响应分析与模态分析的关系
- juniper服务器连接显示都是网关,Juniper防火墙,LVS DR mode 与 HTTP keepalive 丢包问题追查...
- JSP项目进度管理系统myeclipse开发sql数据库BS模式java编程网页结构
- 无域控AlwaysOn实战教学 (一)
- AISHELL-1 语音识别实战
热门文章
- 公布几个流氓软件分析报告——哇哇资讯精灵
- 伤感网络验证系统_网络攻防演练中弱密码安全治理的几点建议
- [网址链接]格林童话故事的原始素材
- 让C#语言充当自身脚本!——.NET中的动态编译
- C#多线程学习(三) 生产者和消费者 2
- C#图片处理之:图片缩放和剪裁
- mongodb 字符串转bson_MongoDB之bson的介绍
- mysql数据库创建交叉表查询_sql – 我需要知道如何创建交叉表查询
- Vertica数据库系列:这几天踩过时间函数的坑
- Android点赞头像列表