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