目次 > 第2章 Server(Rich)版チュートリアル > 2.4 データベースアクセス > 2.4.2 ビジネスロジッククラスの作成とDAOの設定

2.4.2 ビジネスロジッククラスの作成とDAOの設定

Server(Rich)版では、データベースアクセスを簡略化するDataAccessObject(以下、DAOとする)のインタフェースと、Spring + iBATIS 連携機能を利用し たデフォルト実装を提供している。
DAOを利用することで、JDBC API およびRDBMS 製品やO/Rマッピングツールに依存する処理をビジネスロジックから分離することができる。
以下に、Server(Rich)版が提供するDAOを示す。

インタフェースデフォルト実装説明
QueryDAOQueryDAOiBatisImplデータを検索(SELECT)する際に使用する。
UpdateDAOUpdateDAOiBatisImplデータを挿入・更新・削除(INSERT・UPDATE・DELETE)する際に使用する。
StoredProcedureDAOStoredProcedureDAOiBatisImplストアドプロシジャを発行する際に使用する。

本項では、ビジネスロジックとして以下の機能を実装する。

  1. UserBeanクラスのユーザIDでQueryDAOを利用してデータベースを検索し、存在するかチェックする。
  2. UserBeanクラスのデータをUpdateDAOを利用してデータベースに登録する。
  3. データベースのレコードをQueryDAOを利用して全件取得する。
  4. ResultDataクラスに結果を格納し、返却する。

手順

本項では以下の作業が必要になる。

(1) ビジネスロジッククラスの作成

  1. “terasoluna-spring-rich-blank\sources”を右クリックする。
  2. 「新規」→「クラス」を選択する。
  3. 以下の通り入力し、「終了」ボタンを押下する。
    • パッケージ:jp.terasoluna.rich.tutorial.service.blogic
    • 名前:DBAccessBLogic
    • インターフェース:jp.terasoluna.fw.service.rich.BLogic
  4. 生成されたDBAccessBLogicクラスを以下のように編集する。
    package jp.terasoluna.rich.tutorial.service.blogic;
    
    import java.util.List;
    import jp.terasoluna.rich.tutorial.service.bean.ResultData;
    import jp.terasoluna.rich.tutorial.service.bean.UserBean;
    import jp.terasoluna.fw.dao.QueryDAO;
    import jp.terasoluna.fw.dao.UpdateDAO;
    import jp.terasoluna.fw.service.rich.BLogic;
    
    /**
     * データベースアクセスのBLogicクラス
     *
     */
    public class DBAccessBLogic implements BLogic<UserBean, ResultData> {
        /**
         * DAOクラス。
         * Springによりインスタンス生成され設定される。
         */
        private UpdateDAO updateDAO = null;
    
        /**
         * DAOクラス。
         * Springによりインスタンス生成され設定される。
         */
        private QueryDAO queryDAO = null;
    
        /**
         * UpdateDAOを返却する。
         *
         * @return 保持するUpdateDAO
         */
        public UpdateDAO getUpdateDAO() {
            return updateDAO;
        }
    
        /**
         * UpdateDAOを設定する。
         *
         * @param updateDAO UpdateDAO
         */
        public void setUpdateDAO(UpdateDAO updateDAO) {
            this.updateDAO = updateDAO;
        }
    
        /**
         * QueryDAOを返却する。
         *
         * @return 保持するQueryDAO
         */
        public QueryDAO getQueryDAO() {
            return queryDAO;
        }
    
        /**
         * QueryDAOを設定する。
         *
         * @param queryDAO QueryDAO
         */
        public void setQueryDAO(QueryDAO queryDAO) {
            this.queryDAO = queryDAO;
        }
    
        /**
         * 入力クラスの引数のデータを登録して検索した結果を戻す。<br>
         * 1.UserBeanクラスのユーザIDでデータベースを検索し、存在するかチェックする。<br>
         * 2.UserBeanクラスのデータをデータベースに登録する。<br>
         * 3.データベースのレコードを全件取得する。<br>
         * 4.ResultDataクラスに結果を格納し、返却する。
         *
         * @param inputData 入力クラス
         * @return 結果クラス
         */
        public ResultData execute(UserBean inputData) {
            // 結果クラスの生成、結果の設定
            ResultData result = new ResultData();
            
            // 入力情報ビジネスロジックの実行
            // 返却値が、falseの場合は重複エラー。
            // trueの場合は登録処理が正常に終了。
            if (!check(inputData)) {
                // 重複エラー時の処理
                return result;
            }
            // ユーザ情報を登録する。
            updateDAO.execute("insertUser", inputData);
            
            // ユーザ情報を全件取得する。
            List<UserBean> userBeanList = queryDAO.executeForObjectList("getUserList", null);
            result.setUserBean(userBeanList);
            result.setTotalCount(Integer.valueOf(userBeanList.size()));
            return result;
        }
    
        /**
         * 入力されたIDが重複か否かをデータベースから取得して判定する。
         * 重複している場合は、falseを返却する。
         * 重複していない場合は、trueを返却する。
         *
         * @param inputData 入力された値を保持するJavaBean
         * @return チェック結果
         */
        private boolean check(UserBean inputData) {
            // IDからデータを検索する。
            Integer count = queryDAO.executeForObject("getUserCount", inputData,
                    Integer.class);
            if (count != null && count.intValue() > 0) {
                return false;
            }
            
            // データが取得できなかった場合は、重複していないとして
            // trueを返却する。
            return true;
        }
    }
    
    

