CB3 - チュートリアル 第3章 - 3.2DBアクセス - その1

 3.2.1概要

  • このサンプルの目的
     このアプリケーション作成例を通して、以下について知ることができます。
    • サービスでのDBアクセッサの使用方法
    • DBアクセッサを使用するときの設定ファイルの作成方法
    • SELECTのSQL文を発行する方法

  • サンプルアプリケーションの内容
     簡単なSELECT文を発行し、取得結果を標準出力へ表示するバッチアプリケーションです。  
     サンプルアプリケーションの概要を下図に示します。

     
     
     サービスでデータベースにアクセスする場合は、CB3が提供するDBアクセッサを利用します。
     DBアクセッサは、設定ファイルのDBアクセス設定ファイルの内容をもとにSELECTやINSERTなどのSQL文の発行を行います。
     
     DBアクセッサを利用する場合は、applicationContext.xmlにaccessorContext.xml、datasourceContext.xml、 transactionContext.xmlをインポートします。
     
     このサンプルでは以下のファイルについて説明します。  
    • DBAccess.java
       サービスのプログラムです。上図内の赤枠の部分に相当します。
    • dbaccessConfig.xml
       SQL文の設定ファイルです。このファイルに発行するSQL文を記述します。上図内のDBアクセス設定ファイルに相当します。
    • applicationContext.xml
       CB3がserviceContext.xmlなどのspringフレームワーク関連の設定ファイルを読み込むための起点となる コンテキストファイルです。
    • serviceContext.xml
       実行対象のサービスを定義します。
    • 起動用バッチファイル - dbaccess.bat
       サービスを起動するためのバッチファイルです。
     
     以下のファイルについては、CB3内部で使用される設定ファイルのため、このチュートリアルでは説明を割愛します。  
    • accessorContext.xml
       CB3が提供するアクセッサが定義されているファイルです。
    • datasourceContext.xml
       DBの接続情報を定義する設定ファイルです。
       このサンプルではローカルPCで実行するHSQLDBの接続情報を定義しています。
       ※ CB3では、DBの接続情報について、springフレームワークを利用しています。
       ※ 設定内容についてはspringフレームワークのドキュメントを参照してください。
    • transactionContext.xml
       DBのトランザクション境界が定義されているファイルです。
       CB3では、サービス単位で1トランザクションとなります。
       大量のデータを扱う場合に、分割してコミットを行うときは、「3.4 DBアクセス - その3」を参照してください。
    • loggingContext.xml
       AOPを利用してサービスを実行したときのトレースログを出力するように定義された設定ファイルです。

 3.2.2サービスの作成

  • DBAccess.java

     01: public class DBAccess extends CB3Service {
     02:
     03:    /**
     04:     * アクセッサを取得し、select文を発行するメソッド。
     05:     */
     06:    @Override
     07:    protected int doService(ServiceParameters arg0, RuntimeParameters arg1)
     08:            throws ServiceException {
     09:        //アクセッサを取得
     10:        DBAccessor ac = (DBAccessor)getDataAccessContext().lookup("dbaccessConfig");
     11:
     12:        //dbaccessConfigに設定したSQLを発行、レコードから値を取得し出力
     13:        showRecord(ac.select("select1"));
     14:        return ExitCodeConstant.SUCCESS;
     15:    }
     16:
     17:    /**
     18:     * 取得した値をコマンドライン上に出力する。
     19:     * @param reader
     20:     */
     21:    private void showRecord(DBRecordReader reader){
     22:
     23:        DBRecord record = null;
     24:        while((record = reader.nextRecord()) != null){
     25:            System.out.println(record.getString("id")+"  "+record.getString("name"));
     26:        }
     27:    }
     28:}
                          

    10行目:
    データベースへアクセスするためにはDBアクセッサの取得を行います。getDataAccessContext()メソッドでDataAccessContextの取得を行い、 lookup()メソッドでアクセッサを取得します。lookup()メソッドの引数にはDBアクセス設定ファイル(dbaccessConfig.xml)のファイル名を指定します。

    13行目:
    SELECT文の発行を行います。DBアクセス設定ファイル(dbaccessConfig.xml)には下記のようにSQL文に対してidが指定(id="select1")してあります。このidを select()メソッドの引数に指定することでSQLを発行することができます。
    <select id="select1" >
    SELECT id,name FROM select_test
    </select>
    
    21行目〜27行目:
    SELECT文の実行結果からレコードを取得します。select()メソッドをコールするとDBRecordReaderオブジェクトが取得できます。 後はこのサンプルのようにnextRecord()メソッドでレコード(DBRecordオブジェクト)を1件ずつ取得し、レコードに項目名を指定することで 項目値の取得を行うことができます。

 3.2.3設定ファイルの作成

  • dbaccessConfig.xml
    DBアクセス設定ファイルです。サービスで使用するSQL文を定義します。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <!-- 途中省略 -->
     03:    <!--select Sql  -->
     04:    <select id="select1" >
     05:        SELECT id,name FROM select_test
     06:    </select>
     07:</db-accessor>
    

    4行目〜6行目:
    SELECT文を定義するためには上記のようにselectタグのid属性に一意になるようidを指定し、SELECT文を記述します。 このidはプログラム中でSELECT文を取得する際のキーとなります。(上記DBAccess.javaの13行目)

  • applicationContext.xml
    この設定ファイルはserviceContext.xmlをCB3が読み込むためのコンテキストファイルです。
    CB3はこのファイルを起点として、各設定ファイル(springフレームワーク関連の設定ファイル)の読込みを行います。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <-- 途中省略 -->
     03:    <import resource="serviceContext.xml"/>
     04:    <import resource="classpath:accessorContext.xml"/>
     05:    <import resource="classpath:datasourceContext.xml"/>
     06:    <import resource="classpath:transactionContext.xml"/>
     07:    <import resource="classpath:loggingContext.xml"/>
     08:</beans>
    

    DBアクセッサを利用するため、前回のサンプルのときの他に、accessorContext.xml、datasourceContext.xml、 transactionContext.xmlをインポートします。

  • serviceContext.xml
    このサンプルの実行に必要となるサービスのコンテキストファイルです。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    < -- 途中省略 -- >
     03:    <!-- ServiceProvider -->
     04:    <bean id="dbaccess" class="jp.co.cybec.cb3.container.provider.ServiceProviderImpl">
     05:        <property name="service"><ref bean="sample2"/></property>
     06:    </bean>
     07:    <!-- Service -->
     08:    <bean id="sample2" class="jp.co.cybec.cb3.sample.database.dbaccess.DBAccess">
     09:    <property name="dataAccessContext"><ref bean="accessContext"/></property>
     10:    </bean>
     11:    <!-- DataAccessContext -->
     12:    <bean id="accessContext" class="jp.co.cybec.cb3.accessor.DataAccessContextImpl">
     13:        <constructor-arg index="0"><ref bean="testDataAccessors"/></constructor-arg>
     14:    </bean>
     15:    <util:map id="testDataAccessors">
     16:        <entry key="dbaccessConfig"><ref bean="dbAccessor"/></entry>
     17:    </util:map>
     18:</beans>
    

    3行目〜10行目:
    前回のサンプルのときと同様のサービスの定義部分です。
    9行目のnameの「dataAccessContext」はサービスのプロパティです。 サービスでアクセッサを利用する場合は、必ずこの名前を設定します。 また、beanの「accessContext」はアクセッサコンテキストのbean名を設定しています。 この値には、この後のアクセッサコンテキストの定義で設定した名前を設定します。

    11行目〜17行目:
    アクセッサコンテキストの定義部分です。
    アクセッサコンテキストは、CB3が提供するクラスで、サービスで利用するアクセッサを保持します。
    12行目のidに任意のアクセッサコンテキスト名を設定します。この値を9行目のbeanに設定しています。 classにアクセッサコンテキストのクラス名を設定します。CB3では必ずこのクラス名を設定します。
    13行目のbeanにアクセッサを保持するMapのidを任意の名前で設定します。この値は、15行目のidになります。
    16行目のentryタグのkeyにはDBアクセス設定ファイルのファイル名を指定します。beanはアクセッサのbean名を設定します。 このbeanはaccessorContext.xmlで定義されています。DBアクセッサを利用する場合は必ず「dbAccessor」を設定します。

 3.2.4サービスの実行

  • dbaccess.bat
     01:@echo off
     02:
     03:setlocal
     04:
     05:call ./set_classpath_com.bat
     06:
     07:set CLASSPATH=%CB3_HOME%/resources/config/dbaccess;%CLASSPATH%
     08:
     09:java jp.co.cybec.cb3.container.provider.ServiceProviderImpl -ServiceName dbaccess
     10:
     11:pause
    

    このサンプルでは起動パラメータを扱わないのでその指定はありません。
    上記バッチファイルを実行すると下記のように表示されます。

    1  田中
    1  鈴木
    続行するには何かキーを押してください . . .