mybatis源码-Mapper解析之SQL 语句节点解析(一条语句对应一个MappedStatement) (4)

NodeHandler 有以下几个实现类

NodeHandler及其解析

是不是似曾相识? 就是动态 SQL 的几个节点所对应的。

在该过程之后, selectById 就变成了:

selectById中间阶段

4 创建 SqlSource

该过程与上面的过程相似, 经过 include 节点的解析之后, 会创建对应的 SqlSourceNode 对象。

关于 SqlSource, 会在后续的文章中详细展开讲解。

在该过程之后, selectById 变成了

selectById 最终阶段

对应参数及其类型被保存起来, 同时参数的占位符 #{xxx, JdbcType=yyy} 变成了问号。 在调用 RawSqlSource 构造函数时, 会完成该过程

public RawSqlSource(Configuration configuration, String sql, Class<?> parameterType) { SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration); Class<?> clazz = parameterType == null ? Object.class : parameterType; sqlSource = sqlSourceParser.parse(sql, clazz, new HashMap<String, Object>()); } public SqlSource parse(String originalSql, Class<?> parameterType, Map<String, Object> additionalParameters) { // 占位符处理器 ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType, additionalParameters); GenericTokenParser parser = new GenericTokenParser("#{", "}", handler); String sql = parser.parse(originalSql); return new StaticSqlSource(configuration, sql, handler.getParameterMappings()); } // SQL 中的占位符处理。 @Override public String handleToken(String content) { parameterMappings.add(buildParameterMapping(content)); return "?"; } 5 获取对应的 KeyGenerator

KeyGenerator为键生成器。 在我们使用主键自动生成时, 会生成一个对应的主键生成器实例。

KeyGenerator

该接口主要定义了生成器的在 SQL 在查询前执行还是之后执行。 其有如下的实现类

KeyGenerator实现类

Jdbc3KeyGenerator:用于处理数据库支持自增主键的情况,如MySQL的auto_increment。

NoKeyGenerator:空实现,不需要处理主键。没有主键生成器, 如不是 INSERT, 也没有使用主键生成器的时候, 就是该类型。

SelectKeyGenerator:配置了 <selectKey> 之后, 就是该类型。 用于处理数据库不支持自增主键的情况,比如Oracle,postgres的sequence序列。

6 创建并添加 MappedStatement

在完成以上步骤的处理之后, 通过

builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);

进行 MappedStatement 对象的生成, 并添加到 Configuration 中。

以上的 selectById 最后再存在 Configuration中:

MappedStatement

7 一起学 mybatis

你想不想来学习 mybatis? 学习其使用和源码呢?那么, 在博客园关注我吧!!

我自己打算把这个源码系列更新完毕, 同时会更新相应的注释。快去 star 吧!!

mybatis最新源码和注释

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwjfz.html