开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第45天,点击查看活动详情
MyBatis的scripting包
我们在xml中编写的不只是SQL,还包含了一系列的标签,还有预编译的占位符。scripting包就是用来解析和处理这些标签和占位符,最终才可以生成发送给数据库的SQL语句。
在MyBatis中可以使用ognl表达式获取对象中对应字段的值,也是scripting包做的支持。
LanguageDriver类
LanguageDriver为语言驱动类的接口,通过其源码可以看出,它一共定义了三个方法。其中包含两个createSqlSource方法。如下所示。
LanguageDriver接口默认有两个实现,分别是XMLLanguageDriver和RawLanguageDriver。
- XMLLanguageDriver用于处理xml中编写的SQL语句,将带xml标签转换为SqlSource类
- RawLanguageDriver只是在XMLLanguageDriver上做了一下裁剪
SQL节点及其解析
MyBatis 支持动态SQL。但是数据库本身并不认识这些XML节点,所以MyBatis 要先对这些节点进行处理后再交给数据库执行。这些节点在MyBatis 中被定义为SqlNode。SqlNode是一个接口,接口中只定义了一个 apply方法。该方法负责完成节点自身的解析,并将解析结果合并到输入参数提供的上下文环境中。
MyBatis 的 SQL 语句中支持许多种类的节点,如 if、where、foreach 等,它们都是SqlNode的子类。
SqlSource类
语言驱动类完成的主要工作就是生成SqlSource,在LanguageDriver的三个方法中,有两个方法是用来生成 SqlSource 的。而 SqlSource 子类的转化工作也主要在scripting包中完成。SqlSource有四个实现类,如下。
- DynamicSqlSource:动态 SQL语句。动态SQL是指含有动态 SQL节点(如if节点)或者含有“${}”占位符的语句。
- RawSqlSource:原生 SQL语句。指非动态语句,语句中可能含有“#{}”占位符,但不含有动态 SQL节点,也不含有“${}”占位符。
- StaticSqlSource:静态语句。语句中可能含有“?”,可以直接提交给数据库执行。
- ProviderSqlSource:上面的几种都是通过 XML 文件获取的 SQL 语句,而ProviderSqlSource是通过注解映射的形式获取的 SQL语句。
SqlSource是对sql来源的描述,保存了原始的信息,通过传入实参就可以生成具体的SQL语句。