`
xuedong
  • 浏览: 290661 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC如何判断数据库的表是否存在

    博客分类:
  • java
阅读更多

实现原理:主要是利用DatabaseMetaData.getTables(...)这个方法实现的,但是每一种数据库还存在一些差异,具体见下面详解。

 

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

 

Java代码 复制代码 收藏代码
 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代码 复制代码 收藏代码
		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

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中运行结果:

 

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

 

 

 

 

转载请注明来自:Michael's blog @ http://sjsky.iteye.com

 

 

分享到:
评论

相关推荐

    JDBC链接数据库代码

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种类型数据库交互的一组接口和类。JDBC使得Java开发者能够编写可移植的代码来访问和处理数据库中的数据。本篇文章将深入探讨如何使用JDBC连接数据库,...

    JAVA-JDBC连接数据库(查询_添加_修改_删除)

    JAVA-JDBC连接数据库(查询_添加_修改_删除)

    jdbc连接数据库简单例子

    JDBC(Java Database Connectivity)是Java编程语言中用于与各种关系型数据库进行交互的一种标准接口。这个接口由一组Java类和接口组成,允许开发者通过SQL语句执行数据库操作,并且能够在不同的平台上运行,具备...

    Java jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...

    java_jdbc数据库连接池总结

    使用 JDBC 访问数据库存在一些问题,如每一次 Web 请求都要建立一次数据库连接,建立连接是一个费时的活动,每次都得花费 0.05s~1s 的时间,而且系统还要分配内存资源。 数据库连接池(Connection Pool)的工作...

    常用jdbc数据库连接jar包,数据库连接池jar包

    本资源集合了常用的JDBC数据库连接jar包,以及一些知名的数据库连接池实现,如dbcp和c3p0,这对于开发人员来说是非常宝贵的资源。 首先,让我们了解一下JDBC。JDBC提供了一套标准的API,包括接口和类,使得开发者...

    基于JDBC的数据库访问技术的研究.pptx

    基于JDBC的数据库访问技术的研究 本篇研究报告对基于JDBC的数据库访问技术进行了深入的探讨,涵盖了JDBC技术的发展历程、技术实现、优点和不足等多方面的内容。 一、JDBC技术的发展历程 Java Database ...

    sqliteJDBC,连接数据库

    注意,SQLite数据库的URL通常以`jdbc:sqlite:`开头,后面接上数据库文件的路径(如果文件不存在,会自动创建)。 ```java Connection conn = DriverManager.getConnection("jdbc:sqlite:/path/to/your/database.db...

    JDBC操作数据库辅助类

    在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一套标准API。JDBC操作数据库辅助类通常是为了简化数据库操作,提高代码的可读性和可维护性而设计的。这些辅助类包括资源类、会话类...

    基于JDBC的数据库连接池技术研究与应用

    然而,Java应用程序通过JDBC直接访问数据库的方式存在一些问题,如频繁建立和关闭连接,可能导致系统资源的浪费和性能瓶颈。 JDBC是Java语言与数据库交互的接口,提供了面向开发人员的API和面向底层的JDBC驱动程序...

    jdbc实现数据库操作

    数据库连接池是在应用启动时预创建一定数量的数据库连接,这些连接被存储在一个池中,当应用需要连接数据库时,可以从池中获取一个已存在的连接,而不是每次都去创建新的连接。这种方式可以有效减少数据库连接创建和...

    Android使用JDBC连接本地数据库

    总结来说,尽管在Android上使用JDBC存在一些挑战,但通过选择合适的第三方库和遵循最佳实践,我们可以成功地实现Android应用程序与本地数据库的连接。同时,了解其潜在风险和替代方案对于做出明智的开发决策至关重要...

    java JDBC与数据库访问PPT课件.pptx

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一种API。它提供了标准的接口,使得Java开发者可以使用相同的代码访问不同的数据库管理系统(DBMS)。本课件主要介绍了数据库的...

    Java语言程序设计JDBC与数据库访问PPT课件.pptx

    【Java语言程序设计JDBC与数据库访问】是Java开发中重要的环节,主要涉及如何通过Java程序与数据库进行交互。在数据库基础知识部分,我们首先了解到数据管理经历了从文件管理到数据库管理的两个阶段。文件管理阶段,...

    传智播客JDBC_完成对数据库的CRUD操作.rar

    在IT行业中,JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了全套的API供开发者使用。本教程“传智播客JDBC_完成对数据库的CRUD操作”主要涵盖了如何利用...

    Java比较两个mysql数据库表结构的差异

    这个主要比对的是表,表中列的基本信息比较,比较是否存在是否类型一致等,对于函数存储过程则只是简单的比较是否存在,内容没有比对。如果谁感兴趣可以完善该比对功能。 JAVA代码,不复杂,看看就明白,都是采用...

    mysql-jdbc连接数据库-错误提示.docx

    * 解决方案:检查数据表是否已经创建,确保数据表存在于指定的数据库中。 四、 环境变量配置错误 * 错误提示:无法找到JDK或JRE的安装路径 * 解决方案:正确安装JDK,并配置环境变量,确保JDK的安装路径正确。 五...

    JDBC连接数据库步骤流程共2页.pdf.zip

    **JDBC连接数据库步骤流程详解** Java Database Connectivity (JDBC) 是Java编程语言中用于与关系型数据库交互的一组接口和类。它是由Java SE API的一部分,允许Java开发者执行SQL语句并处理结果。了解JDBC连接...

    JDBC连接数据库mysql驱动

    Java Database Connectivity (JDBC) 是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems(现为Oracle公司)开发,是Java平台的一部分,允许Java开发者执行SQL语句并处理结果。JDBC提供...

    (达梦数据库JDBC驱动包)Dm7JdbcDriver17.jar

    JDBC(java database connectivity)驱动程序是对JDBC规范完整的实现,它的存在在JAVA程序与数据库系统之间建立了一条通信的渠道。Dm7JdbcDriver17.jar是连接DM7数据库(武汉达梦数据库)的JDBC驱动包。

Global site tag (gtag.js) - Google Analytics