mybatis-spring开源项目文档:http://www.mybatis.org/spring/zh/sqlsession.html
mybatis官方文档:http://www.mybatis.org/mybatis-3/
有时间一定要研究下mybatis的源码
一、spring 整合 mybatis 需不需要手动关闭SQLSession?
具体源码分析:https://blog.csdn.net/RicardoDing/article/details/79899686
spring整合mybatis之后,通过动态代理的方式,使用SqlSessionTemplate持有的sqlSessionProxy属性来代理执行sql操作(比如下面SqlSessionTemplate类的insert方法)
public int insert(String statement) {
return this.sqlSessionProxy.insert(statement);
}
最终,insert方法执行完操作后,会执行finally里面的代码对sqlSeesion进行关闭,因此,spring整合mybatis之后,由spring管理的sqlSeesion在sql方法(增删改查等操作)执行完毕后就自行关闭了sqlSession,不需要我们对其进行手动关闭
二、当mybatis没有与spring整合二单独使用时需不需要手动关闭?
可以不用...
根据mybatis官方文档,建议对sqlSession进行如下操作
SqlSession session = sqlSessionFactory.openSession();
try {
// following 3 lines pseudocod for "doing some work"
session.insert(...);
session.update(...);
session.delete(...);
session.commit();
} finally {
session.close();
}
每个操作都进行打开和关闭,而且都是重复性操作。
于是mybatis-3.0.6采用动态代理实现的aop非常好的解决了上面的问题。
大体实现方式如下:
1.在applicationContext.xml中配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation">
<value>classpath:mybatisConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
2.在具体的使用类中执行如下操作,即可。
int identifier = sqlSession.insert(statement, object);
大体原理:
执行sqlSession.insert及执行SqlSessionTemplate.insert,其内部调用sqlSessionProxy.insert,sqlSessionProxy是一个动态代理器,其调用处理器是SqlSessionInterceptor,该处理器先getSqlSession,然后执行insert,最后closeSqlSession。
不明白的同学可直接查看mybatis-3.0.6源码