データアクセスについて説明します。
Spring FrameworkではJTA(Java Transaction API)を利用してトランザクション制御を行うためのクラスを提供しています。
Spring FrameworkのJtaTransactionManagerクラスでは、JTAのTransactionManagerインターフェースを利用して、以下に記載するEJBと同等のトランザクション属性をサポートしています。
REQUIRED(EJB:Required)
MANDATORY(EJB:Mandatory)
REQUIRES_NEW(EJB:RequiresNew)
NOT_SUPPORTED(EJB:NotSupported)
SUPPORTS(EJB:Supports)
NEVER(EJB:Never)
DAOを使用することで、HibernateやJava Persistence API(JPA)などのデータベースアクセス機能を一貫した方法で処理できます。Spring Frameworkは以下のO/Rマッピング連携機能でDAOが使用できます。
Hibernate
JPA
MyBatis
Spring FrameworkではJDBCを抽象化したフレームワークを提供しています。
JDBC APIを直接使用するより簡潔にデータアクセスコードを記述できるようになっています。
Spring Frameworkは以下の機能を提供します。
冗長でエラーになりがちな例外処理をアプリケーションからフレームワークへ移すAPI
アプリケーションがSQLExceptionの代わりに動作するように意味のあるSpring固有のデータアクセス例外
例外処理APIによって、アプリケーションは適切なSQLを発行し、その結果を抽出する事に専念する事が可能です。
また、Spring Framework固有のデータアクセス例外によって、JDBC特有のデータアクセス例外ではなくなるため、アプリケーションではthrowされる可能性があるすべてのJDBCデータアクセス例外を意識する必要がなくなります。
Hibernateと連携してO/Rマッピングできます。事前にJDBCデータソースを作成し、JNDIを使用して作成したJDBCデータソースに接続してください。
Hibernateを使用したO/RマッピングアプリケーションがJDBCデータソースに接続するためには、下記の設定が必要です。
エンティティクラスの作成
Bean定義ファイルの作成
データベースアクセスクラスの作成
例
Hibernateを使用したO/RマッピングアプリケーションがJDBCデータソースに接続するための設定を以下に示します。
(1) エンティティクラスの作成
エンティティクラスを作成します。エンティティクラスにはEntityアノテーションを指定してください。
エンティティクラス:
package com.example.model; |
(2) Bean定義ファイルの作成
Spring FrameworkがHibernateに接続するために、Bean定義ファイルの設定が必要です。Bean定義ファイルの設定例を以下に示します。
Bean定義ファイル:
<?xml version="1.0" encoding="UTF-8"?> … <!--- JNDIからデータソースを取得 --> <jee:jndi-lookup id="dataSource " jndi-name="testDB"/> <!--- セションファクトリの設定 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!--- JNDIから取得したデータソースを指定 --> <property name="dataSource" ref="dataSource" /> <property name="annotatedClasses"> <list> <!--- エンティティクラスを指定 --> <value>com.example.model.UserModel</value> </list> </property> <!--- Hibernateプロパティの設定 --> <property name="hibernateProperties"> <props> <!--- データベースダイアレクトの設定 --> <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> <!--- テーブルが存在しない場合は作成 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!--- トランザクションマネージャの設定 --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> <tx:annotation-driven transaction-manager="transactionManager" /> </bean> … |
(3) データベースアクセスクラスの作成
データベースにアクセスするためのクラスを作成します。データベースアクセスクラスを作成する前に、DAOインターフェースを作成します。
Daoインターフェース:
package com.example.service; |
DAOインターフェースを実装して、データベースアクセスクラスを作成します。データベースにアクセスするために、セションファクトリを使用します。
データベースアクセスクラス:
package com.example.service; |
JPAと連携してO/Rマッピングできます。事前にJDBCデータソースを作成し、JNDIを使用して作成したJDBCデータソースに接続してください。
JPAを使用したO/RマッピングアプリケーションがJDBCデータソースに接続するためには、下記の設定が必要です。
エンティティクラスの作成
各種定義ファイルの作成
データベースアクセスクラスの作成
例
JPAを使用したO/RマッピングアプリケーションがJDBCデータソースに接続するための設定を以下に示します。
(1) エンティティクラスの作成
エンティティクラスを作成します。エンティティクラスにはEntityアノテーションを指定してください。
エンティティクラス:
package com.example.model; |
(2) 各種定義ファイルの作成
Spring FrameworkがJPAに接続するには、下記のファイル設定が必要です。
Bean定義ファイル
deployment descriptor(persistence.xml)
Web application deployment descriptor(web.xml)
Bean定義ファイルの設定例を以下に示します。
Bean定義ファイル:
<?xml version="1.0" encoding="UTF-8"?> … <!--- JNDIからデータソースを取得 --> <jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/em"/> <!--- トランザクションマネージャの設定 --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="allowCustomIsolationLevels" value="true"/> </bean> … |
persistence.xmlの設定については、“Interstage Application Server Java EE 7設計・構築・運用ガイド”の“JPAの提供機能”、web.xmlの設定については、“Interstage Application Server Java EE 7設計・構築・運用ガイド”の“JNDI”を参照してください。
deployment descriptor(persistence.xml):
<?xml version="1.0"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <!--- ユニット名とトランザクション種別の指定 --> <persistence-unit name="testUnit" transaction-type="JTA"> <!--- 接続先のJDBCリソースを指定 --> <jta-data-source>Test_DataSource</jta-data-source> <properties> <!--- 接続先データベースに応じたプラットフォームクラスを指定 --> <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.OraclePlatform"/> <!--- テーブルの自動生成 --> <property name="eclipselink.ddl-generation" value="create-tables" /> </properties> </persistence-unit> </persistence> |
Web application deployment descriptor(web.xml):
… <javaee:persistence-unit-ref> <!--- Bean定義で定義した値を指定 --> <javaee:persistence-unit-ref-name>persistence/em</javaee:persistence-unit-ref-name> <!--- deployment descriptorで定義した値を指定 --> <javaee:persistence-unit-name>testUnit</javaee:persistence-unit-name> </javaee:persistence-unit-ref> … |
(3) データベースアクセスクラスの作成
データベースにアクセスするためのクラスを作成します。データベースアクセスクラスを作成する前に、DAOインターフェースを作成します。
Daoインターフェース:
package com.example.service; |
DAOインターフェースを実装して、データベースアクセスクラスを作成します。データベースにアクセスするために、セションファクトリを使用します。
データベースアクセスクラス:
package com.example.service; |
MyBatisと連携してO/Rマッピングできます。事前にJDBCデータソースを作成し、JNDIを使用して作成したJDBCデータソースに接続してください。
MyBatisを使用したO/RマッピングアプリケーションがJDBCデータソースに接続するためには、下記の設定が必要です。
エンティティクラスの作成
Bean定義ファイルの作成
Mapperインターフェースの作成
データベースアクセスクラスの作成
例
MyBatisを使用したO/RマッピングアプリケーションがJDBCデータソースに接続するための設定を以下に示します。
(1) エンティティクラスの作成
データを格納するためのJavaBeanであるエンティティクラスを作成してください。
エンティティクラス:
package com.example.model; |
(2) Bean定義ファイルの作成
O/RマッピングとしてMyBatisを使用するためにBean定義ファイルの設定が必要です。SqlSessionFactoryとMapperインターフェースを設定してください。
Bean定義ファイルの設定例を以下に示します。
Bean定義ファイル:
<?xml version="1.0" encoding="UTF-8"?> … <!--- JNDIからデータソースを取得 --> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/mybatisAppDataSource"/> <!--- トランザクションマネージャの設定 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- SqlSessionFactoryの設定--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- MyBatisの設定 --> <property name="configuration"> <bean class="org.apache.ibatis.session.Configuration"> <property name="jdbcTypeForNull" value="OTHER"/> </bean> </property> </bean> <!-- Mapperインターフェースの取得--> <mybatis-spring:scan base-package="com.example.mapper" /> … |
(3) Mapperインターフェースの作成
Mapperインターフェースにはオブジェクトを操作するためのSQL文の対応付けを記述してください。またSQL実行のメソッドを記述してください。
Mapperインターフェースの例を下記に示します。
SqlMapper.java:
package com.example.mapper; |
(4) データベースアクセスクラスの作成
データベースにアクセスするためのクラスを作成します。
Mapperインターフェースのオブジェクトをサービス層のオブジェクトに注入できます。
Spring Frameworkのトランザクションの中でMapperFactoryBeanがSqlSessionの生成とクローズを行うため、実行の処理を一行で記述できます。
SqlSessionはトランザクション終了時にコミット、またはロールバックされます。
インターフェース:
package com.example.service; |
インターフェースを実装して、データベースアクセスクラスを作成してください。
データベースアクセスクラス:
package com.example.service; |
JAXBと連携してJavaオブジェクトとXMLのマッピングができます。
Marshaller, Unmarshallerという2つのインターフェースを使用して変換をします。
例
Javaソース:
import org.springframework.oxm.Marshaller; |
Bean定義:
<oxm:jaxb2-marshaller id="jaxb2marshaller" contextPath="foo.bar.schema"/> <bean id="application" class="Application"> <property name="marshaller" ref="jaxb2marshaller" /> <property name="unmarshaller" ref="jaxb2marshaller" /> </bean> |