Spring NamedParameterJdbcTemplate:获取带有参数替换的 SQL 查询结果

问题描述 投票:0回答:2

我需要获取从

NamedParameterJdbcTemplate
发送到数据库的最终 SQL 查询。

例如:

SELECT * FROM tbl WHERE name = :name;

我需要这样的东西:

SELECT * FROM tbl WHERE name ='mark';

非常感谢。

sql spring-data spring-jdbc jdbctemplate
2个回答
3
投票

快速查看

NamedParameterJdbcTemplate
的源代码,会发现所有查询都通过
getParsedSql()
方法和
NamedParameterUtils
进行解析。

SELECT * FROM tbl WHERE name = :name;

可能会被翻译成类似的内容

SELECT * FROM tbl WHERE name = ?;

参数将作为单独的对象提供,因为这就是 JDBC 的工作原理。

如果您只想检查语句,您可以添加一些断点并查看。如果您想实际获取值,您可以更改代码,使其可访问,可以通过反射或实际使用您自己的

NamedparameterJdbcTemplate
版本。

请注意,您可能不会看到您期望的内容。


0
投票

NamedparameterJdbcTemplate 在幕后使用PreparedStatement。

发送到数据库引擎的是“SELECT * FROM tbl WHERE name = ?”,加上一个数据类型数组(在本例中为 1 个元素 {12})和一个数据值数组(1 个元素 {'mark'}在这种情况下)。

数据库引擎准备访问路径(您在得到解释时看到的内容),然后将句柄(通常只是一个 bigint)传递给访问路径以及下一条消息中的参数。

(编辑:我知道这个问题已经有7年了,但是当我在追逐其他东西时出现的,并且很容易回答)

这可以通过自动清理任何 SQL 来防止 SQL 欺骗,并利用数据库引擎的优化来识别最近执行过的 SQL 并重用访问路径。

© www.soinside.com 2019 - 2024. All rights reserved.