SpringFrameworkとの連携
MyBatisとSpringFrameworkとの連携方法に関して、書こうかと思います。
今のところSpring側で、MyBatisとの連携の対応がないようですが、
MyBatisには、Springとの連携用のライブラリがあります。
今回は、これを使うことにします。
MyBatisのサイトからSpringの連携用のライブラリをダウンロードしてきます。
Springと連携するには、org.mybatis.spring.SqlSessionFactoryBeanクラスのオブジェクトが必要です。
SqlSessionFactoryBeanには、データソースが必要です。
applicationContext.xmlにまず下記の定義を行います。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/developer"/> <property name="username" value="chronos"/> <property name="password" value="*******"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
あ!ちなみにデータソースは、コマンドラインで起動する場合の設定で、
通常のWebアプリならJNDIを使って下さい。
こっから実際は2通りあるのですが、
一つは、org.mybatis.spring.MapperFactoryBeanを使う方法です。
このクラスは、MyBatisのインターフェイスを実装したプロキシーを生成し、アプリケーションへ注入されます。
設定方法は、下記の内容を設定します。
<bean id="ItemDAO" class="org.mybatis.spring.MapperFactoryBean"> <property name="mapperInterface" value="com.chronos.core.system.persistence.dao.ItemDAO" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
但し、すべてのDAOをapplicationContext.xmlに定義する必要があるので、結構大変です。
個人的には、次の方法を使ってます。
org.mybatis.spring.mapper.MapperScannerConfigurerクラスを使う方法です。
このクラスは、パッケージを指定してあげるとスキャンしてくれ、そのパッケージ内のクラスをSpring配下にしてくれます。
これなら毎回DAOをapplicationContext.xmlに定義する必要がなくなり楽です。
設定方法は、下記の内容を設定します。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> <property name="basePackage" value= "com.chronos.core.system.persistence" /> </bean>
また、クラス名がそのままBeanの名前になります。
例えば、ItmDAOならitemDAOとなります。
但し、上記2つの方法ですが、アノテーション方式の場合、
自動生成のクラスを継承したインターフェイスとかも問題なくジェネレーションギャップパターンを適用することができるのですが、
XMLファイルを使っている場合、うまくいきません。