mybatis是如何根据映射器(mapper.xml文件)生成sql语句?
-
当XMLConfigBuilder解析映射器xml文件时,会将每一个SQL语句和其配置的内容保存起来。
-
一般而言,在mybatis中一条SQL与它相关的配置信息是由MappedStatement、SqlSource和BoundSql等三个部分组成的。
-
MappedStatement的作用是保存一个映射器节点(select|insert|delete|update)的内容,它是一个类,包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultMap、languageDriver等重要配置内容,同时还有一个重要的属性sqlSource。mybatis通过读取MappedStatement来获得某条SQL配置的所有信息。
-
SqlSource是提供BoundSql对象的地方,它是一个接口,而不是实现类。它的作用是根据上下文和参数解析生成需要的SQL,例如,动态SQL采取了DynamicSqlSource配合参数进行解析后得到的。这个接口只定义了一个接口方法——
getBoundSql(parameterObject)
,使用它就可以得到一个BoundSql对象。它有几个重要的实现类:DynamicSqlSource、ProviderSqlSource、RawSqlSource和StaticSqlSource。 -
BoundSql是一个结果对象,也就是SqlSource通过对SQL和参数的联合解析得到的SQL和参数,它是建立SQL和参数的地方。它有三个常用的属性:sql、parameterObject、parameterMappings。
- parameterObject为参数本身,可以传递简单对象、pojo或者map、@Param注解的参数。
- parameterMappings是一个List,它的每一个元素都是ParameterMapping对象。该对象会描述参数,参数包括属性名称、表达式、JavaType、jdbcType、typeHandler等重要信息。
- sql属性就是书写在映射器里面的一条被SqlSource解析后的SQL。