Mybatis 在执行数据库操作之前,先要有4个对象,分别是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession以及对应直接操作增删改查的Mapper。
其中,SqlSessionFactoryBuilder 首先通过 builder 方法,根据获得的配置文件创建一个 SqlSessionFactory 工厂,然后SqlSessionFactoryBuilder 就不需要了,所以 SqlSessionFactoryBuilder 生命周期为方法局部,用完即亡;
SqlSessionFactory是用于创建sqlSession会话用的。在mybatis中,每次使用SqlSession都会被创建(同一次事务内的SqlSession共享),而创建SqlSession 就需要 SqlSessionFactory,故 SqlSessionFactory 要一直存在(一般是单例),生命周期将伴随着整个mybatis应用;
sqlSession 是用户用于进行增删改查的工具(其实内部是具体操作Executor执行器去操作jdbc的底层,这里先不深入),当sqlSession被开启(如 SqlSessionFactory.openSession() 方法)时开启,当sqlSession用完后被关闭(如 sqlSession.close() 方法)时消亡,生命周期为一个请求request或者一个method内。(ps:这里提一下,我们平时用mybatis结合Spring用的时候,是无需手动进行开启和关闭操作的,因为框架里已经帮我们自动做了这些操作,和Spring集成后,内部用的sqlSession具体为SqlSessionTemp,并且持有对DefaultSqlSession的一个代理。当进行对数据的操作时,代理类会对sqlSession进行open和close操作,源码如下,看不懂可以略过,这里只是简单说下)
最后也就是我们用到的 Mapper接口,当sqlSession被关闭后,Mapper也就完成了使命,随后也就跟着消亡了。
下边总结一下:
对象 | 生命周期 |
SqlSessionFactoryBuilder | 方法局部(method) |
SqlSessionFactory | 应用级别(application) |
SqlSession | 请求或操作(request/method) |
Mapper | 方法(method) |