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