ビジネスロジッククラス同様、SpringのDIコンテナによりインスタンスが生成されるため、DAOを利用する場合はDAOインタフェースの属性およびそのSetterメソッドを用意する。

QueryDAOの利用方法

入力の「ID」を持つレコードの件数を取得するSQL文を発行する。SQL文は「2.4.1 SQLの設定」で設定した以下のSQL文である。

    <!-- 登録されているユーザの件数を取得する -->
    <select id="getUserCount"
        parameterClass="jp.terasoluna.rich.tutorial.service.bean.UserBean"
        resultClass="java.lang.Integer">
        SELECT
                COUNT (ID)
            FROM
                USERTABLE
            WHERE
                ID = #id#
    </select>

このSQL文では件数のみ返却される。 この場合は、QueryDAOのexecuteForObjectメソッドを利用して、以下のようにSQL文を発行する。

Integer count = queryDAO.executeForObject("getUserCount", inputData, Integer.class);

以下に引数を示す。

  • 第1引数:SQL設定ファイルに定義したSQLID
  • 第2引数:入力バリューオブジェクト
  • 第3引数:出力バリューオブジェクトクラスの型

続いて、テーブルに登録されている全レコードを取得するSQL文を発行する。SQL文は「2.4.1 SQLの設定」で設定した以下のSQL文である。

    <!-- 全ユーザを取得する -->
    <select id="getUserList"
        resultClass="jp.terasoluna.rich.tutorial.service.bean.UserBean"
        resultSetType="SCROLL_INSENSITIVE">
        SELECT
                ID
                ,NAME
                ,AGE
                ,BIRTH
            FROM
                USERTABLE
            ORDER BY
                ID
    </select>

SELECT文の結果が複数件である場合、QueryDAOのexecuteForObjectListメソッドを利用することで、実行結果を指定された型のListで受け取ることができる。

List<UserBean> userBeanList = queryDAO.executeForObjectList("getUserList", null);

以下に引数を示す。

  • 第1引数:SQLID
  • 第2引数:入力バリューオブジェクト
備考

QueryDAOでは指定した行数分の結果のみ取得する機能を提供しており、以下の引数を追加することで開始インデックスから指定した行数分の結果を取得することができる。

  • 第3引数:開始インデックス
  • 第4引数:取得行数

UpdateDAOの利用方法

入力情報を挿入するSQL文を発行する。SQL文は「2.4.1 SQLの設定」で設定した以下のSQL文である。

    <!-- ユーザを挿入する -->
    <insert id="insertUser"
        parameterClass="jp.terasoluna.rich.tutorial.service.bean.UserBean">
        INSERT
            INTO
                USERTABLE (
                    ID
                    ,NAME
                    ,AGE
                    ,BIRTH
                )
            VALUES (
                #id#
                ,#name#
                ,#age#
                ,#birth#
            )
    </insert>

