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.fileexec; 017 018import java.sql.Connection; 019import java.sql.ResultSet; 020import java.sql.PreparedStatement; 021import java.sql.ParameterMetaData; 022import java.sql.SQLException; 023import java.sql.SQLIntegrityConstraintViolationException; // 7.4.1.0 (2021/04/23) 024import java.util.Map; 025import java.util.List; 026import java.util.ArrayList; 027import java.util.Arrays; 028 029import org.apache.tomcat.jdbc.pool.DataSource; 030import org.apache.tomcat.jdbc.pool.PoolProperties; 031 032import org.opengion.fukurou.system.HybsConst; // 7.2.3.1 (2020/04/17) 033import org.opengion.fukurou.db.Transaction; // 7.4.2.0 (2021/05/14) 034import org.opengion.fukurou.db.ResultSetValue; // 8.5.6.1 (2024/03/29) org.opengion.fukurou.db.ResultSetValue を使用ã™ã‚‹ 035 036/** 037 * データベース処ç†ã‚’è¡Œã†ã€ç°¡æ˜“çš„ãªãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ãƒ¼ã‚¯ãƒ©ã‚¹ã§ã™ã€‚ 038 * staticメソッドã—ã‹æŒã£ã¦ã„ã¾ã›ã‚“。 039 * sql文を execute( query ) ã™ã‚‹äº‹ã«ã‚ˆã‚Šã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ 040 * 041 * ã“ã®ã‚¯ãƒ©ã‚¹ã¯ã€ãƒžãƒ«ãƒã‚¹ãƒ¬ãƒƒãƒ‰ã«å¯¾ã—ã¦ã€å®‰å…¨ã§ã™ã€‚ 042 * 043 * @version 4.0 044 * @author Kazuhiko Hasegawa 045 * @since JDK5.0, 046 */ 047public final class DBUtil { 048 private static final XLogger LOGGER= XLogger.getLogger( DBUtil.class.getSimpleName() ); // ãƒã‚°å‡ºåŠ› 049 050 /** データï¾ï¾žï½°ï½½ã®ï½·ï½°ï¾œï½°ï¾„゙ {@value} */ 051 public static final String DATABASE_KEY = "DATABASE"; 052 053 /** 接続先URL {@value} */ 054 public static final String URL_KEY = "REALM_URL"; 055 /** ドライバー {@value} */ 056 public static final String DRIVER_KEY = "REALM_DRIVER"; 057 /** ユーザーID {@value} */ 058 public static final String NAME_KEY = "REALM_NAME"; 059 /** パスワード {@value} */ 060 public static final String PASSWORD_KEY = "REALM_PASSWORD"; 061 062 /** データベースリトライã®å¾…ã¡æ™‚é–“(ミリ秒) {@value} */ 063 public static final int CONN_SLEEP_TIME = 2000 ; // 6.8.2.2 (2017/11/02) コãƒã‚¯ã‚·ãƒ§ãƒ³ã®ç²å¾—ã¾ã§ã€ï¼’秒待㤠064 /** データベースリトライ回数 {@value} */ 065 public static final int CONN_RETRY_COUNT = 10 ; // 6.8.2.2 (2017/11/02) コãƒã‚¯ã‚·ãƒ§ãƒ³ã®ç²å¾—ã¾ã§ã€ï¼‘ï¼å›žãƒªãƒˆãƒ©ã‚¤ã™ã‚‹ã€‚ 066 /** データベースValid タイムアウト時間(秒) {@value} */ 067 public static final int CONN_VALID_TIMEOUT = 10 ; // 6.8.2.2 (2017/11/02) コãƒã‚¯ã‚·ãƒ§ãƒ³ã®Validãƒã‚§ãƒƒã‚¯ã®ã‚¿ã‚¤ãƒ アウト時間。 068 069 /** データ検索時ã®ãƒ•ã‚§ãƒƒãƒã‚µã‚¤ã‚º {@value} */ 070 public static final int DB_FETCH_SIZE = 251 ; 071 072 private static final DataSource DATA_SOURCE = new DataSource(); 073 074 private static boolean readyFlag ; // 準備ãŒå‡ºæ¥ãŸå ´åˆã¯ã€true 075 private static boolean oracleFlag ; // 接続先ãŒORACLEã®å ´åˆã¯ã€true 076 077 private static final int BUFFER_MIDDLE = 200 ; 078 079 /** 080 * デフォルトコï¾ï½½ï¾„ラクターをprivateã«ã—ã¦ã€ 081 * オブジェクトã®ç”Ÿæˆã‚’ã•ã›ãªã„よã†ã«ã™ã‚‹ã€‚ 082 */ 083 private DBUtil() {} 084 085 /** 086 * 引数を指定ã›ãšã€ã‚ªãƒ–ジェクトを作æˆã—ã¾ã™ã€‚ 087 * 088 * System.getProperty よりå–å¾—ã—ã€ã•ã‚‰ã«ã€ãã“ã‹ã‚‰å–å¾—ã§ããªã‹ã£ãŸ 089 * å ´åˆã¯ã€ç’°å¢ƒå¤‰æ•°ã‹ã‚‰ã€å–å¾—ã—ã¾ã™ã€‚ 090 * 091 * @og.rev 7.2.3.1 (2020/04/17) System.getenv → HybsConst.getenv 変更(サービス化対応) 092 * 093 * @see #URL_KEY 094 */ 095 public static void init() { 096// init( System.getProperty( URL_KEY , System.getenv( URL_KEY ) ) , 097// System.getProperty( DRIVER_KEY , System.getenv( DRIVER_KEY ) ) , 098// System.getProperty( NAME_KEY , System.getenv( NAME_KEY ) ) , 099// System.getProperty( PASSWORD_KEY , System.getenv( PASSWORD_KEY ) ) 100// ); 101 init( HybsConst.getenv( URL_KEY ) , 102 HybsConst.getenv( DRIVER_KEY ) , 103 HybsConst.getenv( NAME_KEY ) , 104 HybsConst.getenv( PASSWORD_KEY ) 105 ); 106 } 107 108 /** 109 * 接続先URLã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã€ãƒ‘スワードãªã©ã‚’å«ã‚“ã Mapを指定ã—ã¦ã€ã‚ªãƒ–ジェクトを作æˆã—ã¾ã™ã€‚ 110 * 111 * Mapã«æŒ‡å®šã®ã‚ーãŒå«ã¾ã‚Œãªã„å ´åˆã¯ã€System.getProperty よりå–å¾—ã—ã€ã•ã‚‰ã«ã€ãã“ã‹ã‚‰å–å¾—ã§ããªã‹ã£ãŸ 112 * å ´åˆã¯ã€ç’°å¢ƒå¤‰æ•°ã‹ã‚‰ã€å–å¾—ã—ã¾ã™ã€‚ 113 * 114 * @og.rev 7.2.3.1 (2020/04/17) System.getenv → HybsConst.getenv 変更(サービス化対応) 115 * 116 * @param prmMap å¿…è¦æƒ…å ±ã‚’å«ã‚“ã Mapオブジェクト 117 * @see #URL_KEY 118 */ 119 public static void init( final Map<String,String> prmMap ) { 120// init( prmMap.getOrDefault( URL_KEY , System.getProperty( URL_KEY , System.getenv( URL_KEY ) ) ) , 121// prmMap.getOrDefault( DRIVER_KEY , System.getProperty( DRIVER_KEY , System.getenv( DRIVER_KEY ) ) ) , 122// prmMap.getOrDefault( NAME_KEY , System.getProperty( NAME_KEY , System.getenv( NAME_KEY ) ) ) , 123// prmMap.getOrDefault( PASSWORD_KEY , System.getProperty( PASSWORD_KEY , System.getenv( PASSWORD_KEY ) ) ) 124// ); 125 init( prmMap.getOrDefault( URL_KEY , HybsConst.getenv( URL_KEY ) ) , 126 prmMap.getOrDefault( DRIVER_KEY , HybsConst.getenv( DRIVER_KEY ) ) , 127 prmMap.getOrDefault( NAME_KEY , HybsConst.getenv( NAME_KEY ) ) , 128 prmMap.getOrDefault( PASSWORD_KEY , HybsConst.getenv( PASSWORD_KEY ) ) 129 ); 130 } 131 132 /** 133 * 接続先URLã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã€ãƒ‘スワードを指定ã—ã¦ã€ã‚ªãƒ–ジェクトを作æˆã—ã¾ã™ã€‚ 134 * 135 * params ã¯ã€å¿…ãšã€ï¼”ã¤å¿…è¦ã§ã™ã€‚ 136 * 137 * @param params 接続先URLã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã€ãƒ‘スワード 138 * @see #isReady() 139 */ 140 public static void init( final String... params ) { 141 if( readyFlag ) { 142 // MSG0024 = ã™ã§ã«ã€æŽ¥ç¶šå…ˆè¨å®šã¯å®Œäº†ã—ã¦ã„ã¾ã™ã€‚[{0}] 143 throw MsgUtil.throwException( "MSG0024" , DATA_SOURCE ); 144 } 145 146 if( params == null || params.length != 4 ) { 147 // MSG0027 = 接続先è¨å®šæƒ…å ±ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚[{0}] 148 throw MsgUtil.throwException( "MSG0027" , Arrays.toString( params ) ); 149 } 150 151 final PoolProperties pp = new PoolProperties(); 152 pp.setUrl( params[0] ); 153 pp.setDriverClassName( params[1] ); 154 pp.setUsername( params[2] ); 155 pp.setPassword( params[3] ); 156 157 DATA_SOURCE.setPoolProperties( pp ); 158 readyFlag = true; 159 160 oracleFlag = params[0] != null && params[0].startsWith( "jdbc:oracle" ); 161 } 162 163 /** 164 * DataSourceã®åˆæœŸåŒ–ãŒå®Œäº†ã—ã¦ã„ã‚Œã°ã€true ã‚’è¿”ã—ã¾ã™ã€‚ 165 * 166 * åˆæœŸåŒ–ã¯ã€#init(String...) メソッドã®å‘¼ã³å‡ºã—ã¦ã€å®Œäº†ã—ã¾ã™ã€‚ 167 * #crear() ã§ã€æœªå®Œäº†ã«æˆ»ã‚Šã¾ã™ã€‚ 168 * 169 * @return åˆæœŸåŒ–ãŒå®Œäº†ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ 170 * @see #init(String...) 171 */ 172 public static boolean isReady() { return readyFlag; } 173 174 /** 175 * 接続先ãŒORACLEã‹ã©ã†ã‹ã‚’è¿”ã—ã¾ã™ã€‚ 176 * 177 * ORACLE ã®å ´åˆã¯ã€true ã‚’è¿”ã—ã¾ã™ã€‚ 178 * 179 * @return 接続先ãŒORACLEã‹ã©ã†ã‹[true:ORACLE false:ãã®ä»–] 180 */ 181 public static boolean isOracle() { return oracleFlag; } 182 183 /** 184 * DataSource ã‹ã‚‰ã€Connectionã‚’å–å¾—ã—ã¦ã€è¿”ã—ã¾ã™ã€‚ 185 * 186 * @og.rev 6.8.2.2 (2017/11/02) コãƒã‚¯ã‚·ãƒ§ãƒ³ã®å†å–得をリトライã—ã¾ã™ã€‚ 187 * @og.rev 7.2.5.0 (2020/06/01) DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã®ã‚¨ãƒ©ãƒ¼ã¯ã€ï¼“回ã¾ã§ã¯ã€ä½•ã‚‚出ã•ãªã„。 188 * 189 * @return DataSourceã‹ã‚‰ã€Connectionã‚’å–å¾—ã—ã¦ã€è¿”ã—ã¾ã™ã€‚ 190 * @throws SQLException SQLエラーãŒç™ºç”Ÿã—ãŸå ´åˆ 191 */ 192 public static Connection getConnection() throws SQLException { 193 if( !readyFlag ) { 194 // // MSG0025 = 接続先è¨å®šãŒå®Œäº†ã—ã¦ã„ã¾ã›ã‚“。 195 // throw MsgUtil.throwException( "MSG0025" , "getConnection() Error!!" ); 196 init(); 197 } 198 199 SQLException errEX = null; 200 for( int i=0; i<CONN_RETRY_COUNT; i++ ) { 201 try { 202 final Connection conn = DATA_SOURCE.getConnection(); 203 conn.setAutoCommit( false ); 204 205 if( conn.isValid( CONN_VALID_TIMEOUT ) ) { return conn; } 206 } 207 catch( final SQLException ex ) { 208 if( i >= 3 ) { // ã¨ã‚Šã‚ãˆãšï¼“回ã¾ã§ã¯ã€ä½•ã‚‚出ã•ãªã„ 209// // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 210// MsgUtil.errPrintln( "MSG0019" , ex.getMessage() ); 211 // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 212 MsgUtil.errPrintln( "MSG0019" , ex.getMessage() , "" ); 213 } 214 215 errEX = ex ; 216// try{ Thread.sleep( CONN_SLEEP_TIME ); } catch( final InterruptedException ex2 ){} 217 try { Thread.sleep( CONN_SLEEP_TIME ); } catch( final InterruptedException ignored ) {} // 8.5.4.2 (2024/01/12) PMD 7.0.0 EmptyCatchBlock 218 } 219 } 220 221 final String errMsg = errEX == null ? "COUNT Over" : errEX.getMessage() ; 222// // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 223// throw MsgUtil.throwException( errEX , "MSG0019" , errMsg , "getConnection" , "" ); 224 // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 225 throw MsgUtil.throwException( errEX , "MSG0019" , errMsg , "getConnection" ); 226 } 227 228 /** 229 * データé…列を渡ã—ã¦PreparedStatementã®å¼•æ•°ã«ã€å€¤ã‚’セットã—ã¾ã™ã€‚ 230 * 231 * オラクル系ã®å ´åˆã¯ã€ãã®ã¾ã¾ã€setObject ã‚’è¡Œãˆã°ã€è‡ªå‹•å¤‰æ›ã—ã¾ã™ãŒã€ 232 * ãれ以外ã®DBã§ã¯ã€java.sql.Types を渡ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã•ã‚‰ã«ã€null 値もã€setNullを使用ã—ã¾ã™ã€‚ 233 * 今ã¯ã€pMeta ãŒã€null ã‹ã©ã†ã‹ã§ã€ã‚ªãƒ©ã‚¯ãƒ«ç³»ã‹ã€ã©ã†ã‹ã‚’判定ã™ã‚‹ã‚ˆã†ã«ã—ã¦ã„ã¾ã™ã€‚ 234 * 235 * @param pstmt PreparedStatementオブジェクト 236 * @param values ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 237 * @param pMeta オラクル系以外ã®DBã«å¯¾ã—ã¦ã€type指定ã™ã‚‹å ´åˆã«ä½¿ç”¨ã™ã‚‹ ParameterMetaDataオブジェクト 238 * 239 * @throws SQLException DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 240 */ 241 private static void setObject( final PreparedStatement pstmt , final String[] values , final ParameterMetaData pMeta ) throws SQLException { 242 if( values != null && values.length > 0 ) { 243 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 244 if( pMeta == null ) { 245 int clmNo = 1; // JDBC ã®ã‚«ãƒ©ãƒ 番å·ã¯ã€ï¼‘ã‹ã‚‰å§‹ã¾ã‚‹ã€‚ 246 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ForLoopCanBeForeach 247// for( int i=0; i<values.length; i++ ) { 248// final String val = values[i]; 249// pstmt.setObject( clmNo++,val ); 250// } 251 for( final String val : values ) { 252 pstmt.setObject( clmNo++,val ); 253 } 254 } 255 else { 256 int clmNo = 1; // JDBC ã®ã‚«ãƒ©ãƒ 番å·ã¯ã€ï¼‘ã‹ã‚‰å§‹ã¾ã‚‹ã€‚ 257 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ForLoopCanBeForeach 258// for( int i=0; i<values.length; i++ ) { 259// final String val = values[i]; 260 for( final String val : values ) { 261 final int type = pMeta.getParameterType( clmNo ); 262 if( val == null || val.isEmpty() ) { 263 pstmt.setNull( clmNo++, type ); 264 } 265 else { 266 pstmt.setObject( clmNo++,val,type ); 267 } 268 } 269 } 270 } 271 } 272 273 /** 274 * データé…列を渡ã—ã¦å®Ÿéš›ã®DB処ç†ã‚’実行ã—ã¾ã™ã€‚ 275 * 276 * ã“ã“ã§ã¯ã€ï¼‘è¡Œã ã‘処ç†ã™ã‚‹ãŸã‚ã®ç°¡æ˜“メソッドをæä¾›ã—ã¾ã™ã€‚ 277 * 278 * @param query 実行ã™ã‚‹SQLæ–‡ 279 * @param values ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 280 * @return ã“ã“ã§ã®å‡¦ç†ä»¶æ•° 281 * 282 * @throws RuntimeException Connection DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 283 */ 284 public static int execute( final String query , final String... values ) { 285// final List<String[]> list = new ArrayList<>(); 286// list.add( values ); 287// 288// return execute( query,list ); 289 290 int execCnt = 0; 291 292 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 293 SQLException throwEx = null; 294 // try-with-resources æ–‡ (AutoCloseable) 295 try( Connection conn = getConnection() ) { 296 // try-with-resources æ–‡ ã¯ã€close()ã—ã¦ã‹ã‚‰ã€commit()後ã«ã€catch節ãŒå‘¼ã°ã‚Œã‚‹ã€‚ 297 try( PreparedStatement pstmt = conn.prepareStatement( query ) ) { 298 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 299 final ParameterMetaData pMeta = oracleFlag ? null : pstmt.getParameterMetaData(); 300 301 setObject( pstmt , values , pMeta ); 302 execCnt = pstmt.executeUpdate(); // 1回ãªã®ã§ã€+= ã®å¿…è¦æ€§ã¯ç„¡ã„。 303 304 conn.commit(); 305 } 306 catch( final SQLException ex ) { 307 conn.rollback(); 308 conn.setAutoCommit(true); 309 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 310// throw ex; 311 throwEx = ex; 312 } 313 } 314 catch( final SQLException ex ) { 315 // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 316 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 317// throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( values ) ); 318 throwEx = ex; 319 } 320 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 321 // 8.5.5.1 (2024/02/29) PMD 7.0.0 DoNotThrowExceptionInFinally 322// finally { 323 if( throwEx != null ) { 324 // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 325 throw MsgUtil.throwException( throwEx , "MSG0019" , query , Arrays.toString( values ) ); 326 } 327// } 328 329 return execCnt; 330 } 331 332 /** 333 * データé…列を渡ã—ã¦å®Ÿéš›ã®DB処ç†ã‚’実行ã—ã¾ã™ã€‚ 334 * 335 * ã“ã“ã§ã¯ã€ï¼‘è¡Œã ã‘処ç†ã™ã‚‹ãŸã‚ã®ç°¡æ˜“メソッドをæä¾›ã—ã¾ã™ã€‚ 336 * 337 * @og.rev 7.4.2.0 (2021/05/14) 外部ã‹ã‚‰æŒ‡å®šã™ã‚‹Transactionオブジェクト 対応 338 * 339 * @param tarn 外部ã‹ã‚‰æŒ‡å®šã™ã‚‹Transactionオブジェクト 340 * @param query 実行ã™ã‚‹SQLæ–‡ 341 * @param values ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 342 * @return ã“ã“ã§ã®å‡¦ç†ä»¶æ•° 343 * 344 * @throws RuntimeException Connection DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 345 */ 346 public static int execute( final Transaction tarn , final String query , final String... values ) { 347 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UnusedAssignment 348// int execCnt = 0; 349 final int execCnt ; 350 351// // try-with-resources æ–‡ (AutoCloseable) 352// try( Connection conn = tarn.getConnection( null ) ) { 353 final Connection conn = tarn.getConnection( null ); 354// try { 355 // try-with-resources æ–‡ ã¯ã€close()ã—ã¦ã‹ã‚‰ã€commit()後ã«ã€catch節ãŒå‘¼ã°ã‚Œã‚‹ã€‚ 356 try( PreparedStatement pstmt = conn.prepareStatement( query ) ) { 357 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 358 final ParameterMetaData pMeta = oracleFlag ? null : pstmt.getParameterMetaData(); 359 360 setObject( pstmt , values , pMeta ); 361 execCnt = pstmt.executeUpdate(); // 1回ãªã®ã§ã€+= ã®å¿…è¦æ€§ã¯ç„¡ã„。 362 363 tarn.commit(); 364 } 365 catch( final SQLException ex ) { 366 tarn.rollback(); 367 // conn.setAutoCommit(true); 368 // throw ex; 369 // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 370 throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( values ) ); 371 } 372 // } 373 // catch( final SQLException ex ) { 374 // // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 375 // throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( values ) ); 376 // } 377 378 return execCnt; 379 } 380 381 /** 382 * データé…列ã®Listを渡ã—ã¦å®Ÿéš›ã®DB処ç†ã‚’実行ã—ã¾ã™ã€‚ 383 * 384 * データé…列ã¯ã€ï¼‘行分ã®ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹è¨å®šå€¤ã®é…列ã§ã™ã€‚ 385 * ã“ã‚Œã¯ã€keys ã§æŒ‡å®šã—ãŸä¸¦ã³é †ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 386 * 387 * @og.rev 7.4.1.0 (2021/04/23) 途ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãるよã†ã«ã—ã¾ã™ã€‚ 388 * 389 * @param query 実行ã™ã‚‹SQLæ–‡ 390 * @param list ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 391 * @return ã“ã“ã§ã®å‡¦ç†ä»¶æ•° 392 * 393 * @throws RuntimeException Connection DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 394 */ 395 public static int execute( final String query , final List<String[]> list ) { 396 return execute( query,list,true ); // 互æ›æ€§ç¢ºä¿ã€‚true ã§ï½´ï¾—ー発生時ã«ã€Exception ã‚’ throw ã™ã‚‹ã€‚ 397 } 398 399 /** 400 * データé…列ã®Listを渡ã—ã¦å®Ÿéš›ã®DB処ç†ã‚’実行ã—ã¾ã™ã€‚ 401 * 402 * データé…列ã¯ã€ï¼‘行分ã®ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹è¨å®šå€¤ã®é…列ã§ã™ã€‚ 403 * ã“ã‚Œã¯ã€keys ã§æŒ‡å®šã—ãŸä¸¦ã³é †ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 404 * 405 * 処ç†ã®é€”ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãã‚‹ï¾Œï¾—ï½¸ï¾žã‚’è¿½åŠ ã—ã¦ã„ã¾ã™ã€‚ 406 * false ã«è¨å®šã—ãŸå ´åˆã¯ã€ï½´ï¾—ï½°ãŒç™ºç”Ÿã—ã¦ã‚‚処ç†ã‚’継続ã—ã¦ã€commit ã—ã¾ã™ã€‚(7.4.1.0 (2021/04/23) ) 407 * 408 * @og.rev 6.8.1.5 (2017/09/08) LOGGER.debug æƒ…å ±ã®è¿½åŠ 409 * @og.rev 7.4.1.0 (2021/04/23) 途ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãるよã†ã«ã—ã¾ã™ã€‚ 410 * 411 * @param query 実行ã™ã‚‹SQLæ–‡ 412 * @param list ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 413 * @param useErrro false ã«è¨å®šã™ã‚‹ã¨ã€é€”ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ã¦ã‚‚処ç†ã‚’継続ã™ã‚‹ã€‚ 414 * @return ã“ã“ã§ã®å‡¦ç†ä»¶æ•° 415 * 416 * @throws RuntimeException Connection DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 417 */ 418 public static int execute( final String query , final List<String[]> list , final boolean useErrro ) { 419 LOGGER.debug( () -> "execute query=" + query ); 420 421 String[] debugLine = null; 422 int execCnt = 0; 423 424 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 425 SQLException throwEx = null; 426 // try-with-resources æ–‡ (AutoCloseable) 427 try( Connection conn = getConnection() ) { 428 // try-with-resources æ–‡ ã¯ã€close()ã—ã¦ã‹ã‚‰ã€commit()後ã«ã€catch節ãŒå‘¼ã°ã‚Œã‚‹ã€‚ 429 try( PreparedStatement pstmt = conn.prepareStatement( query ) ) { // æ›´æ–°ç³»ãªã®ã§ã€setFetchSize ã¯ä¸è¦ã€‚ 430 431 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 432 final ParameterMetaData pMeta = oracleFlag ? null : pstmt.getParameterMetaData(); 433 434 for( final String[] values : list ) { 435 debugLine = values; 436 LOGGER.debug( () -> "execute values=" + Arrays.toString( values ) ); 437 setObject( pstmt , values , pMeta ); 438 439 // 7.4.1.0 (2021/04/23) 途ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãるよã†ã«ã—ã¾ã™ã€‚ 440 try { 441 execCnt += pstmt.executeUpdate(); 442 } 443 catch( final SQLIntegrityConstraintViolationException ex ) { 444 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 445// if( useErrro ) { throw ex; } 446 if( useErrro ) { throwEx = ex; break; } 447 else { 448 // MSG0033 = æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\n\tメッセージ=[{0}]\n\tquery=[{1}]\n\tvalues={2} 449 MsgUtil.errPrintln( "MSG0033" , ex.getMessage() , query , Arrays.toString( debugLine ) ); 450 } 451 } 452 } 453 454 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 455// conn.commit(); 456 if( throwEx == null ) { conn.commit(); } 457 } 458 catch( final SQLException ex ) { 459 conn.rollback(); 460 conn.setAutoCommit(true); 461 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 462// throw ex; 463 throwEx = ex; 464 } 465 } 466 catch( final SQLException ex ) { 467// // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 468// throw MsgUtil.throwException( ex , "MSG0019" , ex.getMessage() , query , Arrays.toString( debugLine ) ); 469 // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 470 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 471// throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( debugLine ) ); 472 throwEx = ex; 473 } 474 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 475 // 8.5.5.1 (2024/02/29) PMD 7.0.0 DoNotThrowExceptionInFinally 476// finally { 477 if( throwEx != null ) { 478 // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 479 throw MsgUtil.throwException( throwEx , "MSG0019" , query , Arrays.toString( debugLine ) ); 480 } 481// } 482 483 return execCnt; 484 } 485 486 /** 487 * データé…列ã®Listを渡ã—ã¦å®Ÿéš›ã®DB処ç†ã‚’実行ã—ã¾ã™ã€‚(暫定メソッド) 488 * 489 * ã“ã‚Œã¯ã€updQueryã§ã€æ›´æ–°ã—ã¦ã¿ã¦ã€ï¼ä»¶ã®å ´åˆã€insQuery ã§è¿½åŠ 処ç†ã‚’è¡Œã„ã¾ã™ã€‚ 490 * 491 * データé…列ã¯ã€ï¼‘行分ã®ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹è¨å®šå€¤ã®é…列ã§ã™ã€‚ 492 * ã“ã‚Œã¯ã€keys ã§æŒ‡å®šã—ãŸä¸¦ã³é †ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 493 * 494 * 処ç†ã®é€”ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãã‚‹ï¾Œï¾—ï½¸ï¾žã‚’è¿½åŠ ã—ã¦ã„ã¾ã™ã€‚ 495 * false ã«è¨å®šã—ãŸå ´åˆã¯ã€ï½´ï¾—ï½°ãŒç™ºç”Ÿã—ã¦ã‚‚処ç†ã‚’継続ã—ã¦ã€commit ã—ã¾ã™ã€‚ (7.4.1.0 (2021/04/23) ) 496 * 497 * @og.rev 7.4.1.0 (2021/04/23) 途ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãるよã†ã«ã—ã¾ã™ã€‚ 498 * 499 * @param insQuery è¿½åŠ ã™ã‚‹SQLæ–‡ 500 * @param updQuery æ›´æ–°ã™ã‚‹SQLæ–‡ 501 * @param insList ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 502 * @param updList ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 503 * @return ã“ã“ã§ã®å‡¦ç†ä»¶æ•° 504 * 505 * @throws RuntimeException Connection DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 506 */ 507 public static int execute( final String insQuery , final String updQuery , final List<String[]> insList , final List<String[]> updList ) { 508 return execute( insQuery,updQuery,insList,updList,true ); // 互æ›æ€§ç¢ºä¿ã€‚true ã§ï½´ï¾—ー発生時ã«ã€Exception ã‚’ throw ã™ã‚‹ã€‚ 509 } 510 511 /** 512 * データé…列ã®Listを渡ã—ã¦å®Ÿéš›ã®DB処ç†ã‚’実行ã—ã¾ã™ã€‚(暫定メソッド) 513 * 514 * ã“ã‚Œã¯ã€updQueryã§ã€æ›´æ–°ã—ã¦ã¿ã¦ã€ï¼ä»¶ã®å ´åˆã€insQuery ã§è¿½åŠ 処ç†ã‚’è¡Œã„ã¾ã™ã€‚ 515 * 516 * データé…列ã¯ã€ï¼‘行分ã®ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹è¨å®šå€¤ã®é…列ã§ã™ã€‚ 517 * ã“ã‚Œã¯ã€keys ã§æŒ‡å®šã—ãŸä¸¦ã³é †ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 518 * 519 * @og.rev 6.8.1.5 (2017/09/08) LOGGER.debug æƒ…å ±ã®è¿½åŠ 520 * @og.rev 7.4.1.0 (2021/04/23) 途ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãるよã†ã«ã—ã¾ã™ã€‚ 521 * 522 * @param insQuery è¿½åŠ ã™ã‚‹SQLæ–‡ 523 * @param updQuery æ›´æ–°ã™ã‚‹SQLæ–‡ 524 * @param insList ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 525 * @param updList ?ã«å‰²ã‚Šå½“ã¦ã‚‹è¨å®šå€¤ 526 * @param useErrro false ã«è¨å®šã™ã‚‹ã¨ã€é€”ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ã¦ã‚‚処ç†ã‚’継続ã™ã‚‹ã€‚ 527 * @return ã“ã“ã§ã®å‡¦ç†ä»¶æ•° 528 * 529 * @throws RuntimeException Connection DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 530 */ 531 public static int execute( final String insQuery , final String updQuery , final List<String[]> insList , final List<String[]> updList , final boolean useErrro ) { 532 LOGGER.debug( () -> "execute insQuery=" + insQuery + " , updQuery=" + updQuery ); 533 534 String[] debugLine = null; 535 String query = null; 536 537 int execCnt = 0; 538 539 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 540 SQLException throwEx = null; 541 // try-with-resources æ–‡ (AutoCloseable) 542 try( Connection conn = getConnection() ) { 543 // try-with-resources æ–‡ ã¯ã€close()ã—ã¦ã‹ã‚‰ã€commit()後ã«ã€catch節ãŒå‘¼ã°ã‚Œã‚‹ã€‚ 544 try( PreparedStatement inPstmt = conn.prepareStatement( insQuery ); 545 PreparedStatement upPstmt = conn.prepareStatement( updQuery ) ) { 546 547 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 548 final ParameterMetaData inpMeta = oracleFlag ? null : inPstmt.getParameterMetaData(); 549 final ParameterMetaData uppMeta = oracleFlag ? null : upPstmt.getParameterMetaData(); 550 551 for( int i=0; i<updList.size(); i++ ) { // 更新処ç†ã¨ã€æŒ¿å…¥å‡¦ç†ã¯ã€åŒã˜æ•°ã®Listを用æ„ã™ã‚‹ã€‚ 552 query = updQuery; 553 // 更新処ç†ã‚’è¡Œã†ã€‚ 554 final String[] upVals = updList.get(i); 555 debugLine = upVals; 556 setObject( upPstmt , upVals , uppMeta ); 557 558 int cnt = upPstmt.executeUpdate(); 559 560 if( cnt <= 0 ) { // æ›´æ–°ãŒç„¡ã„ã€ã¤ã¾ã‚Šã€è¿½åŠ 対象 561 query = insQuery; 562 // 挿入処ç†ã‚’è¡Œã†ã€‚ 563 final String[] inVals = insList.get(i); 564 debugLine = inVals; 565 setObject( inPstmt , inVals , inpMeta ); 566 567 LOGGER.debug( () -> "execute INSERT=" + Arrays.toString( inVals ) ); 568 569 // 7.4.1.0 (2021/04/23) 途ä¸ã§æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ãŸå ´åˆã«ç¶™ç¶šã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã§ãるよã†ã«ã—ã¾ã™ã€‚ 570 try { 571 cnt = inPstmt.executeUpdate(); 572 } 573 catch( final SQLIntegrityConstraintViolationException ex ) { 574 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 575// if( useErrro ) { throw ex; } 576 if( useErrro ) { throwEx = ex; break; } 577 else { 578 cnt = 0; // エラー時ã«è¨å®šã•ã‚Œãªã„ã¨ã€-1 ã®ã¾ã¾ãªã®ã§ã€‚ 579 // MSG0033 = æ•´åˆæ€§åˆ¶ç´„é•åãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\n\tメッセージ=[{0}]\n\tquery=[{1}]\n\tvalues={2} 580 MsgUtil.errPrintln( "MSG0033" , ex.getMessage() , insQuery , Arrays.toString( debugLine ) ); 581 } 582 } 583 } 584 else { // 元々ã€ã“ã®else ã¯å¿…è¦ãªã„。UPDATE ã¯ã€å…ˆã«å‡¦ç†æ¸ˆ 585 LOGGER.debug( () -> "execute UPDATE=" + Arrays.toString( upVals ) ); 586 } 587 588 execCnt += cnt; 589 } 590 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 591// conn.commit(); 592 if( throwEx == null ) { conn.commit(); } 593 } 594 catch( final SQLException ex ) { 595 conn.rollback(); 596 conn.setAutoCommit(true); 597 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 598// throw ex; 599 throwEx = ex; 600 } 601 } 602 catch( final SQLException ex ) { 603// // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 604// throw MsgUtil.throwException( ex , "MSG0019" , ex.getMessage() , query , Arrays.toString( debugLine ) ); 605 // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 606 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 607// throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( debugLine ) ); 608 throwEx = ex; 609 } 610 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 611 // 8.5.5.1 (2024/02/29) PMD 7.0.0 DoNotThrowExceptionInFinally 612// finally { 613 if( throwEx != null ) { 614 // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 615 throw MsgUtil.throwException( throwEx , "MSG0019" , query , Arrays.toString( debugLine ) ); 616 } 617// } 618 619 return execCnt; 620 } 621 622 /** 623 * 検索ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定ã—ã¦ã€Queryを実行ã—ã¾ã™(Transaction 対応)。 624 * 625 * ステートメントã¨å¼•æ•°ã«ã‚ˆã‚Šã€Prepared クエリーã®æ¤œç´¢ã®ã¿å®Ÿè¡Œã—ã¾ã™ã€‚ 626 * çµæžœã¯ã€ã™ã¹ã¦æ–‡å—列ã«å¤‰æ›ã•ã‚Œã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚ 627 * 628 * @param query ステートメント文å—列 629 * @param args オブジェクトã®å¼•æ•°é…列 630 * 631 * @return 検索çµæžœã®ãƒªã‚¹ãƒˆé…列(çµæžœãŒç„¡ã‘ã‚Œã°ã€ã‚µã‚¤ã‚ºã‚¼ãƒã®ãƒªã‚¹ãƒˆ) 632 * @throws RuntimeException DB検索処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 633 * @og.rtnNotNull 634 */ 635 public static List<String[]> dbQuery( final String query , final String... args ) { 636 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 637 SQLException throwEx = null; 638 // try-with-resources æ–‡ (AutoCloseable) 639 try( Connection conn = getConnection() ) { 640 // try-with-resources æ–‡ ã¯ã€close()ã—ã¦ã‹ã‚‰ã€commit()後ã«ã€catch節ãŒå‘¼ã°ã‚Œã‚‹ã€‚ 641 try( PreparedStatement pstmt = conn.prepareStatement( query ) ) { 642 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 643 final ParameterMetaData pMeta = oracleFlag ? null : pstmt.getParameterMetaData(); 644 // 6.4.3.2 (2016/02/19) args ㌠null ã§ãªãã€length==0 ã§ãªã„å ´åˆã®ã¿ã€å‡¦ç†ã™ã‚‹ã€‚ 645 setObject( pstmt , args , pMeta ); 646 647 if( pstmt.execute() ) { 648 try( ResultSet resultSet = pstmt.getResultSet() ) { 649 return resultToArray( resultSet ); 650 } 651 } 652 conn.commit(); 653 } 654 catch ( final SQLException ex ) { 655 conn.rollback(); 656 conn.setAutoCommit(true); 657 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 658// throw ex; 659 throwEx = ex; 660 } 661 } 662 catch ( final SQLException ex ) { 663// // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 664// throw MsgUtil.throwException( ex , "MSG0019" , ex.getMessage() , query , Arrays.toString( args ) ); 665 // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 666 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 667// throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( args ) ); 668 throwEx = ex; 669 } 670 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応 671 // 8.5.5.1 (2024/02/29) PMD 7.0.0 DoNotThrowExceptionInFinally (return ã§æŠœã‘ãªã„) 672// finally { 673 if( throwEx != null ) { 674 // MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッセージ=[{0}]。\n\tquery=[{1}]\n\tvalues={2} 675 throw MsgUtil.throwException( throwEx , "MSG0019" , query , Arrays.toString( args ) ); 676 } 677// } 678 679 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseDiamondOperator 対応 680// return new ArrayList<String[]>(); 681 return new ArrayList<>(); 682 } 683 684 /** 685 * 検索ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定ã—ã¦ã€Queryを実行ã—ã¾ã™(Transaction 対応)。 686 * 687 * ステートメントã¨å¼•æ•°ã«ã‚ˆã‚Šã€Prepared クエリーã®æ¤œç´¢ã®ã¿å®Ÿè¡Œã—ã¾ã™ã€‚ 688 * çµæžœã¯ã€ã™ã¹ã¦æ–‡å—列ã«å¤‰æ›ã•ã‚Œã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚ 689 * 690 * @og.rev 7.4.2.0 (2021/05/14) 外部ã‹ã‚‰æŒ‡å®šã™ã‚‹Transactionオブジェクト 対応 691 * 692 * @param tarn 外部ã‹ã‚‰æŒ‡å®šã™ã‚‹Transactionオブジェクト 693 * @param query ステートメント文å—列 694 * @param args オブジェクトã®å¼•æ•°é…列 695 * 696 * @return 検索çµæžœã®ãƒªã‚¹ãƒˆé…列(çµæžœãŒç„¡ã‘ã‚Œã°ã€ã‚µã‚¤ã‚ºã‚¼ãƒã®ãƒªã‚¹ãƒˆ) 697 * @throws RuntimeException DB検索処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸå ´åˆ 698 * @og.rtnNotNull 699 */ 700 public static List<String[]> dbQuery( final Transaction tarn , final String query , final String... args ) { 701 final Connection conn = tarn.getConnection( null ); 702 703 // try-with-resources æ–‡ (AutoCloseable) 704 // try( Connection conn = tarn.getConnection( null ) ) { 705 // try-with-resources æ–‡ ã¯ã€close()ã—ã¦ã‹ã‚‰ã€commit()後ã«ã€catch節ãŒå‘¼ã°ã‚Œã‚‹ã€‚ 706 try( PreparedStatement pstmt = conn.prepareStatement( query ) ) { 707 // ORACLE ã§ã¯ã€ParameterMetaDataã¯ã€ä½¿ã‚ãªã„。 708 final ParameterMetaData pMeta = oracleFlag ? null : pstmt.getParameterMetaData(); 709 // 6.4.3.2 (2016/02/19) args ㌠null ã§ãªãã€length==0 ã§ãªã„å ´åˆã®ã¿ã€å‡¦ç†ã™ã‚‹ã€‚ 710 setObject( pstmt , args , pMeta ); 711 712 if( pstmt.execute() ) { 713 try( ResultSet resultSet = pstmt.getResultSet() ) { 714 return resultToArray( resultSet ); 715 } 716 } 717 tarn.commit(); 718 } 719 catch ( final SQLException ex ) { 720 tarn.rollback(); 721 // conn.setAutoCommit(true); 722 // throw ex; 723 // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 724 throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( args ) ); 725 } 726 // } 727 // catch ( final SQLException ex ) { 728 // // 7.2.5.0 (2020/06/01) MSG0019 = DB処ç†ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n\tquery=[{0}]\n\tvalues={1} 729 // throw MsgUtil.throwException( ex , "MSG0019" , query , Arrays.toString( args ) ); 730 // } 731 732 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseDiamondOperator 対応 733// return new ArrayList<String[]>(); 734 return new ArrayList<>(); 735 } 736 737 /** 738 * ResultSet よりã€çµæžœã®æ–‡å—列é…列を作æˆã—ã¾ã™ã€‚ 739 * 740 * çµæžœã¯ã€ã™ã¹ã¦æ–‡å—列ã«å¤‰æ›ã•ã‚Œã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚ 741 * 移動ã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ã§ä½¿ã‚ã‚Œã¦ã„ã‚‹ã®ã§ã“れも移動 742 * 743 * @param resultSet ResultSetオブジェクト 744 * 745 * @return ResultSetã®æ¤œç´¢çµæžœãƒªã‚¹ãƒˆé…列 746 * @throws java.sql.SQLException データベース・アクセス・エラーãŒç™ºç”Ÿã—ãŸå ´åˆ 747 * @og.rtnNotNull 748 */ 749 public static List<String[]> resultToArray( final ResultSet resultSet ) throws SQLException { 750// final ArrayList<String[]> data = new ArrayList<>(); 751 final List<String[]> data = new ArrayList<>(); // 8.5.4.2 (2024/01/12) PMD 7.0.0 LooseCoupling 752 753 final ResultSetValue rsv = new ResultSetValue( resultSet ); 754 755 while( rsv.next() ) { 756 data.add( rsv.getValues() ); 757 } 758 759 return data; 760 } 761 762 /** 763 * データをインサートã™ã‚‹å ´åˆã«ä½¿ç”¨ã™ã‚‹SQL文を作æˆã—ã¾ã™ã€‚ 764 * 765 * ã“ã‚Œã¯ã€key ã«å¯¾å¿œã—㟠? æ–‡å—列ã§ã€SQL文を作æˆã—ã¾ã™ã€‚ 766 * 実際ã®å€¤è¨å®šã¯ã€ã“ã®ã€ã‚ーã®ä¸¦ã³é †ã«å¿œã˜ãŸå€¤ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ 767 * conKeysã¨conValsã¯ã€å›ºå®šå€¤ã®ã‚ーã¨å€¤ã§ã™ã€‚ 768 * conKeys,conVals ãŒnullã®å ´åˆã¯ã€ã“れらã®å€¤ã‚’使用ã—ã¾ã›ã‚“。 769 * 770 * @param table テーブルID 771 * @param keys è¨å®šå€¤ã«å¯¾å¿œã™ã‚‹ã‚ーé…列 772 * @param conKeys 固定値ã®è¨å®šå€¤ã«å¯¾å¿œã™ã‚‹ã‚ーé…列 773 * @param conVals 固定値ã«å¯¾å¿œã™ã‚‹å€¤é…列 774 * @return インサートSQL 775 * @og.rtnNotNull 776 */ 777 public static String getInsertSQL( final String table , final String[] keys , final String[] conKeys , final String[] conVals ) { 778 final String[] vals = new String[keys.length]; 779 Arrays.fill( vals , "?" ); 780 781 final boolean useConst = conKeys != null && conVals != null && conKeys.length == conVals.length && conKeys.length > 0 ; 782 783 final StringBuilder sql = new StringBuilder( BUFFER_MIDDLE ) 784 .append( "INSERT INTO " ).append( table ) 785 .append( " ( " ) 786 .append( String.join( "," , keys ) ); 787 788 if( useConst ) { 789 sql.append( ',' ).append( String.join( "," , conKeys ) ); 790 } 791 792 sql.append( " ) VALUES ( " ) 793 .append( String.join( "," , vals ) ); 794 795 if( useConst ) { 796 sql.append( ",'" ).append( String.join( "','" , conVals ) ).append( '\'' ); 797 } 798 799 return sql.append( " )" ).toString(); 800 } 801 802 /** 803 * データをアップデートã™ã‚‹å ´åˆã«ä½¿ç”¨ã™ã‚‹SQL文を作æˆã—ã¾ã™ã€‚ 804 * 805 * ã“ã‚Œã¯ã€key ã«å¯¾å¿œã—㟠? æ–‡å—列ã§ã€SQL文を作æˆã—ã¾ã™ã€‚ 806 * 実際ã®å€¤è¨å®šã¯ã€ã“ã®ã€ã‚ーã®ä¸¦ã³é †ã«å¿œã˜ãŸå€¤ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ 807 * WHERE æ–‡å—列ã¯ã€ã“ã®ã€ï¼Ÿ ã‚‚å«ã‚ãŸWHEREæ¡ä»¶ã®æ–‡å—列を渡ã—ã¾ã™ã€‚ 808 * WHEREæ¡ä»¶ã®å ´åˆã¯ã€ã“ã®ã€ï¼Ÿã«ã€é–¢æ•°ã‚’è¨å®šã—ãŸã‚Šã€æ¡ä»¶ã‚’指定ã—ãŸã‚Šã€ 809 * 色々ãªã‚±ãƒ¼ã‚¹ãŒã‚ã‚‹ãŸã‚ã€å˜ç´”ã«ã‚ーã ã‘指定ã™ã‚‹æ–¹æ³•ã§ã¯ã€å¯¾å¿œç¯„囲㌠810 * é™ã‚‰ã‚Œã‚‹ãŸã‚ã§ã™ã€‚ 811 * conKeysã¨conValsã¯ã€å›ºå®šå€¤ã®ã‚ーã¨å€¤ã§ã™ã€‚ 812 * conKeys,conVals,where ãŒnullã®å ´åˆã¯ã€ã“れらã®å€¤ã‚’使用ã—ã¾ã›ã‚“。 813 * 814 * @og.rev 7.2.5.0 (2020/06/01) UPDATEã§ã€? ã‚’å«ã‚€ï½·ï½°ï¾œï½°ï¾„゙をã€å‡¦ç†ã§ãるよã†ã«ã—ã¾ã™ã€‚ 815 * 816 * @param table テーブルID 817 * @param keys è¨å®šå€¤ã«å¯¾å¿œã™ã‚‹ã‚ーé…列 818 * @param conKeys 固定値ã®è¨å®šå€¤ã«å¯¾å¿œã™ã‚‹ã‚ーé…列 819 * @param conVals 固定値ã«å¯¾å¿œã™ã‚‹å€¤é…列(VARCHARã®ã¿) 820 * @param where WHEREæ¡ä»¶å¼ 821 * @return アップデートSQL 822 * @og.rtnNotNull 823 */ 824 public static String getUpdateSQL( final String table , final String[] keys , final String[] conKeys , final String[] conVals , final String where ) { 825 final boolean useConst = conKeys != null && conVals != null && conKeys.length == conVals.length && conKeys.length > 0 ; 826 827 final StringBuilder sql = new StringBuilder( BUFFER_MIDDLE ) 828 .append( "UPDATE " ).append( table ).append( " SET " ); 829// .append( String.join( " = ? ," , keys ) ) // key[0] = ? , ・・・ = ? , key[n-1] ã¨ã„ã†æ–‡å—列ãŒä½œæˆã•ã‚Œã¾ã™ã€‚ 830// .append( " = ? " ); // 最後㮠key[n-1] ã®å¾Œã‚ã« = ? ã¨ã„ã†æ–‡å—åˆ—ã‚’è¿½åŠ ã—ã¾ã™ã€‚ 831 for( final String key : keys ) { 832 sql.append( key ); 833 if( ! key.contains( "?" ) ) { 834 sql.append( " = ? " ); // key = ? ã¨ã„ã†æ–‡å—列ãŒä½œæˆã•ã‚Œã¾ã™ã€‚ 835 } 836 sql.append( ',' ); 837 } 838 sql.deleteCharAt( sql.length() - 1 ); // 最後ã®ä¸€æ–‡å—(,)を削除ã—ã¾ã™ã€‚ 839 840 if( useConst ) { 841 for( int i=0; i<conKeys.length; i++ ) { 842 sql.append( ',' ).append( conKeys[i] ).append( " = '" ).append( conVals[i] ).append( "' " ); 843 } 844 } 845 846 if( where != null && !where.isEmpty() ) { 847 sql.append( " WHERE " ).append( where ); // WHEREæ¡ä»¶ã¯ã€? ã«é–¢æ•°ãŒå…¥ã£ãŸã‚Šã™ã‚‹ãŸã‚ã€äºˆã‚æ–‡å—列を作æˆã—ã¦ãŠã„ã¦ã‚‚らã†ã€‚ 848 } 849 850 return sql.toString(); 851 } 852 853 /** 854 * データをデリートã™ã‚‹å ´åˆã«ä½¿ç”¨ã™ã‚‹SQL文を作æˆã—ã¾ã™ã€‚ 855 * 856 * ã“ã‚Œã¯ã€key ã«å¯¾å¿œã—㟠? æ–‡å—列ã§ã€SQL文を作æˆã—ã¾ã™ã€‚ 857 * 実際ã®å€¤è¨å®šã¯ã€ã“ã®ã€ã‚ーã®ä¸¦ã³é †ã«å¿œã˜ãŸå€¤ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ 858 * WHERE æ–‡å—列ã¯ã€ã“ã®ã€ï¼Ÿ ã‚‚å«ã‚ãŸWHEREæ¡ä»¶ã®æ–‡å—列を渡ã—ã¾ã™ã€‚ 859 * WHEREæ¡ä»¶ã®å ´åˆã¯ã€ã“ã®ã€ï¼Ÿã«ã€é–¢æ•°ã‚’è¨å®šã—ãŸã‚Šã€æ¡ä»¶ã‚’指定ã—ãŸã‚Šã€ 860 * 色々ãªã‚±ãƒ¼ã‚¹ãŒã‚ã‚‹ãŸã‚ã€å˜ç´”ã«ã‚ーã ã‘指定ã™ã‚‹æ–¹æ³•ã§ã¯ã€å¯¾å¿œç¯„囲㌠861 * é™ã‚‰ã‚Œã‚‹ãŸã‚ã§ã™ã€‚ 862 * 863 * @param table テーブルID 864 * @param where è¨å®šå€¤ã«å¯¾å¿œã™ã‚‹ã‚ーé…列(å¯å¤‰é•·å¼•æ•°) 865 * @return デリートSQL 866 * @og.rtnNotNull 867 */ 868 public static String getDeleteSQL( final String table , final String where ) { 869 final StringBuilder sql = new StringBuilder( BUFFER_MIDDLE ) 870 .append( "DELETE FROM " ).append( table ); 871 872 if( where != null && !where.isEmpty() ) { 873 sql.append( " WHERE " ).append( where ); // WHEREæ¡ä»¶ã¯ã€? ã«é–¢æ•°ãŒå…¥ã£ãŸã‚Šã™ã‚‹ãŸã‚ã€äºˆã‚æ–‡å—列を作æˆã—ã¦ãŠã„ã¦ã‚‚らã†ã€‚ 874 } 875 876 return sql.toString(); 877 } 878}