我正在尝试连接到html" target="_blank">数据库,运行查询并打印出查询。到目前为止,我已经完成了工作,但是我需要获取输出并将其中的特定部分分配给String
public static void main(String args[]) {
BasicConfigurator.configure();
Logger.getGlobal().setLevel(Level.INFO);
PreparedStatement preparedStatement = null;
try {
connect();
String sql = "SELECT * FROM foo WHERE ID = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
break;
}
}
//String usedSql = "query should go here";
} catch (SQLException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
disconnect();
}
}
我正在使用log4jdbc监视我的查询。
此刻,我得到如下记录的输出:
594 [main] DEBUG jdbc.foo - 1. Connection.new Connection returned java.sql.DriverManager.getConnection(DriverManager.java:664)
608 [main] DEBUG jdbc.foo - 1. PreparedStatement.new PreparedStatement returned com.example.Test.main(Test.java:63)
608 [main] DEBUG jdbc.foo - 1. Connection.prepareStatement(SELECT * FROM foo WHERE ID = ?) returned net.sf.log4jdbc.PreparedStatementSpy@7d70d1b1 com.example.Test.main(Test.java:63)
608 [main] DEBUG jdbc.foo - 1. PreparedStatement.setInt(1, 1) returned com.example.Test.main(Test.java:64)
608 [main] DEBUG jdbc.foo - 1. PreparedStatement.setMaxRows(1) returned com.example.Test.main(Test.java:65)
609 [main] DEBUG jdbc.sqlonly - com.example.Test.main(Test.java:66)
1. SELECT * FROM foo WHERE ID = 1
我想分配SELECT * FROM foo WHERE ID = 1
给usedSql
。我该怎么做呢?
通常,a
preparedStatement.toString()
将为您提供查询(包括绑定参数)。但这取决于的实际实现PreparedStatement
(例如,使用PostgreSQL隐式实现)。
您提到为您带来preparedStatement.toString()
回报net.sf.log4jdbc.PreparedStatementSpy@7d70d1b1
。我对
log4jdbc
并不熟悉,但是我似乎PreparedStatementSpy
正在包装您的实际代码PreparedStatement
。要从您的preparedStatement
尝试中获取它,例如
if(preparedStatement instanceof PreparedStatementSpy)
usedSql = ((PreparedStatementSpy) preparedStatement).getRealStatement().toString();
编辑 :因为您使用的是 Derby, 所以简单toString()
不会做。一种解决方法是使用use
PreparedStatementSpy.dumpedSql()
,它将返回 log4jdbc 用于记录的相同字符串。不幸的是,它是一种 受保护的
方法,您必须使用反射:
if (preparedStatement instanceof PreparedStatementSpy) {
Method m = PreparedStatementSpy.class.getDeclaredMethod("dumpedSql");
m.setAccessible(true);
usedSql = (String) m.invoke(preparedStatement);
}
// omitted exception handling
问题内容: 我正在为SQLException编写通用记录器,我想获取传递给PreparedStatement的参数,该怎么做?我能够得到他们的数量。 问题答案: 简短的回答:不能。 长答案:所有JDBC驱动程序都会将参数值保留在某个地方,但是没有标准的方法来获取它们。 如果要出于调试或类似目的而打印它们,则有几种选择: 创建一个传递JDBC驱动程序(使用p6spy或log4jdbc作为基础),该驱
问题内容: 我有一个带有以下方法签名的常规Java方法: 它打开一个连接,使用sql语句和可变长度数组中的参数构建一个,运行它,缓存(在中),关闭连接,然后返回缓存的结果集。 我在记录错误的方法中有异常处理。我将sql语句记录为日志的一部分,因为它对调试非常有帮助。我的问题是,记录String变量会记录带有?而不是实际值的模板语句。我想记录已执行(或尝试执行)的 实际 语句。 所以…有什么方法可以
问题内容: 在我的代码中,我正在使用。 然后,我执行该方法以填充准备好的语句的通配符。 在调用该方法并执行查询之前,我是否有办法检索(并打印出)最终查询?我只想将此用于调试目的。 问题答案: 这在JDBC API合同中没有定义,但是如果幸运的话,有问题的JDBC驱动程序可以通过调用来返回完整的SQL 。即 以我的经验,至少这样做是PostgreSQL 8.x和MySQL 5.x JDBC驱动程序。
问题内容: 我有一个带有以下方法签名的常规Java方法: 它打开一个连接,使用sql语句和可变长度数组中的参数构建一个a ,运行它,对进行缓存(在中),关闭连接,并返回缓存的结果集。 我在记录错误的方法中有异常处理。我将sql语句记录为日志的一部分,因为它对调试非常有帮助。我的问题是,记录String变量会sql用?代替实际值记录模板语句。我想记录已执行(或尝试执行)的实际语句。 所以…有没有办法
我使用的是Spring的(Spring版本4.1.4)。对于我的类“JdbcTemplate”实例,我正在将select查询作为一个准备好的语句。但是,我的查询意外地没有返回任何结果。因此,我确实需要调试我的查询,并确保查询是我期望的。 如何取回作为< code>JdbcTemplate的内部< code>PreparedStatement的一部分对数据库执行的实际SQL? 我熟悉使用预制语句的
问题内容: 我仍然很陌生,尽管在SO上看到与此类似的多个问题,但我无法重现某些OP所要求的输出。 我正在做一些相当简单的事情,我在mongo中找到了一个集合,而我要做的就是将值作为字符串返回。我将最终将这些问题推向NSQ,但这是我的首要任务。 今天输出: 我浏览了bson#m文档,并认为我正确使用了地图以增加价值。所以我认为,我的查询结果是: 但是如果ObjectIdHex(“ ID”)是值,我该