Mybatis原理
1,初始化机制 本质上就是创建configuration对象,并且使用它
两种初始化方式L: 基于xml配置文件,MyBatis加载xml配置文件,将其组装为内部的Configuration对象
基于JavaAPI,我们再Java代码中手动创建configuration对象,然后将配置参数set进入这个对象
具体使用:mybatis初始化→创建SqlSession→执行SQL语句
具体初始化:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 利用传入的数据流生成Configuration对象,然后根据这个对象创建SqlSessionFactory对象实例,利用构造器得到一个工程类,用了建造者模式和工厂涉及模式
2,数据源与连接池
- mybatis数据源实现在四个包中,datasource, jndi, pooled,unpooled.DataSource是一个接口,PooledDataSource and UnPool都实现了DataSource接口,而且pooled具有一个指向UnPooled的引用,
- 数据源DATa Source的创建,是在我们对MyBatis初始化的过程中的,我们配置那四个参数,是在xml配置文件中进行的
- 是通过工厂模式来创建的,三种不同类型的type对应不同的dataSource工厂,通过接口DataSourceFactory中的方法getDataSource来返回数据源DataSource,创建DATa Source实例以后,会将其放到Configuration对象中的Environment对象中供后续使用
-
DataSource创建Connection对象的时间是当我们需要创建SqlSession对象来执行SQL语句的时候,MyBatis才会调用dataSource对象来创建Connection对象,也就是Connection对象的创建会一直延迟到执行SQL语句的时候
- 当datasource的类型属性设置为非连接池类型的时候 UNPOOLED ,myBatis首先会实例化一个UnpooledDataSourceFactory,然后调用getDataSource()方法来返回一个UnpoolDataSource对象,注意:使用UnpoolDataSource对象来getConnection,每一个都会产生一个新的Connection对象
- 初始化驱动,确保内容中有一个Driver对象
- 创建Connection对象
- 配置Connection对象
- 返回Connection对象
6,使用连接池的原因,创建一个连接的时间是很可能大于执行SQL语句的执行时间的
因为创建一个连接对象的过程,在底层就是和数据库简历的通信连接,通信连接耗时较久。所以简历连接对象后将其放到内存中,下次需要操作数据库的时候,直接从内存中取出,这样就不需要再创建连接对象了。
Mybatis中使用了PooledDataSource 解析原理
PooledDataSource 将Connection对象包装成PooledConnection对象放到容器中维护,连接池中的PooledConnection对象分为idle和active状态,分别存储在两个对应的list集合中。当我们调用getConnection方法的时候,会先去idle集合中获取一个PooledConnection对象,如果没有,再来看active集合是否已满,如果没有满,PooledDataSource会创建一个PooledConnection,添加到active对应的数组中。当我们用完一个Connection对象的时候,Mybatis会将其包装成PooledConnection对象放到idle对应的集合中