我有以下代码 -
getNamedParameterJdbcTemplate().queryForList("SELECT id FROM emp WHERE age=:age",
new MapSqlParameterSource("age", 19))
如何在参数替换后将最终查询发送到Mysql?有什么像 -
getNamedParameterJdbcTemplate(query, paramSource).gimmeTheFinalQuery()
答案 0 :(得分:5)
令人难以置信的冗长但有效的解决方案是 -
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement("SELECT id FROM emp WHERE age=:age");
SqlParameterSource source = new MapSqlParameterSource("age", 19);
String finalQuery = new PreparedStatementCreatorFactory(NamedParameterUtils.substituteNamedParameters(parsedSql,
source), NamedParameterUtils.buildSqlTypeArray(parsedSql, source))
.newPreparedStatementCreator(NamedParameterUtils.buildValueArray(parsedSql, source, null))
.createPreparedStatement(getConnection()).toString();
finalQuery = finalQuery.substring(finalQuery.indexOf(":") + 1, finalQuery.length());
System.out.println(finalQuery);
输出 -
SELECT id FROM emp WHERE age = 19
这可以包含在实用程序类中 -
public class SpringQueryParser {
Connection con;
public SpringQueryParser(Connection con) {
this.con = con;
}
public String getFinalQuery(String query, SqlParameterSource source) throws SQLException {
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(query);
String finalQuery = new PreparedStatementCreatorFactory(NamedParameterUtils.substituteNamedParameters(parsedSql,
source), NamedParameterUtils.buildSqlTypeArray(parsedSql, source))
.newPreparedStatementCreator(NamedParameterUtils.buildValueArray(parsedSql, source, null))
.createPreparedStatement(con).toString();
return finalQuery.substring(finalQuery.indexOf(":") + 1, finalQuery.length()).trim();
}
}
然后方便地调用 -
new SpringQueryParser(getConnection()).getFinalQuery("SELECT id FROM emp WHERE age=:age",
new MapSqlParameterSource("age", 19))
答案 1 :(得分:2)
我认为在Spring中没有类似的API,原因是最低级别可能在Spring级别甚至不可用。但是,您可能需要查看其他问题Simplest way to collect all SQL sent out的答案。 P6Spy通过挂钩dataSource
bean可以很好地完成工作。
答案 2 :(得分:0)
如果这仅用于调试,您还可以要求MySQL将所有查询记录到日志文件中。
> SET GLOBAL general_log_file = '/var/log/mysql_general.log';
> SET GLOBAL general_log = 1;
答案 3 :(得分:0)
如果您使用Hibernate显示SQL语句,请使用以下Hibernate属性:
<prop key="hibernate.show_sql">true</prop>
如果您也使用log4j,则可以通过在log4j属性文件中设置以下内容来将其设置为显示与该语句绑定的参数值:log4j.logger.org.hibernate.type=trace