我正在使用 mybatis-spring 设置一个应用程序,它应该执行多个 sql 语句(主要是选择)并将结果打印到控制台。
我的 applicationContext.xml 如下所示:
<context:property-placeholder location="classpath:application.properties"/>
<!-- BEANS -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${spring.datasource.driverClassName}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:sql_mapper.xml"/>
</bean>
<bean id="organisationMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper.OrganisationMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
我注意到,每当我执行一条 sql 语句时,都会为该语句创建 session ,并在执行后直接关闭。
是否有一种方法可以在一个 session 中执行多个 sql 语句,并且在执行所有方法/语句之前该 session 不会自行关闭?
感谢和问候。
最佳答案
似乎事务没有正确划分,并且使用了默认行为(一次调用映射器 - 一个事务 - 一个 mybatis session )。
在spring-mybatis
中, session 绑定(bind)到spring事务。如果未划分事务,则每次调用 mybatis 映射器方法时都会创建一个事务(并因此创建 mybatis SqlSession
)。
为了改变这一点,您需要正确配置 spring,以便:
- 交易完全可以使用
- 配置事务边界,即应在一个事务中执行对数据库的调用
配置事务的方法有很多种,详细信息请参见documentation 。我将在这里展示使用 xml 配置的简单方法。
首先,将事务管理器添加到spring配置中:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
然后您需要指定事务边界。简单的方法是使用声明式事务管理:
将其添加到 spring 配置中
<tx:annotation-driven/>
然后在应该以事务方式执行的方法上使用@Transactional
注释:
@Service
class SomeService {
@Autowired MyMapper mapper;
@Transactional
SomeResult someMethod () {
Piece1 piece1 = mapper.getSome();
Piece2 piece2 = mapper.getMore();
SomeResult result = SomeResult(piece1, piece2);
}
}
关于java - 如何使用 mybatis-string 在一个 session 中执行多个 sql 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655413/