パッケージ org.opengion.fukurou.xml

## クラス HybsXMLSave

- java.lang.Object
- - org.opengion.fukurou.xml.HybsXMLSave

- すべての実装されたインタフェース:
    `TagElementListener`

      public class HybsXMLSave
      extends java.lang.Object
      implements TagElementListener

  このクラスは、オラクル XDKの oracle.xml.sql.dml.OracleXMLSave クラスと ほぼ同様の目的で使用できるクラスです。 拡張XDK形式のXMLファイルを読み込み、データベースに INSERT します。 拡張XDK形式の元となる オラクル XDK(Oracle XML Developer's Kit)については、以下の リンクを参照願います。 XDK(Oracle XML Developer's Kit) このクラスでは、MAP を登録する[ setDefaultMap( Map ) ]ことにより、 XMLファイルに存在しないカラムを初期値として設定することが可能になります。 例えば、登録日や、登録者、または、テンプレートより各システムID毎に 登録するなどです。 同様に、読み取った XMLファイルの情報を書き換える機能[ setAfterMap( Map ) ]メソッド により、カラムの値の置き換えも可能です。 拡張XDK形式の元となる オラクル XDK(Oracle XML Developer's Kit)については、以下の リンクを参照願います。 XDK(Oracle XML Developer's Kit) 拡張XDK形式とは、ROW 以外に、SQL処理用タグ(EXEC_SQL)を持つ XML ファイルです。 また、登録するテーブル(table)を ROWSETタグの属性情報として付与することができます。 (大文字小文字に注意) これは、オラクルXDKで処理する場合、無視されますので、同様に扱うことが出来ます。 この、EXEC_SQL は、それそれの XMLデータをデータベースに登録する際に、 SQL処理を自動的に流す為の、SQL文を記載します。 この処理は、イベント毎に実行される為、その配置順は重要です。 このタグは、複数記述することも出来ますが、BODY部には、１つのSQL文のみ記述します。 <ROWSET tableName="XX" > <EXEC_SQL> 最初に記載して、初期処理(データクリア等)を実行させる。 delete from GEXX where YYYYY </EXEC_SQL> <MERGE_SQL> このSQL文で UPDATEして、結果が０件ならINSERTを行います。 update GEXX set AA=[AA] , BB=[BB] where CC=[CC] </MERGE_SQL> <ROW num="1"> <カラム1>値1</カラム1> ･･･ <カラムn>値n</カラムn> </ROW> ･･･ <ROW num="n"> ･･･ </ROW> <EXEC_SQL> 最後に記載して、項目の設定(整合性登録)を行う。 update GEXX set AA='XX' , BB='XX' where YYYYY </EXEC_SQL> <ROWSET>
  変更履歴:
    7.0.1.3 (2018/11/12) EXEC_SQLで、";" で複数のSQL文に分割、実行します。
  バージョン
    7.0
  作成者
    Kazuhiko Hasegawa
  導入されたバージョン:
    JDK9.0,

