MybatisPlusAutoConfiguration
ObjectProvider#getIfAvailable
ObjectProvider为我们提供了拓展,我们可以自定义一些插件或者类型转换器,同时也可以定义一些Customizer用来配置SqlSessionFactoryBean,MybatisPlusProperties等。
通过源码我们可以看到最终调用的是DefaultListableBeanFactory#DependencyObjectProvider#getIfAvailable
那我们来看一个例子,比如我们自定义一个类型转换器:
@Component
public class CustomTypeHandler implements TypeHandler<Animal> {@Overridepublic void setParameter(PreparedStatement ps, int i, Animal parameter, JdbcType jdbcType) throws SQLException {}@Overridepublic Animal getResult(ResultSet rs, String columnName) throws SQLException {return null;}@Overridepublic Animal getResult(ResultSet rs, int columnIndex) throws SQLException {return null;}@Overridepublic Animal getResult(CallableStatement cs, int columnIndex) throws SQLException {return null;}
}
可以看到我们在MybatisPlusAutoConfiguration就能拿到这个TypeHandler,这是为我们保留的拓展点,方便我们进行自定义拓展,我们也要从中学习这种设计。
SqlSessionFactory 核心一环
SqlSessionFactory做的事情非常的多,我们慢慢来看。
首先一上来就创建了MybatisSqlSessionFactoryBean这个工厂:
接着把一些属性设置进了工厂:
接着调用了工厂的getBean方法:
然后又调用了afterPropertiesSet -> buildSqlSessionFactory:
之后又做了一个特别重要的操作就是,如果又Mapper.xml文件会创建MybatisXMLMapperBuilder进行Mapper.xml的解析:
我们重点关注MybatisMapperBuilderAssistant里面有很多方法协助完成整个工作。
在这里完成了XML的解析,生成了:
下面这三个方法我们一眼就可以看出它们的意图,完成没有做完的初始化工作:
至于为什么因为在刚开始初始化的时候如果抛出了IncompleteElementException就会进入IncompleteResultMap:
接下来就是,创建SqlSessionFactory 了:
我们可以看到MyBatais将所有东西全部都放到了Configuration中。
除了非常重要的SqlSessionFactory ,SpringBoot还为我们配置了SqlSessionTemplate,这里里面就提供了一些方法,让我们进行数据DDL操作: