是否有一种很酷的方法来添加Mybatis上的sql注释,如下所示。
SELECT * FROM users; /* TraceID: foo-bar-baz */
我想在对所有已执行的SQL进行分布式跟踪的上下文中添加带有TraceID / RequestID / CorrelationID的sql注释。通过此注释,可以从慢查询的注释中识别交易。
我找到了Interceptor API,但似乎无法添加commnet。
我似乎可以通过这种方式使用类似于thymeleaf-scripting的脚本。但是,我们需要在所有sql中添加sql注释...
任何建议将不胜感激。
就您而言,自定义语言驱动程序可能是一个很好的选择。
下面的实现与默认的XMLLanguageDriver
基本相同。
XMLLanguageDriver
附加的注释包含调用静态方法的OGNL表达式。此表达式在运行时求值。
要全局注册自定义语言驱动程序,您需要在配置中设置import org.apache.ibatis.builder.xml.XMLMapperEntityResolver;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.parsing.PropertyParser;
import org.apache.ibatis.parsing.XNode;
import org.apache.ibatis.parsing.XPathParser;
import org.apache.ibatis.scripting.defaults.RawSqlSource;
import org.apache.ibatis.scripting.xmltags.DynamicSqlSource;
import org.apache.ibatis.scripting.xmltags.TextSqlNode;
import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
import org.apache.ibatis.session.Configuration;
public class CommentLanguageDriver extends XMLLanguageDriver {
@Override
public SqlSource createSqlSource(Configuration configuration,
XNode script, Class<?> parameterType) {
// Append comment
script.getNode().setTextContent(
script.getNode().getTextContent() + getComment());
return super.createSqlSource(configuration, script,
parameterType);
}
@Override
public SqlSource createSqlSource(Configuration configuration,
String script, Class<?> parameterType) {
if (script.startsWith("<script>")) {
XPathParser parser = new XPathParser(script, false,
configuration.getVariables(), new XMLMapperEntityResolver());
return createSqlSource(configuration,
parser.evalNode("/script"), parameterType);
} else {
// Append comment
script = PropertyParser.parse(script + getComment(),
configuration.getVariables());
TextSqlNode textSqlNode = new TextSqlNode(script);
if (textSqlNode.isDynamic()) {
return new DynamicSqlSource(configuration, textSqlNode);
} else {
return new RawSqlSource(configuration, script, parameterType);
}
}
}
private String getComment() {
// OGNL expression invoking the static method
return " /* ${@org.slf4j.MDC@get(\"requestid\")} */";
}
}
。
defaultScriptingLanguage
如果使用的是mybatis-spring-boot-starter,请将以下行添加到application.properties。
<settings>
<setting name="defaultScriptingLanguage"
value="pkg.CommentLanguageDriver" />
</settings>