如何使用mybatis-string在一个会话中执行多个sql语句

时间:2019-04-12 15:53:10

标签: java spring session mybatis spring-mybatis

我正在使用mybatis-spring设置一个应用程序,该应用程序应执行几个sql语句(主要是selects)并将结果打印到控制台。

我的applicationContext.xml看起来像这样:

$posts = Post:all();
$user = []; // should be an array because you're looping over it.
foreach($posts as $post) {
  $user[] = User::where('name', $post->creator)->get();
}

return view('welcome')->with('posts', $posts)->with('user', $user);

我注意到,每当我执行sql语句时,都会为该语句创建会话,并在执行后立即关闭。

有没有一种方法可以在一个会话中执行多个sql语句,直到所有方法/语句都执行完才关闭它?

谢谢。

1 个答案:

答案 0 :(得分:1)

似乎没有正确划分事务,并且使用了默认行为(一次调用映射器-一次事务-一次mybatis会话)。

spring-mybatis中,绑定到春季交易的会话。如果未划分事务,则将为每次对mybatis映射器方法的调用创建一个事务(并因此创建mybatis SqlSession)。

要更改此设置,您需要正确配置spring,以便:

  1. 所有交易都可以使用
  2. 配置事务边界,即对数据库的调用应在一个事务中执行

有许多方法可以配置事务,有关详细信息,请参见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);
  }

}