Mybatis源码研究之BoundSql

Mybatis里难得有注释的类 BoundSql, 而且此注释出现在 3.3.1+ 版本, 在3.2.2时都还没有.

1. 概述

  1. BoundSql更像一个中转站, Mybatis在执行一次CRUD操作过程中产生的中间数据的集中点.这一点观察其内部的字段就可以了解.
  2. 内部基本没做什么处理, 只是将相应的操作调度给了内部的字段.

2. 注释

/**
 * An actual SQL String got form an {@link SqlSource} after having processed any dynamic content.
 * The SQL may have SQL placeholders "?" and an list (ordered) of an parameter mappings 
 * with the additional information for each parameter (at least the property name of the input object to read 
 * the value from). 
 * 
* Can also have additional parameters that are created by the dynamic language (for loops, bind...). */
// 其中包含sql语句(该sql语句中可能包含 ? 这样的占位符), 以及一组parameter mapping(ParameterMapping类的实例), 注意这组parameter mapping是Mybatis内部生成的(通过读取#{xx}中的内容) // 再强调一次,以上的ParameterMapping实例是在ParameterHandler接口的唯一默认实现类 DefaultParameterHandler 中被消费的.

3. 全局类字段

// 进行 #{ } 和 ${ } 替换完毕之后的结果sql, 注意每个 #{ }替换完之后就是一个 ?
private String sql; 
// 这里的parameterMappings列表参数里的item个数, 以及每个item的属性名称等等, 都是和上面的sql中的 ? 完全一一对应的.
private List parameterMappings;
// 用户传入的数据
private Object parameterObject;
private Map additionalParameters;
private MetaObject metaParameters;

4. 构造函数

public BoundSql(Configuration configuration, String sql, List parameterMappings, Object parameterObject) {
    //sql : SELECT us_code FROM xxx WHERE us_code = ? AND us_keyid IS NOT NULL
    // 到达这里的sql(即用来构建BoundSql实例的sql), 是进行 #{ } 和 ${ } 替换完毕之后的结果sql
    this.sql = sql;
    //parameterMappings : [ParameterMapping{property='username', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}]
    // 这里的parameterMappings列表参数里的item个数, 以及每个item的属性名称等等, 都是和上面的sql中的 ? 完全一一对应的.
    this.parameterMappings = parameterMappings;
    // parameterObject : 用户传入的数据
    this.parameterObject = parameterObject;

    this.additionalParameters = new HashMap();
    this.metaParameters = configuration.newMetaObject(this.additionalParameters);
}

//------------------- 对应的映射语句
SELECT
    us_code 
FROM 
    xxx
WHERE
    us_code = #{username} 
    AND us_keyid IS NOT NULL

5. SqlSource

  1. 注意SqlSource接口中的唯一方法getBoundSql,其返回值就是 BoundSql.

  2. 更多的细节请参考本人的另外一篇博客
    Mybatis源码研究之SqlSource

你可能感兴趣的:(MyBatis3)