MyBatis 源码学习10——动态SQL实现原理(上)

一、动态SQL的使用

动态SQL:事先无法预知具体的条件,需要在运行时根据具体的情况动态地生成SQL语句。

使用MyBatis动态SQL进行条件查询的一个案例:

MyBatis 源码学习10——动态SQL实现原理(上)_第1张图片

MyBatis动态SQL相关的标签

:通过OGNL表达式判断参数内容是否为空,如果表达式结果为true,则MyBatis框架会自动拼接标签内的SQL内容,否则会对标签内的SQL片段进行忽略

:用于保证至少有一个查询条件时,才会在SQL语句中追加WHERE关键字,同时能够剔除WHERE关键字后相邻的OR和AND关键字
:这几个标签需要组合使用,类似于Java中的switch语法:注意标签和标签是互斥的,当任何一个标签满足条件时,其他标签均视为条件不成立。

:该标签用于对集合参数进行遍历,通常用于构建IN条件语句或者INSERT批量插入语句。

:这两个标签的作用和标签的作用类似,用于WHERE子句中因为不同的条件成立时导致AND或OR关键字多余,或者SET子句中出现多余的逗号问题。

二、SqlSource与BoundSql详解

MyBatis中和SQL语句有关的两个组件,即SqlSource和BoundSql

SqlSource:描述SQL资源,MyBatis可有两种配置SQL信息的方式,一种是通过@Selelect、@Insert、@Delete、@Update或者@SelectProvider、@InsertProvider、@DeleteProvider、@UpdateProvider等注解;

一种是通过XML配置文件。SqlSource就代表Java注解或者XML文件配置的SQL资源。

SqlSource接口:在这里插入图片描述

只有一个getBoundSql()方法,返回一个BoundSql实例。

BoundSql:对SQL语句及参数信息的封装,它是SqlSource解析后的结果。

SqlSource接口有4个不同的实现,分别为StaticSqlSource、DynamicSqlSource、RawSqlSource和ProviderSqlSource:

ProviderSqlSource:用于描述通过@Select、@SelectProvider等注解配置的SQL资源信息。

• DynamicSqlSource:用于描述Mapper XML文件中配置的SQL资源信息,这些SQL通常包含动态SQL配置或者${}参数占位符,需要在Mapper调用时才能确定具体的SQL语句。

• RawSqlSource:用于描述Mapper XML文件中配置的SQL资源信息,与DynamicSqlSource不同的是,这些SQL语句在解析XML配置的时候就能确定,即不包含动态SQL相关配置。

• StaticSqlSource:用于描述ProviderSqlSource、DynamicSqlSource及RawSqlSource解析后得到的静态SQL资源。

无论是Java注解还是XML文件配置的SQL信息,在Mapper调用时都会根据用户传入的参数将Mapper配置转换为StaticSqlSource类。

了解一下StaticSqlSource类的实现:
MyBatis 源码学习10——动态SQL实现原理(上)_第2张图片
StaticSqlSource类只封装了Mapper解析后的SQL内容和Mapper参数映射信息。

Executor组件与数据库交互,除了需要参数映射信息外,还需要参数信息。因此,Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的,而是与BoundSql交互。

BoundSql是对Executor组件执行SQL信息的封装,具体实现:
MyBatis 源码学习10——动态SQL实现原理(上)_第3张图片

BoundSql除了封装了Mapper解析后的SQL语句和参数映射信息外,
还封装了Mapper调用时传入的参数对象。
另外,MyBatis任意一个Mapper都有两个内置的参数,即_parameter和_databaseId。
_parameter代表整个参数,包括标签绑定的参数信息,这些参数存放在BoundSql对象的additionalParameters属性中。
_databaseId为Mapper配置中通过databaseId属性指定的数据库类型。

三、LanguageDriver详解

LanguageDriver组件:完成SQL配置信息到SqlSource对象的转换
LanguageDriver接口:

MyBatis 源码学习10——动态SQL实现原理(上)_第4张图片

一共有3个方法,
其中createParameterHandler()方法用于创建ParameterHandler对象,
另外还有两个重载的createSqlSource()方法,这两个重载的方法用于创建SqlSource对象。

LanguageDriver接口有两个实现类,分别为XMLLanguageDriverRawLanguageDriver

XMLLanguageDriver为XML语言驱动,为MyBatis提供了通过XML标签(我们常用的等标签)结合OGNL表达式语法实现动态SQL的功能。

RawLanguageDriver表示仅支持静态SQL配置,不支持动态SQL功能。

重点了解一下XMLLanguageDriver类:
MyBatis 源码学习10——动态SQL实现原理(上)_第5张图片

XMLLanguageDriver类实现了LanguageDriver接口中两个重载的createSqlSource()方法,分别用于处理XML文件和Java注解中配置的SQL信息,将SQL配置转换为SqlSource对象。

第一个重载的createSqlSource()方法用于处理XML文件中配置的SQL信息:
该方法中创建了一个XMLScriptBuilder对象,然后调用XMLScriptBuilder对象的parseScriptNode()方法将SQL资源转换为SqlSource对象。

第二个重载的createSqlSource()方法用于处理Java注解中配置的SQL信息:
MyBatis 源码学习10——动态SQL实现原理(上)_第6张图片

1.首先判断SQL配置是否以

你可能感兴趣的:(《mybatis,3,源码深度解析》,mybatis,LanguageDriver,sqlSource,boundsql)