mybatis进击三:核心数据管理

目录

一、MapperScan

二、MapperScannerRegistrar

三、如何将xml与bean结合起来呢?

四、Configuration​

五、应用

在前文中,我们已经了解mybatis的类型系统。

在项目中,我们都是通过xml文件与mapper接口进行sql语句管理,有的通过mybatis注解进行sql语句的编写

那么,mybatis是怎么实现这些SQL语句的加载呢?

一、MapperScan

我们定义了mapper,那么肯定必须可以有类来加载他们,这是org.mybatis.spring.annotation中的注解,这个注解就是来扫描我们定义的mapper。(假如我们想在某个注解存在的情况下,进行一些数据得初始化,就可以参考这种方式)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)     //意思引入这个处理类
public @interface MapperScan

二、MapperScannerRegistrar

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware

  通过registerBeanDefinitions方法将我们定义的扫描路径下的@Mapper注解的方法都定义成了bean,这样我们就可以使用@Autowire等自动引入了

三、如何将xml与bean结合起来呢?

既然我们知道所有的mapper接口都会变成一个bean,交给spring管理,而且,通过阅读registerBeanDefinitions的源码,也没有发现xml和bean是怎么关联的,那么这些关联是怎么发生的?

我们发现一个类,SqlSessionFactoryBean,这个类管理很多属性

mybatis进击三:核心数据管理_第1张图片

其中有一项就是mapperLocations

SqlSessionFactoryBean implements FactoryBean, InitializingBean, ApplicationListener

通过类的定义,发现它实现了InitializingBean接口,所以我们可以看看afterPropertiesSet方法

mybatis进击三:核心数据管理_第2张图片

所以重点在于buildSqlSessionFactory,在这个方法里,我们发现它会处理configuration对象,并解析xml文件

mybatis进击三:核心数据管理_第3张图片mybatis进击三:核心数据管理_第4张图片

mybatis进击三:核心数据管理_第5张图片

mybatis进击三:核心数据管理_第6张图片

最终我们会发现Configuration中存储了太多的东西,mapper bean,xml文件转换后的节点(语句节点、sql片段、result,列名与字段名的映射关系以及对应的typeHandler处理器)[在阅读源码中,我们发现这个Configuration对象作为参数一直在传递并设值]

mybatis进击三:核心数据管理_第7张图片

最终一句话:在进行SqlSessionFactoryBean初始化后,就会生成Configuration对象,而这个对象保存着mybatis的核心数据,所有的sql语句片段,mapper文件与对应的接口类,列名与字段名的映射,拦截器等等

四、Configurationmybatis进击三:核心数据管理_第8张图片

 

五、应用

//自定义bean名称
@Bean(SQL_SESSION_FACTORY_BEAN_NAME)
    public SqlSessionFactoryBean sqlSessionFactory(@Qualifier(LAZY_CONNECTION_BEAN_NAME) DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionFactory(new ReadWriteManagedTransactionFactory());
        factory.setVfs(SpringBootVFS.class);
        org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
        //下划线与驼峰的转换
        config.setMapUnderscoreToCamelCase(true);
        factory.setConfiguration(config);
        PathMatchingResourcePatternResolver resourcePatternResolver =
                new PathMatchingResourcePatternResolver();
        //设置mapper文件所在的位置
factory.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
        //设置entity所在的目录
        factory.setTypeAliasesPackage(typeAliasesPackage);
        return factory;
    }

 

你可能感兴趣的:(mybatis)