在使用mybatis时我们一般通过继承SqlSessionDaoSupport然后使用getSqlSession获取数据库连接,进行数据库相关操作。我们查看getSqlSession方法可以看出,这个方法其实是返回了一个SqlSessionTemplate对象。
接着我们进入SqlSessionTemplate的构造器中看看,最终发现最终调用的都是如下构造器。
根据代码我们可以看到,最终生成的是一个sqlSession的动态代理sqlSessionProxy。根据动态代理构造我们可以很容易的看出,最终数据库相关操作都封装在SqlSessionInterceptor的invoke方法中。我们进invoke方法中看看。
在invoke方法中我们可以看到,改代理类并无对原有方法做过多包装。只是封装了相关事物操作。具体执行顺序如下:
1. 获取数据库链接,处理相关sql操作
2. 如果数据库操作有相应事物,则提交事物
3. 若2发生异常则回滚数据库操作,并关闭连接
4. 第四步一定执行,如果数据库链接没有关闭,则关闭数据库链接