STEP5.永続化層(iBATIS)INDEXiBATIS(いーばてぃす)とはiBATISは、SQLMapsとDAOFrameworkという2つのフレームワークで構成されているプロジェクトで、単純なXMLファイルでクラスをSQLステートメントにマップするO/Rマッピングフレームワークです。SQLステートメントを直接扱える為SQL文に慣れた(自分です^-^)開発者にとってはよさそうなO/Rマッパーだと思います。今回はSQLMapsのみを扱います。 1.iBATIS定義ファイルの作成sql-map-config.xmlというファイルを/WEB-INFの直下に作成します。本当はこのファイルの要素transactionManagerでデータベース設定情報を記述しますが、今回はSpringと連携しますので、STEP1のEIS層で解説したデータソースを利用します。 以下のように要素sqlMapでマッピングファイルを指定します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings enhancementEnabled="true"
maxTransactions="20"
maxRequests="32" maxSessions="10"/>
<sqlMap resource="com/powerdee/dao/ibatis/mapping/BookInfoSQL.xml" />
</sqlMapConfig>
2.iBATISマッピング定義ファイルの作成Entityクラス(BookInfo)と、BOOK_INFO_TBLテーブルの各カラム属性との対応付けする定義ファイルを作成します。 BookInfoクラス(JavaBean)のプロパティを要素resultMapの属性propertyに指定し、テーブルのカラムを属性columnに指定します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="BookInfoSQL">
<typeAlias alias="bookInfo" type="com.powerdee.entity.BookInfo"/>
<resultMap id="bookInfoResult" class="bookInfo">
<result property="isbn" column="ISBN"/>
<result property="title" column="TITLE"/>
<result property="authorName" column="AUTHOR_NAME"/>
<result property="price" column="PRICE"/>
<result property="publish" column="PUBLISH"/>
<result property="publicationDay" column="PUBLICATION_DAY"/>
</resultMap>
<insert id="addBookInfo" parameterClass="bookInfo">
<![CDATA[
INSERT INTO BOOK_INFO_TBL
(
ISBN,
TITLE,
AUTHOR_NAME,
PRICE,
PUBLISH,
PUBLICATION_DAY
)
VALUES(
#isbn#,
#title#,
#authorName#,
#price#,
#publish#,
#publicationDay#
);
]]>
</insert>
<update id="updateBookInfo" parameterClass="bookInfo">
<![CDATA[
UPDATE BOOK_INFO_TBL
SET ISBN = #isbn#,
TITLE = #title#,
AUTHOR_NAME = #authorName#,
PRICE = #price#,
PUBLISH = #publish#,
PUBLICATION_DAY = #publicationDay#
WHERE
ISBN = #isbn#;
]]>
</update>
<statement id="getBookInfo" parameterClass="bookInfo" resultMap="bookInfoResult">
SELECT
ISBN,
TITLE,
AUTHOR_NAME,
PRICE,
PUBLISH,
PUBLICATION_DAY
FROM BOOK_INFO_TBL
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="isbn">
ISBN = #isbn#
</isNotNull>
</dynamic>
</statement>
<delete id="deleteBookInfo">
<![CDATA[
DELETE FROM BOOK_INFO_TBL
WHERE
ISBN = #isbn#;
]]>
</delete>
</sqlMap>
3.DAO用のBean定義ファイルの作成DAOのインターフェイスとDAOのテストケースはSTEP2.永続化層(hibernate版)で解説したものをそのまま利用します。ここではDAO用のBean定義ファイルをiBATIS版のDAOを利用するように変更します。 [APPHOME]/WEB-INF/applicationContext-dao.xml を変更します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>WEB-INF/sql-map-config.xml</value>
</property>
</bean>
<bean id="bookInfoDao"
class="com.powerdee.dao.ibatis.BookInfoDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref local="sqlMapClient"/></property>
</bean>
</beans>
4.DAOの作成O/RマッピングツールのiBATIS用のDataAccessObjectを作成します。 ここでもSpringFrameworkのiBATISサポート機能をつかってますので、シンプルに実装できます。
package com.powerdee.dao.ibatis;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.powerdee.dao.IBookInfoDao;
import com.powerdee.entity.BookInfo;
public class BookInfoDaoImpl extends SqlMapClientDaoSupport implements IBookInfoDao {
public BookInfo getBookInfo(String isbn) throws DataAccessException {
BookInfo bookInfo = new BookInfo();
bookInfo.setIsbn(isbn);
bookInfo = (BookInfo) getSqlMapClientTemplate()
.queryForObject("getBookInfo", bookInfo);
if (bookInfo == null) {
throw new DataRetrievalFailureException
("Failed to get bookInfo: isbn=(" + isbn + ")");
}
return bookInfo;
}
public String saveBookInfo(BookInfo bookInfo) throws DataAccessException {
BookInfo beforeBookInfo
= (BookInfo) getSqlMapClientTemplate()
.queryForObject("getBookInfo", bookInfo);
if (beforeBookInfo == null) {
getSqlMapClientTemplate().insert("addBookInfo", bookInfo);
} else {
getSqlMapClientTemplate().update("updateBookInfo", bookInfo);
}
return bookInfo.getIsbn();
}
public void deleteBookInfo(String isbn) throws DataAccessException {
getSqlMapClientTemplate().delete("deleteBookInfo", isbn);
}
public List selectAllBookInfo() throws DataAccessException {
return getSqlMapClientTemplate().queryForList("getBookInfo", null);
}
}
5.テスト実行!"com.powerdee.dao.BookInfoDaoImplTest" を JUnitテストで実行します。 おすすめ書籍
|