我需要获取从
NamedParameterJdbcTemplate
发送到数据库的最终 SQL 查询。
例如:
SELECT * FROM tbl WHERE name = :name;
我需要这样的东西:
SELECT * FROM tbl WHERE name ='mark';
非常感谢。
NamedParameterJdbcTemplate
的源代码,会发现所有查询都通过 getParsedSql()
方法和 NamedParameterUtils
进行解析。
SELECT * FROM tbl WHERE name = :name;
可能会被翻译成类似的内容
SELECT * FROM tbl WHERE name = ?;
参数将作为单独的对象提供,因为这就是 JDBC 的工作原理。
如果您只想检查语句,您可以添加一些断点并查看。如果您想实际获取值,您可以更改代码,使其可访问,可以通过反射或实际使用您自己的
NamedparameterJdbcTemplate
版本。
请注意,您可能不会看到您期望的内容。
NamedparameterJdbcTemplate 在幕后使用PreparedStatement。
发送到数据库引擎的是“SELECT * FROM tbl WHERE name = ?”,加上一个数据类型数组(在本例中为 1 个元素 {12})和一个数据值数组(1 个元素 {'mark'}在这种情况下)。
数据库引擎准备访问路径(您在得到解释时看到的内容),然后将句柄(通常只是一个 bigint)传递给访问路径以及下一条消息中的参数。
(编辑:我知道这个问题已经有7年了,但是当我在追逐其他东西时出现的,并且很容易回答)
这可以通过自动清理任何 SQL 来防止 SQL 欺骗,并利用数据库引擎的优化来识别最近执行过的 SQL 并重用访问路径。