Mybaits的生命周期

对象工厂

  • MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。
  • 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。
  • 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。【了解即可】

生命周期和作用域

Mybaits的生命周期

作用域的理解

SqlSessionFactoryBuilder
  • SqlSessionFactoryBuilder的作用是创建SqlSessionFactory,创建工厂后,它就失去了作用,所以它只能存在于创建SqlSessionFactory 的方法中,所以这个是在工具类的static中,只需要加载一次。它是局部方法变量)。
  • SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession连接接口对象。又因为Mybatis的本质就是java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个Mybatis的应用之中,所以一旦创建了SqlSessionFactory。就要长期保存它,直至不再使用Mybatis的应用,所以可以认为SqlSessionFactory的生命周期就等同于Mybatis的应用周期。(也就是说SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,不会丢弃或者重新创建另一个实例
  • 因此SqlSessionFactory的最佳作用域就是应用作用域
  • 最简单的就是使用单例模式或者静态单例模式
SqlSession
  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
    SqlSession
    简单来说就是:
  • 它是连接到连接池的一个请求,SqlSession完全包含了面向数据库的SQL命令
  • SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳作用域是请求或方法作用域。
  • 用完之后需要赶紧关闭,否则资源被占用。Mybaits的生命周期