Mybatis.调用链路(源码:SqlSession-Executor-Transaction-DataSource-Connection)

SqlSessionFactory

创建参数:

       数据源

       + Mybatis配置(properties)

       + Mybatis的org.apache.ibatis.session.Configuration 对象

Builder类:

       org.apache.ibatis.session.SqlSessionFactoryBuilder

默认mybatis创建位置:

       SqlSessionFactory org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory() throws IOException

 代码:SqlSessionFactory

       org.apache.ibatis.session.SqlSessionFactoryBuilder.build(Configuration config)

正真创建SqlSessionFactoryBean:

       org.mybatis.spring.boot.autoconfigure.MybatisProperties Mybatis配置类

 

 

根据配置构建org.apache.ibatis.session.SqlSessionFactory(参数:javax.sql.DataSource, org.mybatis.spring.boot.autoconfigure.MybatisProperties)

org.mybatis.spring.SqlSessionFactoryBean

在类:org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration中实现,可以看出来SQLSessionFactory和DataSource并不直接耦合。

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource

 

SqlSession

org.apache.ibatis.session.SqlSession

用来操作数据库。

 

实现类:默认

org.apache.ibatis.session.defaults.DefaultSqlSession

从getConnection方法追下去(原因:看怎么从DataSource获取的),是获取Executor中获取的Transaction对象,从Transaction对象获取的连接。

private final Executor executor;

return executor.getTransaction().getConnection();

Executor是执行器,Executor哪来的事务对象。

实现类。

 Executor

实现类:org.apache.ibatis.executor.SimpleExecutor

执行器。

Transaction是传进来的。

  public SimpleExecutor(Configuration configuration, Transaction transaction) {

    super(configuration, transaction);

  }

查看调用:

从DataSource中open Session,信息交叉,进去看看:

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory

Configuration

Environment

Executor: 的创建

Transaction

DefaultSqlSession

关系很清楚了。

 

创建执行器:

Executor org.apache.ibatis.session.Configuration.newExecutor(Transaction transaction, ExecutorType executorType)

调用链路

SqlSession àExecutoràTransactionàDataSourceàConnection

信息解析:

1. 这里边只有DataSource可以自定义和可配置

2. 除了Connection其他都是单例,也就是说被框架认可的只能有一个DataSource

3. 默认的数据源如tomcat,dbcp,c3p0,ali druid都没法自定义

如果需要动态数据源,实现一个DataSource代理,在获取Connection时做手脚。

说明:一个请求进来,数据源对象不能变的,获取的Connection是每次都需要获取的。

调用如如下:

 

DataSource

javax.sql.DataSource

看报名,可以看出是jdk自带的。

DataSourceProperties

org.springframework.boot.autoconfigure.jdbc.DataSourceProperties

private Class<? extends DataSource> type;

spring:

    datasource:

        name: name1

        url: jdbc:mysql://******:3306/demo1?museUnicode=true&characterEncoding=utf-8

        username: root

        password: ****

        # 使用druid数据源

        type: com.alibaba.druid.pool.DruidDataSource

初始化DataSourcebuilder:

     public DataSourceBuilder<?> initializeDataSourceBuilder() {

         return DataSourceBuilder.create(getClassLoader()).type(getType())

                   .driverClassName(determineDriverClassName()).url(determineUrl())

                   .username(determineUsername()).password(determinePassword());

     }

查看调用:

 

追下去发现没有代码调用。

创建数据源

org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Generic.dataSource(DataSourceProperties) 

	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type")
	static class Generic {
		@Bean
		public DataSource dataSource(DataSourceProperties properties) {
			return properties.initializeDataSourceBuilder().build();
		}
	}

没错,你看到了,这就是创建DataSource的代码。

可以自己断点看看是否不是可以进来。

DruidDataSource

创建:

com.alibaba.druid.pool.DruidDataSourceFactory

public static DataSource createDataSource(Properties properties)


end

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值