Java新手疑问:getTables方法中String数组参数的作用
关于JDBC中
getTables方法String数组参数的解惑 嘿,作为曾经也在JDBC门口摸爬滚打的Java新手,太懂你对这个types数组的困惑了!我当初第一次用这个方法时,也盯着这个参数愣了半天,为啥传个数组进去却没看到它存表名?咱们一步步拆解清楚:
1. 这个String数组的核心作用:是过滤器,不是结果容器!
你完全误解了它的定位——这个数组是输入参数,用来告诉JDBC驱动你只想获取哪些类型的数据库对象,而不是用来存储返回的表名的。
数据库里的对象可不止普通表,还有视图(VIEW)、存储过程(PROCEDURE)、同义词(SYNONYM)、系统表(SYSTEM TABLE)等等不同类型。当你传入{"TABLE"}时,相当于给驱动发了个指令:“帮我只把类型为普通用户表的对象查出来”;如果传空数组{},多数驱动会默认返回所有类型的数据库对象(不同驱动可能有细微差异,但基本都会包含表)。
反过来,如果你传了驱动不识别的类型值,或者数据库里根本没有对应类型的对象,就会得到空的ResultSet,看起来像是“代码不能运行”——其实不是不能运行,只是没查到符合条件的结果而已。
2. 为什么数组里不会存储表名?
刚才说了,它是输入参数,不是输出参数。你传入的数组只是给驱动的查询条件,驱动不会修改这个数组的内容。真正的查询结果(包括表名、表类型、备注等信息)都存在返回的ResultSet里,这也是为什么你需要遍历ResultSet才能打印出表名的原因。
3. 举几个例子更直观
- 如果你传入
{"VIEW"},ResultSet里只会返回数据库中所有的视图,不会出现普通表; - 如果你传入
{"TABLE", "VIEW"},就能同时获取普通表和视图的信息; - 如果你传
null(或者有些驱动支持不传这个参数),会返回所有类型的数据库对象。
总结
这个types数组的本质就是一个精准过滤的工具,帮你避免拿到一堆你不需要的数据库对象。表名的获取确实依赖ResultSet,因为那才是驱动返回查询结果的容器,而types只是帮你缩小查询范围的过滤器而已。
内容的提问来源于stack exchange,提问作者HKM
相关产品推荐
相关产品推荐

