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
----------------------------- 分 ------------------------------ 隔 ------------------------------ 线 ------------------------------
分享到:
相关推荐
JAVA-JDBC连接数据库(查询_添加_修改_删除)
JDBC(java database connectivity)驱动程序是对JDBC规范完整的实现,它的存在在JAVA程序与数据库系统之间建立了一条通信的渠道。Dm7JdbcDriver17.jar是连接DM7数据库(武汉达梦数据库)的JDBC驱动包。
这个主要比对的是表,表中列的基本信息比较,比较是否存在是否类型一致等,对于函数存储过程则只是简单的比较是否存在,内容没有比对。如果谁感兴趣可以完善该比对功能。 JAVA代码,不复杂,看看就明白,都是采用...
三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。 1、在客户端软件开发中使用Thin驱动程序 在开发Java软件方面,Oracle...
文章简单介绍了JDBC数据库连接原理和数据库连接池工作原理,结合其原理和Java应用系统存在的问题,提出基于JDBC的数据库连接池实现连接及语句分享的实现方案,其目的是在连接数不断增加的情况下,提高应用系统对用户请求...
首先是要保证需要的类都存在。 上传这个的原因,是因为我在用phpmyAdmin管理mySQL数据库的时候,碰到了很多错误。开始以为是phpmyAdmin的配置问题,或者Resin支持php的问题,结果最后是因为没有JDBC驱动。真的狠抓况...
本工具用于检测java WEB代码中数据库连接是否存在未关闭的数据库连接,使用时仅需运行一下相关的 应用,如果有连接未释放,就会在tomcat中显示出未关闭连接所在位置。未关闭的数据库连接对于 系统并发量有巨大影响。...
这个主要比对的是表,表中列的基本信息比较,比较是否存在是否类型一致等,对于函数存储过程则只是简单的比较是否存在,内容没有比对。如果谁感兴趣可以完善该比对功能。 JAVA代码,不复杂,看看就明白,都是采用...
JDBC数据库操作乱码非主流解决方案---JDBC连接驱动代理 以驱动的方式提供给使用方,在底层实现连接的代理管理功能,向使用者隐藏 实现过程以及无缝的过渡 你需要了解下列参数: proxy.driver= (必须)实际要连接...
本项目为一个简单的JDBC项目,包括:MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务 新建一个ProductManager的项目,实现利用ORM思想和三层架构以下功能: t_product...
JDBC作为一种数据库访问技术,具有简单易用的优点。但使用这种模式进行Web应用 程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,...
JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统, 这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。 总结: JDBC本身是java连接数据库...
有的时候不知道自己的数据库连接是否存在问题的时候,可以用一小段代码进行测试下。这个测试代码较少,主要就是测试数据库的连接。如果输出“连接成功”说明没问题(注:这是连接sql server 数据库的代码,连接前先...
在实际JDBC的使用中,存在着大量的重复代码:例如连接数据库、关闭数据库等这些操作!! 急需把传统的JDBC代码进行重构,抽象出一个通用的JDBC工具类!以后连接任何数据库,操作任何表都可以使用这个工具类来简化开发...
关于Universe和IDT链接数据库的JDBC配置
数据库采用Sqlite3,需要在数据库操作对象(com.leaf.dao.LeafDao):main方法中,以Java Application执行initDB方法,实现数据库、数据表创建。 在登陆过程中,servlet接收用户名密码,检查数据库中是否存在,登陆...
jdbc工具类,其中包含的方法有:数据库动态获取驱动,动态切换mysql与oracle,获取链接,resultSet转list,jdbc读取数据库表结构信息,判断数据库是否存在该表等内容
自己封装的JDBC,支持增、删、改、查和判断主键是否存在等基本功能。刚写好,与大家共享
sun公司已经提供了jdbc-odbc的默认实现,在jre\lib\rt.jar包里,找到对应的路径(sun/jdbc/odbc),就可看到JdbcOdbcDriver.class这个我们要加载的类,其他类也是实现了jdbc API的各个接口的具体类(mysql等存在于...
然后使用md5加密密码,可以加载驱动、获取连接、创建查询语句对象并执行,(使用jdbc执行查询数据库的操作),查询是否存在指定用户名和加密后的密码的用户记录。 如果查询到了指定的用户记录,则登录成功,跳转到...