动态SQL

Language Driver

在MyBatis中,通过LanguageDriver担任Interceptor的工作,它是一个DSL解释器,如果这点你明白了,后面就很容易理解。它的主要流程如下

xml--(parser)-->AST-(apply)-->SQL

XMLLanguageDriver

在默认实现中,Mybatis首先在如下位置反序列化XML为MixedSqlNode,这里可以看作为一个S表达式

org.apache.ibatis.scripting.xmltags.XMLLanguageDriver#createSqlSource

MixedSqlNode内部含有一个SqlNode数组,通过深度遍历执行apply调用OGNL解析其中的text

org.apache.ibatis.scripting.xmltags.DynamicSqlSource#getBoundSql

其中$将被替换为字符串,而#将作为JDBC参数,供原生JDBC使用

定制LanguageDriver

当你认为XML的表达能力较弱,重复代码过多时,可以考虑对LanguageDriver进行定制

  • 开发Groovy-based的mybatis-dsl,提高表达效率
  • 开发基于其它模版引擎的dsl
  • 使用SpringEL替换原有采用Ognl的ExpressionEvaluator,这样进行<if>判断时更加简洁

但是目前研究LanguageDriver的文档并不多,后续想要提高MyBatis效率,就靠这里了