Mybatis介绍

1.  Mybatis初始化过程

 所有框架在初始化的时候都要加载该框架需要的一些配置文件,Mybatis也不例外,需要加载一些配置文件;如下所示

那配置文件加载到哪呢?答案是Configuration,Configuration是配置文件的容器,各种配置信息都会放到Configuration对象里面;

String resource = "mybatis-config.xml";

InputStream inputStream = Resources.getResourceAsStream(resource);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession sqlSession = sqlSessionFactory.openSession();

List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");

这几条语句首先初始化Mybatis,生成SqlSession实例,接着执行sql语句

总的来说是读取Mybatis配置文件,解析配置文件生成Configuration实例,在使用Configuration对象生成sqlsession实例;使用SqlSessionFactoryBuilder创建SqlSessionFactory,SqlSessionFactory又openSession(),创建数据库连接;

2.  数据源DataSource的分类

        

pooled:使用连接池的数据源

unpooled:不是连接池;

3.  什么时候创建DataSource?什么时候创建Connection对象?

         在Mybatis初始化的时候就创建了DataSource,在

List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");才创建Connection对象;

4.  Connection的建立非常消耗时间,对于高并发系统来说需要使用数据库连接池解决效率问题,pooledDataSource实现原理:使用PooledState来当做连接池的容器,该容器中保存两种队列:idleConnections(空闲队列),activeConnections(活跃队列),当需要连接时,从idleConnections中取出,然后放到activeConnections队列中;当idleConnections中没有Connection对象且activeConnections中未满,那就创建新的Connection。

 5.  Mybatis事务管理

         此处的事务管理就是数据库中的数据管理。事物就是若干个操作要么全部完成,如果有一个操作出现了错误,那么其他的都要回滚;接口Transtation的实现类有JDBCTransaction和ManagerdTransaction,这两个类也是使用工厂模式创建的;具体的初始化也是在Mybatis初始化的时候给定的;

6.  Mybatis一级缓存

         Mybatis和数据库交互之前需要建立一个数据库会话,也就是SqlSession对象,在这一次会话当中,可能会执行一个完全相同的查询若干次,从数据库中查询数据非常浪费时间(数据很有可能存储在磁盘上,系统要进行io操作,就非常浪费时间了),那现在我们为每个SqlSession对象创建一个缓存Cache,专门用来保存查询数据的结果。每次查询,先到缓存中查询,看是否能够命中,如果找不到数据,才到数据库中查询.更具体的,SqlSession对数据库的所有操作都会委托给Executor去执行,同样, Executor也维护Cache对象。其中,Cache内部是通过一个HashMap<key,value>来实现的。

         那Cache大小有限制吗?也就是对我们缓存的数据多少有限制吗?

         答案是没有,Mybatis的一级缓存设计比较简单,另外原因是缓存可能并不能持续很久(也就是生命周期可能不长);

  (a)SqlSession调用close()方法,一级缓存会释放掉;

  (b)数据库进行了更新操作(insert,delete,update),一级缓存还是会被释放掉;

  (c)会话结束。上述操作都会释放掉缓存。

7.  Mybatis二级缓存

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。

  可以看到,Mybatis一级缓存是SqlSession级别的,每个SqlSession都有一个缓存,而二级缓存是全局级别的,以每个namespace为单位;二级缓存的实现是在Executor的基础上,Executor通过装饰者模式生成CachingExecutor。对于每次查询请求,SqlSession先使用CachingExecutor到二级缓存中查询,如果查询不到在使用Executor查询,之后CachingExecutor会将查询结果放到二级缓存中,然后将结果返回给SqlSession。

8.  DataSource和Transaction都是使用工厂模式完成的,那工厂的类图是怎样的?

原文地址:https://www.cnblogs.com/zhihuayun/p/7272012.html