mybatis的动态sql的原理
mybatis框架将xml里面的sql语句构成一个一个节点,每个节点由一种SqlNode对象描述。org.apache.ibatis.scripting.xmltags包下面的以SqlNode结尾的类就是这种对象,以下是所有的SqlNode类型:
ChooseSqlNode
ForEachSqlNode
MixedSqlNode
SetSqlNode
StaticTextSqlNode
TextSqlNode
TrimSqlNode
VarDeclSqlNode
WhereSqlNode
ifSqlNode
针对父类的SqlNode接口,定义了每种SqlNode必须实现的方法,apply(DynamicContext context),这个动态上下文就是能够依次顺序执行所有SqlNode的核心类。
每一个动态sql由多个sqlNode节点构成,其根节点是MixedSqlNode,这个节点先执行apply方法,在这个apply里面,依次执行子节点的apply方法,那么在每个子节点里面,也会依次执行apply方法,这样递归的执行下去,而上下文,就是用来保存参数,构建动态sql的prepareStatement的参数,和保存最终生成sql的StringBuilder对象的。
这里好像没有使用访问者模式啊。
每当调用mapper的方法时,都会执行根节点的apply方法,拼接成包含内部包含?的sql语句,然后调用preparedStatement,然后setPrepare方法设置参数,来执行动态sql。
mybatis框架跟spring mvc类似,具有类似的处理过程。
1.对模板类中方法对象的处理,比如参数名称解析,参数实参绑定
2.通过代理方式调用实际的方法,
3.处理实际方法调用后产生的返回值