JDBC中TABLE_CAT与TABLE_CATALOG的区别及适配DBeaver的传值疑问
JDBC中
getTables()与getSchemas()的Catalog参数说明 1. TABLE_CAT和TABLE_CATALOG的区别
这两个字段本质上指代同一个概念——数据库目录(Catalog),只是JDBC API在不同方法的结果集中用了不同命名:
getTables()返回的结果集里,Catalog对应的列名是TABLE_CATgetSchemas()返回的结果集里,Catalog对应的列名是TABLE_CATALOG
在JDBC通用规范里,Catalog是数据库的顶级命名空间,多数数据库(比如MySQL、PostgreSQL)中,Catalog就对应你所说的“数据库名”;Schema则是Catalog下的子命名空间,一般对应数据库用户或自定义的逻辑分组。
2. 参数传递:数据库名该传哪里?
针对getTables()方法
方法的第一个参数catalog就是用来传入数据库名(即Catalog名)的。举个实际例子,要查询MySQL中testdb数据库的所有普通表,代码可以这么写:
ResultSet tableRs = metaData.getTables("testdb", null, "%", new String[]{"TABLE"});
这里null表示匹配所有Schema,%表示匹配所有表名,{"TABLE"}指定只返回普通表类型。
针对getSchemas()方法
无参的getSchemas()会返回当前连接下所有数据库的Schema,结果集里的TABLE_CATALOG列会显示该Schema所属的数据库名。如果要筛选特定数据库下的Schema,可以用重载方法getSchemas(String catalog, String schemaPattern),第一个参数同样传入数据库名:
ResultSet schemaRs = metaData.getSchemas("testdb", "%");
这样就能只返回testdb数据库下的所有Schema。
3. 不同数据库的适配注意
不同数据库对Catalog和Schema的实现有差异,适配时要注意:
- MySQL:Catalog直接对应数据库名,Schema默认与用户名一致,通常可以传
null忽略 - PostgreSQL:默认Catalog为
postgres,常用Schema是public,支持自定义Schema - Oracle:没有Catalog概念,Schema等同于用户名,此时
catalog参数传null即可
适配DBeaver时,核心逻辑不变:数据库名对应JDBC的Catalog参数,也就是getTables()的第一个参数,以及getSchemas()重载方法的第一个参数。
内容的提问来源于stack exchange,提问作者justin
相关产品推荐
相关产品推荐

