我正在为SQLException编写通用记录器,我想获取传递给PreparedStatement的参数,该怎么做?我能够得到他们的数量。
ParameterMetaData metaData = query.getParameterMetaData(); parameterCount = metaData.getParameterCount();
简短的回答:不能。
长答案:所有JDBC驱动程序都会将参数值保留在某个地方,但是没有标准的方法来获取它们。
如果要出于调试或类似目的而打印它们,则有几种选择:
创建一个传递JDBC驱动程序(使用p6spy或log4jdbc作为基础),该驱动程序保留参数的副本并提供公共API来读取它们。
使用Java Reflection API(Field.setAccessible(true)是您的朋友)来读取JDBC驱动程序的私有数据结构。那是我的首选方法。我有一个工厂委托给特定于DB的实现,该实现可以解码参数,并允许我通过读取参数getObject(int column)。
Field.setAccessible(true)
getObject(int column)
提交错误报告,并要求对异常进行改进。尤其是在告诉您出了什么问题时,Oracle真的很st。