mybatis是如何根据映射器(mapper.xml文件)生成sql语句?

mybatis是如何根据映射器(mapper.xml文件)生成sql语句?

  1. 当XMLConfigBuilder解析映射器xml文件时,会将每一个SQL语句和其配置的内容保存起来。

  2. 一般而言,在mybatis中一条SQL与它相关的配置信息是由MappedStatement、SqlSource和BoundSql等三个部分组成的。

  3. MappedStatement的作用是保存一个映射器节点(select|insert|delete|update)的内容,它是一个类,包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultMap、languageDriver等重要配置内容,同时还有一个重要的属性sqlSource。mybatis通过读取MappedStatement来获得某条SQL配置的所有信息。

  4. SqlSource是提供BoundSql对象的地方,它是一个接口,而不是实现类。它的作用是根据上下文和参数解析生成需要的SQL,例如,动态SQL采取了DynamicSqlSource配合参数进行解析后得到的。这个接口只定义了一个接口方法——getBoundSql(parameterObject),使用它就可以得到一个BoundSql对象。它有几个重要的实现类:DynamicSqlSource、ProviderSqlSource、RawSqlSource和StaticSqlSource。

  5. BoundSql是一个结果对象,也就是SqlSource通过对SQL和参数的联合解析得到的SQL和参数,它是建立SQL和参数的地方。它有三个常用的属性:sql、parameterObject、parameterMappings。

  • parameterObject为参数本身,可以传递简单对象、pojo或者map、@Param注解的参数。
  • parameterMappings是一个List,它的每一个元素都是ParameterMapping对象。该对象会描述参数,参数包括属性名称、表达式、JavaType、jdbcType、typeHandler等重要信息。
  • sql属性就是书写在映射器里面的一条被SqlSource解析后的SQL。

注:在开发mybatis插件中,一般不需要修改MappedStatement和SqlSource,只需要拿到反映最终的参数和SQL的BoundSql类的对象,从而对运行过程做出必要的修改,来满足特殊的需求。

你可能感兴趣的:(Java,mybatis,mybatis,java)