Java 从Derby获取PreparedStatement查询
我正在尝试连接到数据库,运行查询并打印查询。到目前为止,我所做的工作正常,但我需要获得输出并将其特定部分分配给Java 从Derby获取PreparedStatement查询,java,log4j,derby,slf4j,log4jdbc,Java,Log4j,Derby,Slf4j,Log4jdbc,我正在尝试连接到数据库,运行查询并打印查询。到目前为止,我所做的工作正常,但我需要获得输出并将其特定部分分配给字符串 public static void main(String args[]) { BasicConfigurator.configure(); Logger.getGlobal().setLevel(Level.INFO); PreparedStatement preparedStatement = null; tr
字符串
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();
}
}
我用它来监视我的询问
目前,我得到了如下记录输出:
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其中ID=1
分配给usedSql
。如何执行此操作?通常是一个preparedStatement.toString()
将为您提供查询(包括绑定参数)。但这取决于PreparedStatement
的实际实现(例如,对于PostgreSQL impl,这是可行的)
您提到preparedStatement.toString()
返回net.sf.log4jdbc。PreparedStatementSpy@7d70d1b1
为您准备。我不熟悉log4jdbc,但我看起来像是PreparedStatementSpy
正在包装实际的PreparedStatement
。要从您的preparedStatement
中获取它,请尝试以下操作
if(preparedStatement instanceof PreparedStatementSpy)
usedSql = ((PreparedStatementSpy) preparedStatement).getRealStatement().toString();
Edit:因为您使用的是Derby,所以简单的toString()
就不行了。解决这个问题的一种方法是使用PreparedStatementSpy.dumpedSql()
,它将返回log4jdbc用于日志记录的相同字符串。不幸的是,这是一种受保护的方法,您必须使用反射:
if (preparedStatement instanceof PreparedStatementSpy) {
Method m = PreparedStatementSpy.class.getDeclaredMethod("dumpedSql");
m.setAccessible(true);
usedSql = (String) m.invoke(preparedStatement);
}
// omitted exception handling
preparedStatement.toString()
给了你什么?@Berger:net.sf.log4jdbc。PreparedStatementSpy@7d70d1b1
我想这已经得到了回答不,还没有。我不知道为什么答案被标记为正确,因为我已经完成了上面的大部分工作。PreparedStatement实现了这可能是访问目标语句的另一种方式。我使用derby embedded是因为它速度最快。我不确定什么是PreparedStatementSpy
,但log4jdbc充当数据库和应用程序之间的代理,以提供有关它们之间通信的附加信息。@Hooli请参阅我的更新,以获得一个可以使用Derby
的示例,谢谢,遗憾的是Derby没有提供toString()
选项或某种替代方案,我想这是必须的。听起来您可以向Derby社区记录一个增强请求,以了解您关于改进PreparedStatement.toString的想法