3

我有以下代码 -

getNamedParameterJdbcTemplate().queryForList("SELECT id FROM emp WHERE age=:age", 
new MapSqlParameterSource("age", 19))

如何在参数替换后将最终查询发送到 Mysql?有没有像 -

getNamedParameterJdbcTemplate(query, paramSource).gimmeTheFinalQuery()
4

4 回答 4

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);

输出 -

从年龄 = 19 的雇员中选择 id

这可以包装成一个实用程序类 -

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))
于 2012-12-27T09:21:41.573 回答
2

我认为 Spring 中没有类似的 API,原因是最低级别可能甚至在 Spring 级别都不可用。但是,您可能想看看这个其他问题的答案Simplest way to collect all SQL sent outP6Spy将通过挂钩到dataSourcebean 来很好地完成这项工作。

于 2012-12-27T08:28:24.257 回答
0

如果这只是为了调试,您还可以要求 MySQL 将所有查询记录到日志文件中。

> SET GLOBAL general_log_file = '/var/log/mysql_general.log';
> SET GLOBAL general_log = 1;

http://dev.mysql.com/doc/refman/5.5/en/query-log.html

于 2012-12-27T08:40:12.850 回答
0

如果您使用 Hibernate 来显示 SQL 语句,请使用以下 Hibernate 属性:

<prop key="hibernate.show_sql">true</prop>

如果您也使用 log4j,那么您可以通过在 log4j 属性文件中设置以下内容来设置它以显示与语句绑定的参数值:log4j.logger.org.hibernate.type=trace

于 2012-12-27T09:26:47.747 回答