- - ### コンストラクタの概要

    コンストラクタ
    コンストラクタ | 説明
    --- | ---
    `HybsXMLSave​(java.sql.Connection conn)` | コネクションを指定して、オブジェクトを構築します。
    `HybsXMLSave​(java.sql.Connection conn, java.lang.String table)` | コネクションとテーブル名を指定して、オブジェクトを構築します。

  - ### メソッドの概要

    すべてのメソッド staticメソッド インスタンス・メソッド concreteメソッド
    修飾子とタイプ | メソッド | 説明
    --- | --- | ---
    `void` | `actionExecSQL​(TagElement tag)` | <EXEC_SQL> タグの endElement 処理毎に呼び出されます。
    `void` | `actionInit​(TagElement tag)` | <ROWSET> タグの一番最初に呼び出されます。
    `void` | `actionMergeSQL​(TagElement tag)` | <MERGE_SQL> タグの endElement 処理時に呼び出されます。
    `void` | `actionRow​(TagElement tag)` | <ROW> タグの endElement 処理毎に呼び出されます。
    `int` | `getDDLCount()` | データベースにDDL（データ定義言語：Data Definition Language）処理した件数を返します。
    `int` | `getDeleteCount()` | データベースに変更(更新、削除を含む)した件数を返します。
    `int` | `getInsertCount()` | データベースに追加した件数を返します。
    `java.lang.String` | `getTableName()` | 実際に登録された テーブル名を返します。
    `int` | `getUpdateCount()` | データベースを更新した件数を返します。
    `void` | `insertXML​(java.io.Reader reader)` | データベースに追加処理(INSERT)を行います。
    `static void` | `main​(java.lang.String[] args)` | テスト用のメインメソッド Usage: java org.opengion.fukurou.xml.HybsXMLSave USER PASSWD URL TABLE FILE [ENCODE] [DRIVER] USER : DB接続ユーザー(GE) PASSWD : DB接続パスワード(GE) URL : DB接続JDBCドライバURL(jdbc:oracle:thin:@localhost:1521:HYBS TABLE : 登録するテーブルID(GE21) FILE : 登録するORACLE XDK 形式 XMLファイル(GE21.xml) [ENCODE]: ファイルのエンコード 初期値:UTF-8 [DRIVER]: JDBCドライバー 初期値:oracle.jdbc.OracleDriver ※ ファイルが存在しなかった場合、FileNotFoundException を RuntimeException に変換して、throw します。
    `void` | `onExecErrException​(boolean flag)` | EXEC_SQL のエラー時に Exception を発行するかどうかを指定できます(初期値:true)。
    `void` | `setAfterMap​(java.util.Map<java.lang.String,​java.lang.String> map)` | XMLファイルを読み取った後で指定するカラムと値のペア(マップ)情報をセットします。
    `void` | `setDefaultMap​(java.util.Map<java.lang.String,​java.lang.String> map)` | XMLファイルを読み取る前に指定するカラムと値のペア(マップ)情報をセットします。

    - ### クラスから継承されたメソッド java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### コンストラクタの詳細

    - #### HybsXMLSave

          public HybsXMLSave​(java.sql.Connection conn)

      コネクションを指定して、オブジェクトを構築します。 テーブル名は、拡張XDK形式のROWSETタグのtableName属性に 記述しておく必要があります。
      パラメータ:
        `conn` - データベース接続

    - #### HybsXMLSave

          public HybsXMLSave​(java.sql.Connection conn,
                             java.lang.String table)

      コネクションとテーブル名を指定して、オブジェクトを構築します。 ここで指定するテーブル名は、デフォルトテーブルという扱いです。 拡張XDK形式のROWSETタグのtableName属性にテーブル名が記述されている場合は、 そちらが優先されます。
      パラメータ:
        `conn` - データベース接続
        `table` - テーブル名(ROWSETタグのtable属性が未設定時に使用)
      変更履歴:
        4.0.0.0 (2007/09/25) ParameterMetaData を使用したパラメータ設定追加。, 5.3.8.0 (2011/08/01) useParamMetaData を このクラスで直接取得する。(PostgreSQL対応)

  - ### メソッドの詳細

    - #### onExecErrException

          public void onExecErrException​(boolean flag)

      EXEC_SQL のエラー時に Exception を発行するかどうかを指定できます(初期値:true)。 true を指定すると、エラー時には、 RuntimeException を throw します。 false にすると、標準エラー出力にのみ、出力します。 このフラグは、EXEC_SQL のみ有効です。それ以外のタブの処理では、エラーが発生すると その時点で、Exception を発行して、処理を終了します。 初期値は、true(Exception を発行する) です。
      パラメータ:
        `flag` - true:Exception を発行する/false:標準エラー出力に出力する
      変更履歴:
        5.6.9.2 (2013/10/18) 新規追加

    - #### actionInit

          public void actionInit​(TagElement tag)

      <ROWSET> タグの一番最初に呼び出されます。 ROWSET の属性である、table 属性と、dbid 属性 を、TagElement の get メソッドで取得できます。 取得時のキーは、それぞれ、"TABLE" と "DBID" です。
      定義:
        `actionInit` インタフェース内 `TagElementListener`
      パラメータ:
        `tag` - タグエレメント
      関連項目:
        `TagElement`, `HybsXMLHandler.setTagElementListener( TagElementListener )`

    - #### actionRow

          public void actionRow​(TagElement tag)

      <ROW> タグの endElement 処理毎に呼び出されます。 この Listener をセットすることにより、行データを取得都度、 TagElement オブジェクトを作成し、このメソッドが呼び出されます。
      定義:
        `actionRow` インタフェース内 `TagElementListener`
      パラメータ:
        `tag` - タグエレメント
      関連項目:
        `TagElement`, `HybsXMLHandler.setTagElementListener( TagElementListener )`
      変更履歴:
        4.0.0.0 (2007/05/09) ParameterMetaData を使用したパラメータ設定追加。, 4.0.0.0 (2007/09/25) isOracle から useParamMetaData に変更, 4.3.7.0 (2009/06/01) HSQLDB対応, 5.3.8.0 (2011/08/01) useParamMetaData setNull 対応(PostgreSQL対応), 5.6.6.1 (2013/07/12) lastSQL 対応。デバッグ用に、最後に使用したSQL文を残します。

    - #### actionExecSQL

          public void actionExecSQL​(TagElement tag)

      <EXEC_SQL> タグの endElement 処理毎に呼び出されます。 getBody メソッドを使用して、このタグのBODY部の文字列を取得します。 この Listener をセットすることにより、EXEC_SQL データを取得都度、 TagElement オブジェクトを作成し、このメソッドが呼び出されます。 EXEC_SQL タグでは、delete文やupdate文など、特殊な前処理や後処理用の SQLと DDL（データ定義言語：Data Definition Language）の処理なども記述できます。 ここでは簡易的に、何か実行された場合は、delete 処理と考え、削除カウントを加算し、 0件で帰ってきた場合に、DDLが実行されたと考え、DDLカウントを＋１します。 ただし、0件 delete も考えられるため、SQL文の先頭文字によるチェックは入れておきます。
      定義:
        `actionExecSQL` インタフェース内 `TagElementListener`
      パラメータ:
        `tag` - タグエレメント
      関連項目:
        `TagElement`, `HybsXMLHandler.setTagElementListener( TagElementListener )`
      変更履歴:
        5.6.6.1 (2013/07/12) lastSQL 対応。デバッグ用に、最後に使用したSQL文を残します。, 5.6.7.0 (2013/07/27) DDL（データ定義言語：Data Definition Language）の処理件数追加, 5.6.9.2 (2013/10/18) EXEC_SQL のエラー時に Exception を発行するかどうかを指定, 6.4.2.1 (2016/02/05) try-with-resources 文で記述。, 7.0.1.3 (2018/11/12) EXEC_SQLで、";" で複数のSQL文に分割、実行します。

    - #### actionMergeSQL

          public void actionMergeSQL​(TagElement tag)

      <MERGE_SQL> タグの endElement 処理時に呼び出されます。 getBody メソッドを使用して、このタグのBODY部の文字列を取得します。 MERGE_SQLタグは、マージ処理したいデータ部よりも上位に記述しておく 必要がありますが、中間部に複数回記述しても構いません。 このタグが現れるまでは、INSERT のみ実行されます。このタグ以降は、 一旦 UPDATE し、結果が ０件の場合は、INSERTする流れになります。 完全に INSERT のみであるデータを前半に、UPDATE/INSERTを行う データを後半に、その間に、MERGE_SQL タグを入れることで、無意味な UPDATE を避けることが可能です。 この Listener をセットすることにより、MERGE_SQL データを取得都度、 TagElement オブジェクトを作成し、このメソッドが呼び出されます。
      定義:
        `actionMergeSQL` インタフェース内 `TagElementListener`
      パラメータ:
        `tag` - タグエレメント
      関連項目:
        `TagElement`, `HybsXMLHandler.setTagElementListener( TagElementListener )`
      変更履歴:
        4.0.0.0 (2007/05/09) ParameterMetaData を使用したパラメータ設定追加。, 4.0.0.0 (2007/09/25) isOracle から useParamMetaData に変更, 5.6.6.1 (2013/07/12) lastSQL 対応。デバッグ用に、最後に使用したSQL文を残します。

    - #### setDefaultMap

          public void setDefaultMap​(java.util.Map<java.lang.String,​java.lang.String> map)

      XMLファイルを読み取る前に指定するカラムと値のペア(マップ)情報をセットします。 このカラムと値のペアのマップは、オブジェクト構築前に設定される為、 XMLファイルにキーが存在している場合は、値が書き変わります。(XML優先) XMLファイルにキーが存在していない場合は、ここで指定するMapの値が 初期設定値として使用されます。 ここで指定する Map に LinkedHashMap を使用する場合、カラム順も 指定することが出来ます。
      パラメータ:
        `map` - 初期設定するカラムデータマップ
      関連項目:
        `setAfterMap( Map )`

    - #### setAfterMap

          public void setAfterMap​(java.util.Map<java.lang.String,​java.lang.String> map)

      XMLファイルを読み取った後で指定するカラムと値のペア(マップ)情報をセットします。 このカラムと値のペアのマップは、オブジェクト構築後に設定される為、 XMLファイルのキーの存在に関係なく、Mapのキーと値が使用されます。(Map優先) null を設定した場合は、なにも処理されません。
      パラメータ:
        `map` - 後設定するカラムデータマップ
      関連項目:
        `setDefaultMap( Map )`

    - #### insertXML

          public void insertXML​(java.io.Reader reader)

      データベースに追加処理(INSERT)を行います。 先に指定されたコネクションを用いて、指定のテーブルに INSERT します。 引数には、XMLファイルを指定したリーダーをセットします。 コネクションは、終了後、コミットされます。(close されません。) リーダーのクローズは、ここでは行っていません。
      パラメータ:
        `reader` - XMLファイルを指定するリーダー
      変更履歴:
        5.1.1.0 (2009/11/11) insMeta , updMeta のクリア(気休め)

    - #### getInsertCount

          public int getInsertCount()

      データベースに追加した件数を返します。
      戻り値:
        登録件数

    - #### getUpdateCount

          public int getUpdateCount()

      データベースを更新した件数を返します。 これは、拡張XDK形式で、MERGE_SQL タグを使用した場合の更新処理件数を 合計した値を返します。
      戻り値:
        更新件数

    - #### getDeleteCount

          public int getDeleteCount()

      データベースに変更(更新、削除を含む)した件数を返します。 これは、拡張XDK形式で、EXEC_SQL タグを使用した場合の実行件数を合計した 値を返します。 よって、更新か、追加か、削除かは、判りませんが、通常 登録前に削除する ケースで使われることから、deleteCount としています。
      戻り値:
        変更件数(主に、削除件数)

    - #### getDDLCount

          public int getDDLCount()

      データベースにDDL（データ定義言語：Data Definition Language）処理した件数を返します。 これは、拡張XDK形式で、EXEC_SQL タグを使用した場合の実行件数を合計した 値を返します。 EXEC_SQL では、登録前に削除する delete 処理も、EXEC_SQL タグを使用して実行しますが その処理と分けてカウントします。
      戻り値:
        DDL（データ定義言語：Data Definition Language）処理した件数
      変更履歴:
        5.6.7.0 (2013/07/27) DDL（データ定義言語：Data Definition Language）の処理件数追加

    - #### getTableName

          public java.lang.String getTableName()

      実際に登録された テーブル名を返します。 テーブル名は、拡張XDK形式のROWSETタグのtableName属性に 記述しておくか、コンストラクターで引数として渡します。 両方指定された場合は、ROWSETタグのtableName属性が優先されます。 ここでの返り値は、実際に使用された テーブル名です。
      戻り値:
        変更件数(主に、削除件数)

    - #### main

          public static void main​(java.lang.String[] args)
                           throws java.lang.ClassNotFoundException,
                                  java.sql.SQLException

      テスト用のメインメソッド Usage: java org.opengion.fukurou.xml.HybsXMLSave USER PASSWD URL TABLE FILE [ENCODE] [DRIVER] USER : DB接続ユーザー(GE) PASSWD : DB接続パスワード(GE) URL : DB接続JDBCドライバURL(jdbc:oracle:thin:@localhost:1521:HYBS TABLE : 登録するテーブルID(GE21) FILE : 登録するORACLE XDK 形式 XMLファイル(GE21.xml) [ENCODE]: ファイルのエンコード 初期値:UTF-8 [DRIVER]: JDBCドライバー 初期値:oracle.jdbc.OracleDriver ※ ファイルが存在しなかった場合、FileNotFoundException を RuntimeException に変換して、throw します。 ※ 指定のエンコードが存在しなかった場合、UnsupportedEncodingException を RuntimeException に変換して、throw します。
      パラメータ:
        `args` - コマンド引数配列
      例外:
        `java.lang.ClassNotFoundException` - クラスを見つけることができなかった場合。
        `java.sql.SQLException` - データベース接続エラーが発生した場合。
      変更履歴:
        5.1.1.0 (2009/12/01) MySQL対応 明示的に、TRANSACTION_READ_COMMITTED を指定する。, 5.6.7.0 (2013/07/27) DDL（データ定義言語：Data Definition Language）の処理件数追加, 6.4.2.1 (2016/02/05) try-with-resources 文で記述。