Mybatis3源码笔记(八)小窥MyBatis-plus (2)

Mybatis3源码笔记(八)小窥MyBatis-plus

看到这,通过上面的注释,先是不是跟我们最开始的猜想已经有点眉目了?

我们简单看下SelectOne操作。

public class SelectOne extends AbstractMethod { @Override public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_ONE; SqlSource sqlSource = languageDriver.createSqlSource(configuration, String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()), modelClass); return this.addSelectMappedStatementForTable(mapperClass, getMethod(sqlMethod), sqlSource, tableInfo); } }

上面就是具体生成MappedStatement的地方,细节就不说了,其实追踪到最后都是一跟之前篇章的分析是一样的。

我们主要是看SqlMethod.SELECT_ONE就是框架中自定义SQL的地方。我们打开SqlMethod就可以看到全部的SQL语句。

Mybatis3源码笔记(八)小窥MyBatis-plus

其实看到这,我们就大概了解了整个单表CRUD生成的方法,其实如果我们想要实现自己的类似的自定义SQL,就可以实现AbstractSqlInjector抽象类。

生成自己的DefaultSqlInjector,然后在仿照框架的写法,实现自己的injectMappedStatement方法,这样就可以了。

3.inspectInject的调用

分析完上面的重头戏,我们正常还是要看下inspectInject在哪被调用的,直接跟跟踪下代码,我们就能轻易的追踪到代码调用的地方,MybatisConfiguration中addMapper的时候会调用。

我们直接跳到调用的地方。

Mybatis3源码笔记(八)小窥MyBatis-plus

而调用addMapper的地方,第一个我们很容易找到,就是在buildSqlSessionFactory里解析mapperLocations的时候。这一块的代码基本上就是之前的xml解析这一套,跟之前的mybatis解析是差不多的,

所以就不累述了。

... if (this.mapperLocations != null) { if (this.mapperLocations.length == 0) { LOGGER.warn(() -> "Property 'mapperLocations' was specified but matching resources are not found."); } else { for (Resource mapperLocation : this.mapperLocations) { if (mapperLocation == null) { continue; } try { XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(), targetConfiguration, mapperLocation.toString(), targetConfiguration.getSqlFragments()); xmlMapperBuilder.parse(); } catch (Exception e) { throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e); } finally { ErrorContext.instance().reset(); } LOGGER.debug(() -> "Parsed mapper file: '" + mapperLocation + "'"); } } ... 重头戏到了,xml的解析这一套我们都找到了,那那些没有配置xml的mapper接口呢?他是如何注册的? 4.MybatisPlusAutoConfiguration

其实通过打断点,我们是能找到调用addMapper的地方,就在MapperFactoryBean中的checkDaoConfig方法中。

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

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