公式声明によると、Spring3 の開発作業は ibatis3、つまり Mybatis3 の登場前に完了しているため、Spring3 ではまだ Mybatis3 はサポートされていません。したがって、Mybatis コミュニティは、Mybatis ユーザーの Spring 統合のニーズを満たすために、Mybatis-Spring 自体を開発しました。以下では、Mybatis-Spring による Mybatis と Spring の統合の使用法を簡単に紹介します。
マッパーファクトリービーン
まず、Mybatis 公式 Web サイトから Mybatis-Spring jar パッケージをダウンロードし、それをプロジェクトのクラスパスに追加する必要があります。もちろん、Mybatis の関連 jar パッケージと Spring の関連 jar パッケージも追加する必要があります。 Mybatis のすべての操作は SqlSession に基づいており、SqlSession は SqlSessionFactory によって生成され、SqlSessionFactory は SqlSessionFactoryBuilder によって生成されることがわかっています。ただし、Mybatis-Spring は SqlSessionFactoryBean に基づいています。 Mybatis-Spring を使用する場合、SqlSession も必要です。この SqlSession はプログラムに埋め込まれており、通常は直接アクセスする必要はありません。 SqlSession も SqlSessionFactory によって生成されますが、Mybatis-Spring は SqlSessionFactoryBean をカプセル化します。この Bean では、引き続き SqlSessionFactoryBuilder を使用して対応する SqlSessionFactory を確立し、対応する SqlSession を取得します。 SqlSessionFactoryBean を通じて、Mybatis にいくつかのプロパティを指定することで、Mybatis の構成情報を提供できます。次に、Spring の applicationContext 構成ファイルで SqlSessionFactoryBean を定義する必要があります。
XMLコード
<bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" / > <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> </bean>
SqlSessionFactoryBean を定義するときは、データベースへの接続に使用されるデータ ソースを表す dataSource 属性を指定する必要があります。もちろん、他の属性をいくつか指定することもできます。
mapperLocations: マッパー ファイルが保存されている場所を示します。 マッパー ファイルが対応するマッパー インターフェイスと同じ場所にある場合、この属性の値を指定する必要はありません。
configLocation: Mybatis の構成ファイルの場所を指定するために使用されます。この属性を指定した場合、構成ファイルの内容を構成情報として、対応する SqlSessionFactoryBuilder が構築されますが、以降の属性で指定した内容は、構成ファイルに指定した対応する内容を上書きします。
typeAliasesPackage: 通常、エンティティ クラスが配置されているパッケージに対応します。このとき、対応するパッケージ内のパッケージ名を含まない単純なクラス名が、パッケージ名を含むエイリアスとして自動的に取得されます。複数のパッケージはカンマまたはセミコロンで区切ることができます。
typeAliases: エイリアスの指定に使用される配列タイプ。この属性を指定した後、Mybatis は、 @Alias アノテーションがクラスにマークされていない限り、このタイプの短い名前をこのタイプのエイリアスとして使用します。それ以外の場合は、アノテーションに対応する値がクラスのエイリアスとして使用されます。このタイプ。
XMLコード
<property name="typeAliases"> <array> <value>com.tiantian.mybatis.model.Blog</value> <value>com.tiantian.mybatis.model.Comment</value> </array> </property >
plugins: 配列タイプ。Mybatis のインターセプターを指定するために使用されます。
typeHandlersPackage: TypeHandler が配置されているパッケージを指定するために使用されます。この属性が指定されている場合、SqlSessionFactoryBean は、対応する TypeHandler としてパッケージの下のクラスを自動的に登録します。複数のパッケージはカンマまたはセミコロンで区切ることができます。
typeHandlers: TypeHandler を表す配列タイプ。
次のステップは、Spring の applicationContext ファイルに必要な Mapper オブジェクトに対応する MapperFactoryBean を定義することです。必要な Mapper オブジェクトは、MapperFactoryBean を通じて取得できます。 MapperFactoryBean は Spring の FactoryBean インターフェイスを実装するため、MapperFactoryBean は FactoryBean インターフェイスで定義された getObject メソッドを通じて対応する Mapper オブジェクトを取得します。 MapperFactoryBean を定義する場合、注入する必要があるプロパティが 2 つあります。1 つは、SqlSession インターフェイスを実装する SqlSessionTemplate オブジェクトを生成するために Mybatis-Spring によって使用される sqlSessionFactory で、もう 1 つは返したい対応する Mapper インターフェイスです。
対応する Mapper インターフェースに対応する MapperFactoryBean を定義した後、対応する Mapper インターフェースを Spring によって管理される Bean オブジェクト (Service Bean オブジェクトなど) に注入できます。このようにして、対応する Mapper インターフェイスを使用する必要がある場合、MapperFactoryBean は getObject メソッドから対応する Mapper インターフェイスを取得し、内部的には getObject が引き続き、返すために挿入したプロパティを通じて SqlSession インターフェイスの getMapper (Mapper インターフェイス) メソッドを呼び出します。対応するマッパーインターフェイス。このように、Mybatis と Spring の統合は、SqlSessionFactory と対応する Mapper インターフェイスを Spring 管理に引き渡すことによって実現されます。
Spring の applicationContext.xml 構成ファイル:
XMLコード
<?xml version="1.0"coding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans /spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring- mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis"/> <context:property-placeholder location="classpath:config/jdbc.properties"/> <bean id="dataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <プロパティ名="url" value="${jdbc.url}" /> <property name="ユーザー名" value="${jdbc.username}" /> <property name="パスワード" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="クラスパス: com/tiantian/mybatis/mapper/*.xml"/> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean id="blogMapper"> <property name="mapperInterface" value="com.tiantian.mybatis.mapper.BlogMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>豆> 豆> </豆>
BlogMapper.xml ファイル:
XMLコード
<?xml version="1.0"coding="UTF-8" ?> <!DOCTYPE マッパー PUBLIC "-//mybatis.org//DTD マッパー 3.0//EN" "http://mybatis.org/dtd/mybatis -3-mapper.dtd"> <mapper namespace="com.tiantian.mybatis.mapper.BlogMapper"> <!-- 新しいレコードを追加します--> <挿入id="insertBlog"parameterType="Blog" useGeneratedKeys="true" keyProperty="id"> t_blog(title,content,owner) に挿入 value(#{title},#{content},#{owner}) </ insert> <!-- 単一レコードのクエリ --> <select id="selectBlog"parameterType="int" resultMap="BlogResult"> select * from t_blog where id = #{id} </select> <!-- レコードの変更--> <update id="updateBlog"parameterType="Blog"> update t_blog set title = #{title},content = #{content},owner = #{owner} ここでid = #{id} </update> <!-- すべてのレコードをクエリする --> <select id="selectAll" resultType="Blog"> select * from t_blog </select> <!--レコードを削除します--> <delete id="deleteBlog"parameterType="int"> id = #{id} の t_blog から削除します </delete> </mapper>
ブログマッパー.java:
Javaコード
パッケージ com.tiantian.mybatis.mapper; import com.tiantian.mybatis.model.Blog; publicinterface BlogMapper { publicvoid insertBlog(ブログ ブログ); ); publicvoid deleteBlog(int id);
BlogServiceImpl.java:
Javaコード
パッケージ com.tiantian.mybatis.service.impl; インポート javax.annotation.Resource; インポート com.tiantian.mybatis.mapper.BlogMapper; mybatis.model.Blog; import com.tiantian.mybatis.service.BlogService; @Service publicclass BlogServiceImpl は BlogService { を実装します。 BlogMapper blogMapper; publicvoid deleteBlog(int id) { blogMapper.deleteBlog(id); } public ブログ find(int id) { returnblogMapper.selectBlog(id) } public List<Blog> find() { returnblogMapper.selectAll(); publicvoid insertBlog(ブログ ブログ) { blogMapper.insertBlog(ブログ) } publicvoid updateBlog(ブログ ブログ) { blogMapper.updateBlog(ブログ); } public BlogMapper getBlogMapper() { returnblogMapper; } @Resource publicvoid setBlogMapper(blogMapper) { this.blogMapper = blogMapper;
マッパースキャナーコンフィギュラー
上記の方法を使用して統合する場合、Mapper がある場合は、対応する MapperFactoryBean を定義する必要があります。Mapper が比較的少ない場合はこれで問題ありませんが、Mapper が非常に多い場合は、次のように各 Mapper を定義します。対応する MapperFactoryBean の速度が遅いようです。この目的のために、Mybatis-Spring は MapperScannerConfigurer というクラスを提供します。このクラスを通じて、Mybatis-Spring は Mapper に対応する MapperFactoryBean オブジェクトを自動的に登録します。
Mapper インターフェイスを自動的にスキャンして登録するために MapperScannerConfigurer を使用する必要がある場合は、Spring の applicationContext 構成ファイルで MapperScannerConfigurer に対応する Bean を定義する必要があります。 MapperScannerConfigurer の場合、指定する必要がある属性が 1 つあります。それは、basePackage です。 BasePackage は、Mapper インターフェイス ファイルが配置されている基本パッケージを指定するために使用されます。この基本パッケージまたはそのすべてのサブパッケージの下にある Mapper インターフェイスが検索されます。複数の基本パッケージはカンマまたはセミコロンで区切ることができます。最も単純な MapperScannerConfigurer 定義は、次のように、basePackage 属性を 1 つだけ指定することです。
XMLコード
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> </bean>
このようにして、MapperScannerConfigurer は、指定された基本パッケージ内のすべてのインターフェイスをスキャンし、それらを MapperFactoryBean オブジェクトとして登録します。 MapperScannerConfigurer を使用し、basePackage 属性を追加すると、上記の例の applicationContext 構成ファイルは次のようになります。
XMLコード
<?xml version="1.0"coding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans /spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring- mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis" /> <context:property-placeholder location="classpath:config/jdbc.properties" /> <bean id="dataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <プロパティ名="url" value="${jdbc.url}" /> <property name="ユーザー名" value="${jdbc.username}" /> <property name="パスワード" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="クラスパス: com/tiantian/mybatis/mapper/*.xml" /> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> </bean> </beans>
指定した基本パッケージが、定義したすべての Mapper インターフェイスではない場合もあります。このため、MapperScannerConfigurer は、検索と登録の範囲を絞り込むことができる他の 2 つの属性も提供します。 1 つは annotationClass で、もう 1 つは markerInterface です。
annotationClass: annotationClass が指定されている場合、MapperScannerConfigurer は annotationClass アノテーションでマークされたインターフェイスのみを登録します。
markerInterface: markerInterface はインターフェイスを指定するために使用されます。 markerInterface が指定された場合、MapperScannerConfigurer は markerInterface から継承したインターフェイスのみを登録します。
上記のプロパティの両方が指定されている場合、MapperScannerConfigurer はそれらの交差部分ではなく結合部分を取得します。マーキングにannotationClassを使用した場合や、markerInterfaceから継承したインターフェースをMapperFactoryBeanとして登録する場合でも同様です。
ここで、Mapper インターフェイスが SuperMapper インターフェイスを継承すると仮定すると、次のように MapperScannerConfigurer を定義できます。
XMLコード
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> </bean>
注釈 MybatisMapper タグが使用されている場合は、次のように MapperScannerConfigurer を定義できます。
XMLコード
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/> </bean>
登録された Mapper インターフェイスの範囲を狭めるために使用されるプロパティに加えて、次のような他のプロパティも指定できます。
sqlSessionFactory: このプロパティは非推奨になりました。複数のデータ ソースを使用する場合、sqlSessionFactory を使用して MapperFactoryBean の登録時に使用する必要がある SqlSessionFactory を指定する必要があります。これは、sqlSessionFactory が指定されていない場合、Autowired 方式で自動的に 1 つが挿入されるためです。つまり、データ ソースを 1 つだけ使用する場合、つまり SqlSessionFactory を 1 つだけ定義する場合は、MapperScannerConfigurer に SqlSessionFactory を指定する必要はありません。
sqlSessionFactoryBeanName: 定義された SqlSessionFactory に対応する Bean 名を指定することを除いて、その機能は sqlSessionFactory と同じです。
sqlSessionTemplate: この属性は非推奨になりました。前述したように、MapperFactoryBean は最終的に SqlSession の getMapper メソッドを使用して、対応する Mapper オブジェクトを取得するため、その関数も sqlSessionFactory と同等です。複数の SqlSessionTemplate が定義されている場合にのみ指定する必要があります。 MapperFactoryBean の場合、SqlSessionFactory と SqlSessionTemplate のいずれか 1 つだけが必要です。両方を指定した場合、SqlSessionFactory は無視されます。
sqlSessionTemplateBeanName: 使用する sqlSessionTemplate に対応する Bean 名を指定します。
注: sqlSessionFactory プロパティと sqlSessionTemplate プロパティを使用すると、PropertyPlaceholderConfigurer よりも前に一部のコンテンツが読み込まれるため、構成ファイルで使用される外部プロパティ情報を置き換えることができず、エラーが発生します。 sqlSessionFactory プロパティと sqlSessionTemplate プロパティは Mybatis-Spring では廃止されました。sqlSessionFactoryBeanName プロパティと sqlSessionTemplateBeanName プロパティを使用することをお勧めします。
XMLコード
<?xml version="1.0"coding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:mybatis="http://www.mybatis.org/schema/mybatis" xsi:schemaLocation="http://www.springframework .org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.mybatis.org/schema/mybatis http:/ /www.mybatis.org/schema/mybatis/mybatis-spring.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis" /> <context:property-placeholder location= "classpath:config/jdbc.properties" /> <bean id="dataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml" /> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
SQLセッションテンプレート
上記の統合後に直接 Mapper インターフェイスを使用することに加えて、Mybatis-Spring は SqlSession を直接使用する方法も提供します。 Mybatis-Spring は、SqlSession インターフェイスを実装する SqlSessionTemplate クラスを提供します。これはスレッドセーフであり、複数の Dao で同時に使用できます。同時に、現在使用されている SqlSession が Spring のトランザクションにバインドされているものであることを確認するために、Spring のトランザクションにも関連付けられます。また、セッションの送信と終了を単独で管理することもできます。 Spring のトランザクション管理メカニズムを使用すると、Spring のトランザクションとともに SqlSession を送信およびロールバックすることもできます。
SqlSessionTemplate を使用する場合、次のように Spring の applicationContext 構成ファイルで定義できます。
<bean id="sqlSession"> <constructor-argindex="0" ref="sqlSessionFactory" /> </bean>
このようにして、SqlSessionTemplate を直接使用して、Spring の依存関係注入を通じて Dao でプログラムすることができます。現時点での Dao は次のようになります。
Javaコード
パッケージ com.tiantian.mybatis.dao; インポート javax.annotation.Resource; インポート org.springframework.stereotype.Repository;ブログ; @Repository publicclass BlogDaoImpl は BlogDao { private SqlSessionTemplate を実装しますsqlSessionTemplate; publicvoid deleteBlog(int id) { sqlSessionTemplate.delete("com.tiantian.mybatis.mapper.BlogMapper.deleteBlog", id); } public Blog find(int id) { returnsqlSessionTemplate.selectOne("com.tiantian.mybatis. mapper.BlogMapper.selectBlog", id); public List<Blog> find() { returnthis.sqlSessionTemplate.selectList("com.tiantian.mybatis.mapper.BlogMapper.selectAll"); } publicvoid insertBlog(ブログ ブログ) { this.sqlSessionTemplate.insert("com.tiantian.mybatis.mapper.BlogMapper.selectAll"); mybatis.mapper.BlogMapper.insertBlog"、ブログ); } publicvoid updateBlog(ブログ blog) { this.sqlSessionTemplate.update("com.tiantian.mybatis.mapper.BlogMapper.updateBlog", blog); } public SqlSessionTemplate getSqlSessionTemplate() { returnsqlSessionTemplate; } @Resource publicvoid setSqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate } }
注記:
この記事はMybatis3.2.1、Mybatis-Spring1.1.0、Spring3.1をベースに書いています。
以上が、この記事で紹介した mybatis と spring の統合の実装プロセスの簡単な分析でした。次回の記事では、spring と mybatis の統合方法を紹介します。