MyBatis源码解析( 三 )


SqlSessionManager 同时实现了 SqlSession 接口和 SqlSessionFactory 接口 , 所以同时提供了 SqlSessionFactory 创建 SqlSession 对象 , 以及 SqlSession 操纵数据库的功能 。
SqlSessionManager 与 DefaultSqlSessionFactory 的主要不同点 SqlSessionManager 提供了两种模式 , 第一种模式与 DefaultSqlSessionFactory 的行为相同 , 同一线程每次通过 SqlSessionManager 对象访问数据库时 , 都会创建新的 SqlSession 对象完成数据库操作 。第二种模式是 SqlSessionManager 通过 localSqlSession 这 ThreadLocal 变量 , 记录与当前线程绑定的 SqlSession 对象 , 供当前线程循环使用 , 从而避免在同一线程多次创建 SqlSession 对象带来的性能损失 。
DataSourceDataSourceFactory数据工厂
/** * 数据源工厂 * @author Clinton Begin */public interface DataSourceFactory {/*** 设置 dataSource 属性* @param props*/void setProperties(Properties props);/*** 获取 dataSource* @return {@link DataSource}*/DataSource getDataSource();} 

MyBatis源码解析

文章插图
 
DyanmicSqlSourcce动态sqlPooledDataSource 管理的数据库连接对象 是由其持有的 UnpooledDataSource 对象 创建的 , 并由 PoolState 管理所有连接的状态 。PooledDataSource 的 getConnection()方法 会首先调用 popConnection()方法 获取 PooledConnection 对象 , 然后通过 PooledConnection 的 getProxyConnection()方法 获取数据库连接的代理对象 。popConnection()方法 是 PooledDataSource 的核心逻
MapperMethod 中封装了 Mapper 接口 中对应方法的信息 , 和对应 sql 语句 的信息 , 是连接 Mapper 接口 及映射配置文件中定义的 sql 语句 的桥梁 。
MapperMethod 中持有两个非常重要的属性 , 这两个属性对应的类 都是 MapperMethod 中的静态内部类 。另外 , MapperMethod 在被实例化时就对这两个属性进行了初始化
MapperMethod 中的核心方法 execute() 就主要用到了这两个类
public static class SqlCommand {// sql语句的idprivate final String name;// sql语句的类型 , SqlCommandType 是枚举类型 , 持有常用的 增、删、改、查等操作类型private final SqlCommandType type;} 
MyBatis源码解析

文章插图
 
 MyBatis 和spring整合源码spring启动时候需要是由一个bean.xml配置
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");bean.xml配置例如:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 加载数据源 --><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value=https://www.isolves.com/it/sjk/bk/2022-01-13/"classpath*:mappers/*Mapper.xml"/> MapperScannerConfigurer这个类主要的方法就是
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法
MyBatis源码解析

文章插图
 
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {if (this.processPropertyPlaceHolders) {processPropertyPlaceHolders();}//ClassPathMapperScanner扫描器 , 这个扫描器继承了spring的ClassPathBeanDefinitionScanner 。/**第一扫描basePackage包下面所有的class类第二将所有的class类封装成为spring的ScannedGenericBeanDefinition sbd对象第三过滤sbd对象 , 只接受接口类第四完成sbd对象属性的设置 , 比如设置sqlSessionFactory、BeanClass等 , 这个sqlSessionFactory是本文接下来要解析的SqlSessionFactoryBean第五将过滤出来的sbd对象通过这个BeanDefinitionRegistry registry注册器注册到DefaultListableBeanFactory中 , 这个registry就是方法postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)中的参数 。*/ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);scanner.setAddToConfig(this.addToConfig);scanner.setAnnotationClass(this.annotationClass);scanner.setMarkerInterface(this.markerInterface);scanner.setSqlSessionFactory(this.sqlSessionFactory);scanner.setSqlSessionTemplate(this.sqlSessionTemplate);scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);scanner.setResourceLoader(this.applicationContext);scanner.setBeanNameGenerator(this.nameGenerator);scanner.registerFilters();scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));}


推荐阅读