powerdee.com
Google
 
このサイト内 Web
 
カウンタ

STEP5.永続化層(iBATIS)

INDEX

iBATIS(いーばてぃす)とは

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テーブルの各カラム属性との対応付けする定義ファイルを作成します。 ファイルは、com/powerdee/dao/ibatis/mapping/BookInfoSQL.xml です。

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テストで実行します。


おすすめ書籍


SpringによるWebアプリケーションスーパーサンプル

著者:村山 雅彦、阪田 浩一、奥 清隆
出版社:ソフトバンククリエイティブ(2006-07-29)
価格:¥3,990(税込)
Light Weight Java―JSF/Hibernate/SpringによるフレームワークでWebアプリケーションの開発効率向上

著者:岡本 隆史、金子 崇之、吉田 英嗣、権藤 夏男
出版社:毎日コミュニケーションズ(2005-04)
価格:¥3,360(税込)
Apache Maven 2.0入門 Java・オープンソース・ビルドツール

著者:野瀬 直樹、横田 健彦
出版社:技術評論社(2006-12-13)
価格:¥2,499(税込)
Spring2.0入門 Java・オープンソース・Web開発自由自在

著者:株式会社豆蔵、長谷川 裕一、岩永 寿来、伊藤 清人、大野 渉、麻野 耕一
出版社:技術評論社(2006-12-28)
価格:¥3,654(税込)


ページTopへ / ▲Homeへ