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

 3.3.1概要

  • このサンプルの目的
     このアプリケーション作成例を通して、以下について知ることができます。
    • パラメータを使用したSQL文を発行する方法
    • INSERT、UPDATE、DELETEのSQL文を発行する方法

  • サンプルアプリケーションの内容
     パラメータを使用した複数のSQL文を発行し、取得結果を標準出力へ表示するバッチアプリケーションです。  
     サンプルアプリケーションの概要を下図に示します。

     
     
     パラメータを使用したSQL文を発行するには、DBアクセス設定ファイルのSQL文にパラメータ名を定義します。 また、サービスからDBアクセッサを利用するときに、SQL文のパラメータ名とその値をSQLパラメータとして渡します。
     INSERT、UPDATE、DELETEのSQL文を発行するには、「3.2DBアクセス - その1」のSELECTの時と同様に DBアクセス設定ファイルにSQL文を記述し、DBアクセッサを利用します。
     
     このサンプルでは以下のファイルについて説明します。  
    • DMLSample.java
       サービスのプログラムです。上図内の赤枠の部分に相当します。
    • dbaccessConfig.xml
       SQL文の設定ファイルです。このファイルに発行するSQL文を記述します。上図内のDBアクセス設定ファイルに相当します。
    • applicationContext.xml
       CB3がserviceContext.xmlなどのspringフレームワーク関連の設定ファイルを読み込むための起点となる コンテキストファイルです。
       このファイルは内容が「3.2DBアクセス - その1」と同じため省略します。
    • serviceContext.xml
       実行対象のサービスを定義します。
    • 起動用バッチファイル - dmlsample.bat
       サービスを起動するためのバッチファイルです。

 3.3.2サービスの作成

  • DMLSample .java

     01: public class DMLSample extends CB3Service {
     02:
     02:    /**
     03:     *パラメータを使用し、DML文を発行する。
     04:     */
     05:    @Override
     06:    protected int doService(ServiceParameters serviceparameters,
     07:            RuntimeParameters runtimeparameters) throws ServiceException {
     08:
     09:        System.out.println(System.getProperty("line.separator")+"DMLサンプル実行");
     10:        DBAccessor ac = (DBAccessor)getDataAccessContext().lookup("dbaccessConfig");
     11:
     12:        //不要行削除
     13:        ac.delete("delete");
     14:
     15:        //DB初期状態を確認
     16:        showRecord(ac.select("select1"),"select実行\n");
     17:
     18:        //insertを実行。パラメータを使用。
     19:        DBQueryParameterMap insertParam = new DBQueryParameterMap();
     20:        insertParam.put("ID", "1");
     21:        insertParam.put("VALUE","insertTest");
     22:        ac.insert("insert1",insertParam);
     23:        showRecord(ac.select("select1"),"insert実行");
     24:
     25:        //updateを実行。パラメータを使用。
     26:        DBQueryParameterMap updateParam = new DBQueryParameterMap();
     27:        updateParam.put("ID", "1");
     28:        updateParam.put("VALUE","updateTest");
     29:        ac.update("update1",updateParam);
     30:        showRecord(ac.select("select1"),"update実行");
     31:
     32:        //deleteを実行
     33:        ac.delete("delete");
     34:        showRecord(ac.select("select1"),"delete実行");
     35:        return ExitCodeConstant.SUCCESS;
     36:    }
     36:    ・・・・・・以下、省略
    

    19行目〜23行目:
    パラメータを使用したINSERT文を発行しています。INSERT文のキー(22行目の"insert1")に対応したINSERT文は以下のように定義されており、
    <insert id="insert1">
    INSERT INTO tutorial_table VALUES (:ID,:VALUE)
    </insert>
    
    「〜 VALUES (:ID,:VALUE)」部分の「:ID」と「:VALUE」がパラメータとして指定できる部分になります。20行目、21行目で CB3が提供するDBQueryParameterMapのオブジェクトに「:ID」と「:VALUE」の値を設定しています。そしてinsert()メソッドにINSERT文のキーとパラメータ を指定してinsert文を発行しています。26行目から29行目のUPDATE処理についても実装方法は同じです。

 3.3.3設定ファイルの作成

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

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <!-- 途中省略 -->
     03:    <!--select Sql  -->
     04:    <select id="select1" >
     05:        SELECT * FROM tutorial_table
     06:    </select>
     07:
     08:    <insert id="insert1">
     09:        INSERT INTO tutorial_table VALUES (:ID,:VALUE)
     10:    </insert>
     11:
     12:    <update id="update1">
     13:        UPDATE tutorial_table SET value = :VALUE WHERE id = :ID
     14:    </update>
     15:
     16:    <delete id="delete">
     17:        DELETE FROM tutorial_table
     18:    </delete>
     19:
     20:</db-accessor>
    

    このサンプルでは、複数のSQL文の定義と、INSERT文、UPDATE文においてパラメータの設定を行っています。 SELECT文、INSERT文、UPDATE文、DELETE文にはそれぞれに対応したタグを使用し、それぞれのタグが一意になるようidを指定します。

    9行目、13行目:
    パラメータを使用するには、「:VALUE」や「:ID」のように「:」を付けた文字列を指定します。

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

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <-- 途中省略 -->
     03:    <!-- ServiceProvider -->
     04:    <bean id="dmlsample" class="jp.co.cybec.cb3.container.provider.ServiceProviderImpl">
     05:        <property name="service"><ref bean="sample3"/></property>
     06:    </bean>
     07:    <!-- Service -->
     08:    <bean id="sample3" class="jp.co.cybec.cb3.sample.database.dmlsample.DMLSample">
     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行目:
    サービスの定義部分です。

    11行目〜17行目:
    「3.2DBアクセス - その1」で紹介したserviceContext.xmlの内容と同じです。

 3.3.4サービスの実行

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

    上記バッチファイルを実行すると下記のように表示されます。

    DMLサンプル実行
    select実行
    
    insert実行
    1  insertTest
    
    update実行
    1  updateTest
    
    delete実行
    続行するには何かキーを押してください . . .