根据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