我正在使用PreparedStatement
与MySQL服务器。
示例:
String myQuery = "select id from user where name = ?";
PreparedStatement stmt = sqlConnection.prepareStatement(myQuery);
stmt.setString(1, "test");
stmt.executeQUery();
ResultSet rs = stmt.getResultSet();
如何收到即将在MySQL服务器上执行的完整SQL查询?
谢谢!
答案 0 :(得分:10)
这不是JDBC规范的强制要求,但是有几个JDBC驱动程序让toString
的{{1}}返回将要运行的查询的排序,并且MySQL的Connector / J碰巧有这种行为(或者至少几年前做过)。
PreparedStatement
答案 1 :(得分:4)
答案 2 :(得分:3)
你不能,因为Java不负责构建它。 MySQL中支持预编译语句,因此Java将实际参数化SQL(“select id from user where name =?”)直接发送到MySQL以及参数
答案 3 :(得分:3)
我可以告诉你它是什么。如果您使用的是带有Connector / J 3.1或更高版本的MySQL 4.1或更高版本,它将类似于:
PREPARE stmt FROM 'select id from user where name = ?'
SET @a = 'test'
EXECUTE stmt USING @a
这是因为MySQL支持server-side prepared statements。
(更有可能它使用二进制协议,但这段代码只是为了说明一点)
答案 4 :(得分:3)
您好我实现了以下从 PreparedStatement 获取SQL的代码。无需使用任何jar和驱动程序。
public void printSqlStatement(PreparedStatement preparedStatement, String sql) throws SQLException{
String[] sqlArrya= new String[preparedStatement.getParameterMetaData().getParameterCount()];
try {
Pattern pattern = Pattern.compile("\\?");
Matcher matcher = pattern.matcher(sql);
StringBuffer sb = new StringBuffer();
int indx = 1; // Parameter begin with index 1
while (matcher.find()) {
matcher.appendReplacement(sb,String.valueOf(sqlArrya[indx]));
}
matcher.appendTail(sb);
System.err.println("Executing Query [" + sb.toString() + "] with Database[" + "] ...");
} catch (Exception ex) {
System.err.println("Executing Query [" + sql + "] with Database[" + "] ...");
}
}
答案 5 :(得分:0)
这里所有答案的方法略有不同,
如果您熟悉Eclipse中的调试选项。您可以尝试以下方法:
将断点设置为stmt.executeQUery();
右键单击您的应用程序,说Debug As
选择Java Application
(或在您的情况下适用于哪种情况,即可能是SpringBoot App等。
执行步骤,让您获得问题中提到的代码。
如果您检查Eclipse Variables tab
中的Debug Perspective
,您会发现myQuery
,stmt
等变量(根据您的代码)
无论您认为stmt
的值是什么,都将是您需要的完整SQL查询。
此外,如果您不想继续查看此变量,可以尝试Java Logging
并在日志中打印完整SQL查询。