スタートガイド
この章では、MyBatis-Spring のインストール・設定手順と、トランザクション処理を含むシンプルなアプリケーションの構築する方法について説明します。
インストール
MyBatis-Spring を使うためには、 mybatis-spring-3.0.4.jar
と依存するライブラリをクラスパスに追加するだけで OK です。
Maven をお使いの場合は、 pom.xml に次の dependency を追加してください。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.4</version>
</dependency>
クイックセットアップ
MyBatis と Spring を組み合わせて使う場合、Spring の Application Context 内に少なくとも SqlSessionFactory
と一つ以上の Mapper インターフェイスを定義する必要があります。
MyBatis-Spring では SqlSessionFactory
の生成に SqlSessionFactoryBean
を使います。この Factory Bean を設定するため、Spring の 設定ファイルに次の Bean を追加してください。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
}
SqlSessionFactory
が DataSource
を必要としている点に注意してください。どのような DataSource
でも構いません。通常の手順で設定してください。
Mapper インターフェイスが次のように定義されている場合…
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{userId}")
User getUser(@Param("userId") String userId);
}
MapperFactoryBean
を使ってこのインターフェイスを Spring に登録する場合、以下のように設定します。
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
ここで指定した Mapper は、実装クラスではなく インターフェイス である必要がありますので注意してください。 この例では、アノテーションを使って SQL を指定していますが、Mapper XML ファイルを使うこともできます。
上記のように設定しておけば、あとは他の Spring Bean と同様にビジネス/サービス層のオブジェクトにインジェクト(注入)することができます。
MapperFactoryBean
は SqlSession
の生成とクローズを行います。
もし Spring のトランザクション内で実行された場合は、トランザクション終了時にセッションがコミットあるいはロールバックされます。
最後にもう一点、全ての例外は Spring の DataAccessException
に変換されます。
Java Configurationを使用する場合:
@Configuration
public class MyBatisConfig {
@Bean
public UserMapper userMapper() throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory());
return sqlSessionTemplate.getMapper(UserMapper.class);
}
}
MyBatis のデータメソッドは、一行だけで実行可能となります。
public class FooServiceImpl implements FooService {
private final UserMapper userMapper;
public FooServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User doSomeBusinessStuff(String userId) {
return this.userMapper.getUser(userId);
}
}