我不明白Connection.getWarning()和Statement.getWarnings()之间的区别是什么? Connection.getWarning是否包含所有语句的警告和Statement .getWarnings的主要区别是否包含单个语句的警告?
Connection.getWarnings
返回连接级警告,而Statement.getWarnings
返回语句级警告。还有ResultSet.getWarnings
,其中(惊讶)返回结果集级警告。换句话说,如果在Connection
上调用的方法产生警告,则在连接上添加它,对于在语句上调用Statement
的方法,以及在结果集上调用ResultSet
的方法。
一般情况下,不应在Statement
上报告由Connection
发出的警告,并且不应在ResultSet
上报告对Statement
的警告。例如,参见Statement.getWarnings()
,其中说:
注意:如果您正在处理
ResultSet
对象,那么与该ResultSet
对象上的读取相关联的任何警告都将链接在其上,而不是链接到生成它的Statement
对象上。
注意:此警告链仅涵盖
ResultSet
方法引起的警告。由Statement
方法引起的任何警告(例如读取OUT参数)都将链接在Statement
对象上。
JDBC规范在警告方面不是很详细,它只是说(JDBC 4.3,第8.2节SQLWarning):
当方法生成
SQLWarning
对象时,不会通知调用方已发生数据访问警告。必须在适当的对象上调用方法getWarnings
以检索SQLWarning
对象。但是,在某些情况下可能会抛出DataTruncation
SQLWarning
子类,有关详细信息,请参阅第8-46页的第8.3节“DataTruncation”。如果发生多个数据访问警告,它们将链接到第一个,并且可以通过递归调用
SQLWarning.getNextWarning
方法来检索。如果链中没有警告,getNextWarning
将返回null。随后的
SQLWarning
对象将继续添加到链中,直到执行下一个语句,或者在ResultSet
对象的情况下,当光标重新定位时,此时链中的所有SQLWarning
对象都将被删除。
在8.3节DataTruncation中:
当从数据源读取数据时发生数据截断,会报告
SQLWarning
。
在第15.1.1节ResultSet
类型:
如果驱动程序不支持提供给方法
createStatement
,prepareStatement
或prepareCall
的类型,它会在创建语句的SQLWarning
对象上生成Connection
。
类似的文本可以在15.1.2 ResultSet
Concurrency和15.1.3.1确定ResultSet
可持续性中找到。
有时JDBC API文档明确提到了警告(例如Connection.setClientInfo(String, String)
和ResultSet.next()
)。
虽然JDBC没有指定,但驱动程序通常也会在Connection
上的连接期间报告警告。
Connection,Statement的getWarnings方法返回的Object类型没有区别。它的类型为SQLWarning。
但根据它所称的背景,它有所不同。