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.fukurou.process; 017 018import java.sql.PreparedStatement; 019import java.sql.ParameterMetaData; 020import java.sql.SQLException; 021 022/** 023 * PstmtSetterUtil は、Process系のデータベース登録時の ParameterMetaData を 024 * 使用した、PreparedStatement の バインド変数セット処理を共通化した staticメソッド群です。 025 * 026 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 027 * 028 * @version 8.5 029 * @author Kazuhiko Hasegawa 030 * @since JDK21.0, 031 */ 032final class PstmtSetterUtil { 033 034 /** 035 * デフォルトコンストラクターをprivateにして、 036 * オブジェクトの生成をさせないようにする。 037 * 038 * @og.rev 8.5.3.2 (2023/10/13) JDK21対応。警告: デフォルトのコンストラクタの使用で、コメントが指定されていません 039 */ 040 private PstmtSetterUtil() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 041 042 /** 043 * PreparedStatement の 変数設定を行います。 044 * 045 * ParameterMetaData の使用可否に応じてセット方法を切り替えます。 046 * 047 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 048 * 049 * @param pstmt PreparedStatementオブジェクト 050 * @param pmeta ParameterMetaDataオブジェクト( null の場合は、使用しない) 051 * @param data LineModelオブジェクト 052 * @param clmNos カラム番号を保持した配列 053 * 054 * @throws java.sql.SQLException データベース・アクセス・エラーが発生した場合 055 */ 056 public static void pstmtValueSet( final PreparedStatement pstmt, 057 final ParameterMetaData pmeta, 058 final LineModel data, 059 final int[] clmNos ) throws SQLException { 060 // 注意:オリジナルの if文と 処理が反転しています。 061 if( pmeta == null ) { 062 for( int i=0; i<clmNos.length; i++ ) { 063 pstmt.setObject( i+1,data.getValue(clmNos[i]) ); 064 } 065 } 066 else { 067 for( int i=0; i<clmNos.length; i++ ) { 068 final int type = pmeta.getParameterType( i+1 ); 069 // 5.3.8.0 (2011/08/01) setNull 対応 070 final Object val = data.getValue(clmNos[i]); 071 if( val == null || val instanceof String && ((String)val).isEmpty() ) { 072 pstmt.setNull( i+1, type ); 073 } 074 else { 075 pstmt.setObject( i+1, val, type ); 076 } 077 } 078 } 079 } 080}