`
sjsky
  • 浏览: 905096 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
阅读更多

   blog迁移至 :http://www.micmiu.com

 

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

 

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

 

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

 

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

 

----------------------------- 分 ------------------------------ 隔 ------------------------------ 线 ------------------------------

 

 

4
3
分享到:
评论

相关推荐

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

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

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

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

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

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

    jdbc连接数据库的方式2

    三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。  1、在客户端软件开发中使用Thin驱动程序  在开发Java软件方面,Oracle...

    基于JDBC的数据库连接池的煤矿安全监控技术体系建设

    文章简单介绍了JDBC数据库连接原理和数据库连接池工作原理,结合其原理和Java应用系统存在的问题,提出基于JDBC的数据库连接池实现连接及语句分享的实现方案,其目的是在连接数不断增加的情况下,提高应用系统对用户请求...

    Java连接mysql数据库的JDBC驱动

    首先是要保证需要的类都存在。 上传这个的原因,是因为我在用phpmyAdmin管理mySQL数据库的时候,碰到了很多错误。开始以为是phpmyAdmin的配置问题,或者Resin支持php的问题,结果最后是因为没有JDBC驱动。真的狠抓况...

    检测数据库连接是否关闭工具

    本工具用于检测java WEB代码中数据库连接是否存在未关闭的数据库连接,使用时仅需运行一下相关的 应用,如果有连接未释放,就会在tomcat中显示出未关闭连接所在位置。未关闭的数据库连接对于 系统并发量有巨大影响。...

    java比较两个mysql数据库中的表信息差异

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

    JDBC数据库操作乱码无缝过渡解决方案

    JDBC数据库操作乱码非主流解决方案---JDBC连接驱动代理 以驱动的方式提供给使用方,在底层实现连接的代理管理功能,向使用者隐藏 实现过程以及无缝的过渡 你需要了解下列参数: proxy.driver= (必须)实际要连接...

    MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务

    本项目为一个简单的JDBC项目,包括:MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务 新建一个ProductManager的项目,实现利用ORM思想和三层架构以下功能: t_product...

    Java_jdbc数据库连接池总结.doc

    JDBC作为一种数据库访问技术,具有简单易用的优点。但使用这种模式进行Web应用  程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,...

    jdbc笔记(自写)

    JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统, 这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。 ​ 总结: JDBC本身是java连接数据库...

    测试JDBC是否能正确连接sql server 数据库的jsp代码

    有的时候不知道自己的数据库连接是否存在问题的时候,可以用一小段代码进行测试下。这个测试代码较少,主要就是测试数据库的连接。如果输出“连接成功”说明没问题(注:这是连接sql server 数据库的代码,连接前先...

    JDBC专题(四)-JDBC封装工具类.docx

    在实际JDBC的使用中,存在着大量的重复代码:例如连接数据库、关闭数据库等这些操作!! 急需把传统的JDBC代码进行重构,抽象出一个通用的JDBC工具类!以后连接任何数据库,操作任何表都可以使用这个工具类来简化开发...

    关于Universe和IDT链接数据库的JDBC配置

    关于Universe和IDT链接数据库的JDBC配置

    JDBC+Servlet入门示例

    数据库采用Sqlite3,需要在数据库操作对象(com.leaf.dao.LeafDao):main方法中,以Java Application执行initDB方法,实现数据库、数据表创建。 在登陆过程中,servlet接收用户名密码,检查数据库中是否存在,登陆...

    JDBCUtils.java

    jdbc工具类,其中包含的方法有:数据库动态获取驱动,动态切换mysql与oracle,获取链接,resultSet转list,jdbc读取数据库表结构信息,判断数据库是否存在该表等内容

    java数据库jdbc的连接与增删改查的封装(我自己写的)

    自己封装的JDBC,支持增、删、改、查和判断主键是否存在等基本功能。刚写好,与大家共享

    JDBC驱动加载分析

    sun公司已经提供了jdbc-odbc的默认实现,在jre\lib\rt.jar包里,找到对应的路径(sun/jdbc/odbc),就可看到JdbcOdbcDriver.class这个我们要加载的类,其他类也是实现了jdbc API的各个接口的具体类(mysql等存在于...

    Java 登录、注册界面(md5加密、jdbc连接mysql)

    然后使用md5加密密码,可以加载驱动、获取连接、创建查询语句对象并执行,(使用jdbc执行查询数据库的操作),查询是否存在指定用户名和加密后的密码的用户记录。 如果查询到了指定的用户记录,则登录成功,跳转到...

Global site tag (gtag.js) - Google Analytics