Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Derby获取PreparedStatement查询_Java_Log4j_Derby_Slf4j_Log4jdbc - Fatal编程技术网

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的想法