JDBC如何判断数据库的表是否存在 _JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JDBC如何判断数据库的表是否存在

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

 2011/11/9 8:27:07  xuedong  http://xuedong.iteye.com  我要评论(0)
  • 摘要:实现原理:主要是利用DatabaseMetaData.getTables(...)这个方法实现的,但是每一种数据库还存在一些差异,具体见下面详解。一、getTables(...)方法说明Java代码ResultSetDatabaseMetaData.getTables(Stringcatalog,StringschemaPattern,StringtableNamePattern,Stringtypes[])throwsSQLException;catalog-数据库目录名称,可设为null,
  • 标签:数据库 数据

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

?

发表评论
用户名: 匿名