挿入、更新、削除を行うSQL文を発行する場合は、UpdateDAOのexecuteメソッドを利用して、以下のようにSQL文を発行する。

updateDAO.execute("insertUser", inputData);

UpdateDAOのexecuteメソッドは処理したレコードの件数を返却する。以下に引数を示す。

  • 第1引数:SQL設定ファイルに定義したSQLID
  • 第2引数:入力バリューオブジェクト
備考

SQLMap定義ファイルにて、以下のようにuseStatementNamespaces属性に“true”が指定されている場合は、 DAOでSQLIDを指定する際に、SQL設定ファイルの名前空間を付与する必要がある。

  • SQLMap定義ファイル
    <sqlMapConfig>
    	<settings useStatementNamespaces="true" />
    	<sqlMap resource="sqlMap.xml" />
    </sqlMapConfig>
    
  • SQL設定ファイル
    <!-- SqlMap定義 -->
    <!-- 名前空間の設定 -->
    <sqlMap namespace="user">
    
        <!-- 全ユーザを取得する -->
        <select id="getUserList"
            resultClass="jp.terasoluna.rich.tutorial.service.bean.UserBean"
            resultSetType="SCROLL_INSENSITIVE">
            SELECT
                    ID
                    ,NAME
                    ,AGE
                    ,BIRTH
                FROM
                    USERTABLE
                ORDER BY
                    ID
        </select>
        
    </sqlMap>
    
  • SQLIDの指定例
    queryDAO.executeForObjectList("user.getUserList", null);
    

(2) データアクセスのSpring設定ファイルの確認

DAOのデフォルト実装の設定は、データアクセスのSpring設定ファイル(dataAccessContext-local.xml)に設定されている。

  1. “terasoluna-spring-thin-blank\webapps\WEB-INF\dataAccessContext-local.xml”を開き、以下の設定がされていることを確認する。
    <!-- ======================================== iBATIS定義 -->
    
      ・・・略・・・
    
      <!-- 照会系のDAO定義 -->
      <bean id="queryDAO" 
          class="jp.terasoluna.fw.dao.ibatis.QueryDAOiBatisImpl">
    	<property name="sqlMapClient" ref="sqlMapClient"/>
      </bean>
    
      <!-- 更新系のDAO定義 -->
      <bean id="updateDAO" 
          class="jp.terasoluna.fw.dao.ibatis.UpdateDAOiBatisImpl">
    	<property name="sqlMapClient" ref="sqlMapClient"/>
      </bean>
    
      <!-- ストアドプロシジャ用のDAO定義 -->
      <bean id="spDAO" 
          class="jp.terasoluna.fw.dao.ibatis.StoredProcedureDAOiBatisImpl">
    	<property name="sqlMapClient" ref="sqlMapClient"/>
      </bean>
    

(3) “tutorial-businessLogic.xml”の編集

ビジネスロジック(DBAccessBLogic)のBean定義情報の追加を行う。

  1. “terasoluna-spring-rich-blank/webapps/WEB-INF/tutorial-businessLogic.xml”を開き、以下の設定を追加する。
    <!-- ======================================== 業務ロジック定義 -->
    
      ・・・略・・・
    
      <!-- 2.4 データベースアクセス dbAccessService 定義 -->
      <bean id="dbAccessService"
        class="jp.terasoluna.rich.tutorial.service.blogic.DBAccessBLogic"
        scope="prototype">
        <property name="updateDAO" ref="updateDAO"/>
        <property name="queryDAO" ref="queryDAO" />
      </bean>
    

<property>要素に利用するDAOを指定する。name属性で指定する名前はビジネスロジッククラスの属性名と一致させる必要があり、ref属性に指定する名前は(2)で確認したDAOのBeanIDと一致させる必要がある。


次項:2.4.3 コントローラの設定

Copyright (C) 2009 NTT DATA CORPORATION