从 Derby 获取 PreparedStatement 查询
get PreparedStatement query from Derby
我正在尝试连接到数据库,运行 查询并打印出查询。到目前为止,我所做的工作但我需要获取输出并将其特定部分分配给 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
。我该怎么做呢?
通常 preparedStatement.toString()
会给你查询(包括绑定参数)。但这取决于 PreparedStatement
的实际实现(例如,使用 PostgreSQL impl 这可行)。
你提到 preparedStatement.toString()
returns net.sf.log4jdbc.PreparedStatementSpy@7d70d1b1
适合你。我不熟悉 log4jdbc,但我看起来 PreparedStatementSpy
正在包装您的实际 PreparedStatement
。要从您的 preparedStatement
获取它,请尝试
if(preparedStatement instanceof PreparedStatementSpy)
usedSql = ((PreparedStatementSpy) preparedStatement).getRealStatement().toString();
Edit:由于您使用的是 Derby,所以简单的 toString()
是行不通的。解决此问题的一种方法是使用 PreparedStatementSpy.dumpedSql()
,这将 return 与 log4jdbc 用于日志记录的字符串相同。不幸的是,它是一个 protected 方法,你必须使用反射:
if (preparedStatement instanceof PreparedStatementSpy) {
Method m = PreparedStatementSpy.class.getDeclaredMethod("dumpedSql");
m.setAccessible(true);
usedSql = (String) m.invoke(preparedStatement);
}
// omitted exception handling
我正在尝试连接到数据库,运行 查询并打印出查询。到目前为止,我所做的工作但我需要获取输出并将其特定部分分配给 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
。我该怎么做呢?
通常 preparedStatement.toString()
会给你查询(包括绑定参数)。但这取决于 PreparedStatement
的实际实现(例如,使用 PostgreSQL impl 这可行)。
你提到 preparedStatement.toString()
returns net.sf.log4jdbc.PreparedStatementSpy@7d70d1b1
适合你。我不熟悉 log4jdbc,但我看起来 PreparedStatementSpy
正在包装您的实际 PreparedStatement
。要从您的 preparedStatement
获取它,请尝试
if(preparedStatement instanceof PreparedStatementSpy)
usedSql = ((PreparedStatementSpy) preparedStatement).getRealStatement().toString();
Edit:由于您使用的是 Derby,所以简单的 toString()
是行不通的。解决此问题的一种方法是使用 PreparedStatementSpy.dumpedSql()
,这将 return 与 log4jdbc 用于日志记录的字符串相同。不幸的是,它是一个 protected 方法,你必须使用反射:
if (preparedStatement instanceof PreparedStatementSpy) {
Method m = PreparedStatementSpy.class.getDeclaredMethod("dumpedSql");
m.setAccessible(true);
usedSql = (String) m.invoke(preparedStatement);
}
// omitted exception handling