动态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效率,就靠这里了