    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.plugin.query;
    017
    018import java.sql.ResultSet;
    019import java.sql.SQLException;
    020import java.sql.Statement;
    021
    022import org.opengion.fukurou.util.ErrorMessage;
    023import org.opengion.hayabusa.common.HybsSystemException;
    024import org.opengion.hayabusa.db.AbstractQuery;
    025
    026/**
    027 * 指定のSQL文を実行して、検索する Query クラスです。
    028 *
    029 * java.sql.Statement を用いて、データベース検索処理を行います。
    030 * 引数は無しです。(与えられたSQL文を実行します。)
    031 * 内部変数の受け渡しのデフォルト実装は、AbstractQuery クラスを継承している
    032 * ため,ここでは、execute() メソッドを実装しています。
    033 * このクラスでは、ステートメント文を execute() する事により,データベースを
    034 * 検索した結果を DBTableModel に割り当てます。
    035 *
    036 * @og.formSample
    037 * &lt;og:query command=&quot;{&#064;command}&quot; debug=&quot;false&quot;&gt;
    038 *     &lt;!-- 先頭のカラム名が、&quot;WRITABLE&quot; の場合、&#39;true&#39; or &#39;1&#39; で、書き込み許可が与えら,&#39;2&#39; でチェック済みになります。--&gt;
    039 *         select KBSAKU AS WRITABLE,
    040 *                 CLM,NAME_JA,LABEL_NAME,KBSAKU,SYSTEM_ID,LANG,FGJ
    041 *         from GE41
    042 *     &lt;og:where&gt;
    043 *         &lt;og:and value = &quot;FGJ         in  (&#39;0&#39;,&#39;1&#39;)&quot;         /&gt;
    044 *         &lt;og:and value = &quot;SYSTEM_ID   like &#39;{&#064;SYSTEM_ID}%&#39;&quot;  /&gt;
    045 *         &lt;og:and value = &quot;LANG        like &#39;{&#064;LANG}%&#39;&quot;       /&gt;
    046 *         &lt;og:and value = &quot;CLM         like &#39;{&#064;CLM}%&#39;&quot;        /&gt;
    047 *         &lt;og:and value = &quot;KBSAKU      =    &#39;{&#064;KBSAKU}&#39;&quot;      /&gt;
    048 *     &lt;/og:where&gt;
    049 *     &lt;og:appear startKey = &quot;order by&quot; value = &quot;{&#064;ORDER_BY}&quot;
    050 *                 defaultVal = &quot;SYSTEM_ID,CLM,LANG&quot; /&gt;
    051 * &lt;/og:query&gt;
    052 *
    053 * @og.group データ表示
    054 * @og.group データ編集
    055 *
    056 * @version  4.0
    057 * @author   Kazuhiko Hasegawa
    058 * @since    JDK5.0,
    059 */
    060public class Query_JDBC extends AbstractQuery {
    061        /** このプログラムのVERSION文字列を設定します。   {@value} */
    062        private static final String VERSION = "6.9.3.0 (2018/03/26)" ;
    063
    064        /**
    065         * デフォルトコンストラクター
    066         *
    067         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    068         */
    069        public Query_JDBC() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    070
    071        /**
    072         * クエリーを実行します。
    073         * セットされているステートメント文字列とそのタイプが合っていない場合は,
    074         * エラーになります。
    075         * 実行結果は、DBTableModel にセットされます。
    076         *
    077         * ※ 6.1.1.0 (2015/01/17) 引数のargsは使いません。
    078         *
    079         * @og.rev 3.8.0.8 (2005/10/03) エラーメッセージの出力順をメッセージ＋Queryに変更します。
    080         * @og.rev 6.1.1.0 (2015/01/17) 引数配列を可変引数にして、execute() を含めて定義します。
    081         * @og.rev 6.3.6.1 (2015/08/28) close(),realClose() 廃止。Queryはキャッシュしません。
    082         * @og.rev 6.4.2.1 (2016/02/05) try-with-resources 文で記述。
    083         * @og.rev 6.9.3.0 (2018/03/26) DB_FETCH_SIZE追加。
    084         *
    085         * @param   args オブジェクトの引数配列(可変長引数)…ここでは使いません。
    086         */
    087        @Override
    088        public void execute( final String... args ) {                   // 6.1.1.0 (2015/01/17) refactoring
    089                // 6.4.2.1 (2016/02/05) try-with-resources 文
    090                try( final Statement stmt = getConnection().createStatement() ) {
    091                        stmt.setQueryTimeout( DB_MAX_QUERY_TIMEOUT );
    092                        stmt.setFetchSize( DB_FETCH_SIZE );                             // 6.9.3.0 (2018/03/26)
    093
    094                        final boolean status = stmt.execute( getStatement() );
    095
    096                        if( status ) {
    097                                // 6.4.2.1 (2016/02/05) try-with-resources 文
    098                                try( final ResultSet resultSet = stmt.getResultSet() ) {
    099                                        createTableModel( resultSet );
    100                                        setUpdateFlag( false );
    101                                }
    102                        }
    103                        else {
    104                                setExecuteCount( stmt.getUpdateCount() );
    105                        }
    106                        setErrorCode( ErrorMessage.OK );
    107                }
    108                catch( final SQLException ex ) {                // catch は、close() されてから呼ばれます。
    109                        setErrorCode( ErrorMessage.EXCEPTION );
    110                        final String errMsg = ex.getMessage() + ":" + ex.getSQLState() + CR
    111                                                + getStatement() + CR;
    112                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    113                }
    114        }
    115}