1. private void resetSql2Invocation(Invocation invocation, String sql) throws SQLException {
    2. final Object[] args = invocation.getArgs();
    3. MappedStatement statement = (MappedStatement) args[0];
    4. Object parameterObject = args[1];
    5. BoundSql boundSql = statement.getBoundSql(parameterObject);
    6. MappedStatement newStatement = newMappedStatement(statement, new BoundSqlSqlSource(boundSql));
    7. MetaObject msObject = MetaObject.forObject(newStatement, new DefaultObjectFactory(), new DefaultObjectWrapperFactory(), new DefaultReflectorFactory());
    8. msObject.setValue("sqlSource.boundSql.sql", sql);
    9. args[0] = newStatement;
    10. }
    11. private MappedStatement newMappedStatement(MappedStatement ms, SqlSource newSqlSource) {
    12. MappedStatement.Builder builder =
    13. new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());
    14. builder.resource(ms.getResource());
    15. builder.fetchSize(ms.getFetchSize());
    16. builder.statementType(ms.getStatementType());
    17. builder.keyGenerator(ms.getKeyGenerator());
    18. if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) {
    19. StringBuilder keyProperties = new StringBuilder();
    20. for (String keyProperty : ms.getKeyProperties()) {
    21. keyProperties.append(keyProperty).append(",");
    22. }
    23. keyProperties.delete(keyProperties.length() - 1, keyProperties.length());
    24. builder.keyProperty(keyProperties.toString());
    25. }
    26. builder.timeout(ms.getTimeout());
    27. builder.parameterMap(ms.getParameterMap());
    28. builder.resultMaps(ms.getResultMaps());
    29. builder.resultSetType(ms.getResultSetType());
    30. builder.cache(ms.getCache());
    31. builder.flushCacheRequired(ms.isFlushCacheRequired());
    32. builder.useCache(ms.isUseCache());
    33. return builder.build();
    34. }
    35. // 定义一个内部辅助类,作用是包装sql
    36. class BoundSqlSqlSource implements SqlSource {
    37. private BoundSql boundSql;
    38. public BoundSqlSqlSource(BoundSql boundSql) {
    39. this.boundSql = boundSql;
    40. }
    41. @Override
    42. public BoundSql getBoundSql(Object parameterObject) {
    43. return boundSql;
    44. }
    45. }