看到这,通过上面的注释,先是不是跟我们最开始的猜想已经有点眉目了?
我们简单看下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语句。
其实看到这,我们就大概了解了整个单表CRUD生成的方法,其实如果我们想要实现自己的类似的自定义SQL,就可以实现AbstractSqlInjector抽象类。
生成自己的DefaultSqlInjector,然后在仿照框架的写法,实现自己的injectMappedStatement方法,这样就可以了。
3.inspectInject的调用分析完上面的重头戏,我们正常还是要看下inspectInject在哪被调用的,直接跟跟踪下代码,我们就能轻易的追踪到代码调用的地方,MybatisConfiguration中addMapper的时候会调用。
我们直接跳到调用的地方。
而调用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方法中。