• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

future-architect / uroborosql / #692

pending completion
#692

push

HidekiSugimoto189
Added output judgment for log output arguments that are string processed

53 of 53 new or added lines in 6 files covered. (100.0%)

7895 of 8761 relevant lines covered (90.12%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.51
/src/main/java/jp/co/future/uroborosql/AbstractAgent.java
1
/**
2
 * Copyright (c) 2017-present, Future Corporation
3
 *
4
 * This source code is licensed under the MIT license found in the
5
 * LICENSE file in the root directory of this source tree.
6
 */
7
package jp.co.future.uroborosql;
8

9
import java.sql.CallableStatement;
10
import java.sql.Connection;
11
import java.sql.PreparedStatement;
12
import java.sql.SQLException;
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.Collections;
16
import java.util.Iterator;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.Spliterator;
20
import java.util.Spliterators;
21
import java.util.concurrent.atomic.AtomicReference;
22
import java.util.stream.Stream;
23
import java.util.stream.StreamSupport;
24

25
import org.slf4j.Logger;
26
import org.slf4j.LoggerFactory;
27

28
import jp.co.future.uroborosql.config.SqlConfig;
29
import jp.co.future.uroborosql.connection.ConnectionContext;
30
import jp.co.future.uroborosql.context.SqlContext;
31
import jp.co.future.uroborosql.coverage.CoverageData;
32
import jp.co.future.uroborosql.coverage.CoverageHandler;
33
import jp.co.future.uroborosql.dialect.Dialect;
34
import jp.co.future.uroborosql.enums.InsertsType;
35
import jp.co.future.uroborosql.enums.SqlKind;
36
import jp.co.future.uroborosql.exception.EntitySqlRuntimeException;
37
import jp.co.future.uroborosql.exception.UroborosqlRuntimeException;
38
import jp.co.future.uroborosql.filter.SqlFilterManager;
39
import jp.co.future.uroborosql.fluent.Procedure;
40
import jp.co.future.uroborosql.fluent.SqlBatch;
41
import jp.co.future.uroborosql.fluent.SqlEntityQuery;
42
import jp.co.future.uroborosql.fluent.SqlQuery;
43
import jp.co.future.uroborosql.fluent.SqlUpdate;
44
import jp.co.future.uroborosql.mapping.EntityHandler;
45
import jp.co.future.uroborosql.mapping.TableMetadata;
46
import jp.co.future.uroborosql.parser.ContextTransformer;
47
import jp.co.future.uroborosql.parser.SqlParser;
48
import jp.co.future.uroborosql.parser.SqlParserImpl;
49
import jp.co.future.uroborosql.store.SqlManager;
50
import jp.co.future.uroborosql.tx.LocalTransactionManager;
51
import jp.co.future.uroborosql.tx.SQLRunnable;
52
import jp.co.future.uroborosql.tx.SQLSupplier;
53
import jp.co.future.uroborosql.tx.TransactionManager;
54
import jp.co.future.uroborosql.utils.CaseFormat;
55
import jp.co.future.uroborosql.utils.StringUtils;
56

57
/**
58
 * SqlAgentの抽象親クラス
59
 *
60
 * @author H.Sugimoto
61
 */
62
public abstract class AbstractAgent implements SqlAgent {
63
        /** ロガー */
64
        private static final Logger LOG = LoggerFactory.getLogger(AbstractAgent.class);
1✔
65

66
        /** SQLカバレッジ用ロガー */
67
        protected static final Logger COVERAGE_LOG = LoggerFactory.getLogger(SqlAgent.class.getPackage().getName()
1✔
68
                        + "sql.coverage");
69

70
        /** ログ出力を抑止するためのMDCキー */
71
        protected static final String SUPPRESS_PARAMETER_LOG_OUTPUT = "SuppressParameterLogOutput";
72

73
        /** SqlContext属性キー:リトライカウント */
74
        protected static final String CTX_ATTR_KEY_RETRY_COUNT = "__retryCount";
75

76
        /** SqlContext属性キー:バインドパラメータコメントの出力有無 */
77
        protected static final String CTX_ATTR_KEY_OUTPUT_BIND_COMMENT = "__outputBindComment";
78

79
        /** 例外発生にロールバックが必要なDBでリトライを実現するために設定するSavepointの名前 */
80
        protected static final String RETRY_SAVEPOINT_NAME = "__retry_savepoint";
81

82
        /** BATCH-INSERT用のバッチフレームの判定条件 */
83
        protected static final InsertsCondition<Object> DEFAULT_BATCH_INSERTS_WHEN_CONDITION = (context, count,
1✔
84
                        row) -> count == 1000;
1✔
85

86
        /** BULK-INSERT用のバッチフレームの判定条件 */
87
        protected static final InsertsCondition<Object> DEFAULT_BULK_INSERTS_WHEN_CONDITION = (context, count,
1✔
88
                        row) -> count == 10;
1✔
89

90
        /** 一括UPDATE用のバッチフレームの判定条件 */
91
        protected static final UpdatesCondition<Object> DEFAULT_UPDATES_WHEN_CONDITION = (context, count,
1✔
92
                        row) -> count == 1000;
1✔
93

94
        /** カバレッジハンドラ */
95
        protected static AtomicReference<CoverageHandler> coverageHandlerRef = new AtomicReference<>();
1✔
96

97
        /** SQL設定管理クラス */
98
        protected SqlConfig sqlConfig;
99

100
        /** トランザクション管理機能 */
101
        protected TransactionManager transactionManager;
102

103
        /** クエリータイムアウト制限値 */
104
        protected int queryTimeout = -1;
1✔
105

106
        /** フェッチサイズ */
107
        protected int fetchSize = -1;
1✔
108

109
        /** SQL実行エラー時にリトライするエラーコードのリスト */
110
        protected List<String> sqlRetryCodes = Collections.emptyList();
1✔
111

112
        /** SQL実行エラー時の最大リトライ回数 */
113
        protected int maxRetryCount = 0;
1✔
114

115
        /** SQL実行リトライ時の待機時間(ms) */
116
        protected int retryWaitTime = 0;
1✔
117

118
        /** SQLを特定するための一意なIDに置換するためのキー */
119
        protected String keySqlId = "_SQL_ID_";
1✔
120

121
        /** Queryの結果を格納するMapのキーを生成する際に使用するCaseFormat */
122
        protected CaseFormat defaultMapKeyCaseFormat = CaseFormat.UPPER_SNAKE_CASE;
1✔
123

124
        /** デフォルトの{@link InsertsType} */
125
        protected InsertsType defaultInsertsType = InsertsType.BATCH;
1✔
126

127
        static {
128
                // SQLカバレッジ取得用のクラス名を設定する。指定がない場合、またはfalseが指定された場合はカバレッジを収集しない。
129
                // クラス名が指定されている場合はそのクラス名を指定
130
                String sqlCoverageClassName = System.getProperty(KEY_SQL_COVERAGE);
1✔
131
                if (sqlCoverageClassName == null || Boolean.FALSE.toString().equalsIgnoreCase(sqlCoverageClassName)) {
1✔
132
                        sqlCoverageClassName = null;
×
133
                } else if (Boolean.TRUE.toString().equalsIgnoreCase(sqlCoverageClassName)) {
1✔
134
                        // trueの場合は、デフォルト値を設定
135
                        sqlCoverageClassName = AbstractAgent.class.getPackage().getName() + ".coverage.CoberturaCoverageHandler";
1✔
136
                }
137

138
                CoverageHandler handler = null;
1✔
139
                if (sqlCoverageClassName != null) {
1✔
140
                        try {
141
                                handler = (CoverageHandler) Class.forName(sqlCoverageClassName, true,
1✔
142
                                                Thread.currentThread().getContextClassLoader()).newInstance();
1✔
143
                        } catch (Exception ex) {
×
144
                                LOG.warn("Failed to generate CoverageHandler class. Class:{}, Cause:{}", sqlCoverageClassName,
×
145
                                                ex.getMessage());
×
146
                        }
1✔
147
                }
148

149
                if (handler != null) {
1✔
150
                        coverageHandlerRef.set(handler);
1✔
151
                }
152
        }
1✔
153

154
        /**
155
         * コンストラクタ。
156
         *
157
         * @param sqlConfig SQL設定管理クラス
158
         * @param settings 設定情報
159
         * @param connectionContext DB接続情報
160
         */
161
        protected AbstractAgent(final SqlConfig sqlConfig, final Map<String, String> settings,
162
                        final ConnectionContext connectionContext) {
1✔
163
                this.sqlConfig = sqlConfig;
1✔
164
                this.transactionManager = new LocalTransactionManager(sqlConfig, connectionContext);
1✔
165

166
                // デフォルトプロパティ設定
167
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_FETCH_SIZE)) {
1✔
168
                        this.fetchSize = Integer.parseInt(settings.get(SqlAgentFactory.PROPS_KEY_FETCH_SIZE));
1✔
169
                }
170
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_QUERY_TIMEOUT)) {
1✔
171
                        this.queryTimeout = Integer.parseInt(settings.get(SqlAgentFactory.PROPS_KEY_QUERY_TIMEOUT));
1✔
172
                }
173
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_SQL_RETRY_CODES)) {
1✔
174
                        this.sqlRetryCodes = Collections.unmodifiableList(Arrays.asList(settings.get(
1✔
175
                                        SqlAgentFactory.PROPS_KEY_SQL_RETRY_CODES).split(",")));
1✔
176
                }
177
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_DEFAULT_MAX_RETRY_COUNT)) {
1✔
178
                        this.maxRetryCount = Integer.parseInt(settings.get(SqlAgentFactory.PROPS_KEY_DEFAULT_MAX_RETRY_COUNT));
×
179
                }
180
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_DEFAULT_SQL_RETRY_WAIT_TIME)) {
1✔
181
                        this.retryWaitTime = Integer.parseInt(settings
×
182
                                        .get(SqlAgentFactory.PROPS_KEY_DEFAULT_SQL_RETRY_WAIT_TIME));
×
183
                }
184
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_SQL_ID_KEY_NAME)) {
1✔
185
                        this.keySqlId = settings.get(SqlAgentFactory.PROPS_KEY_SQL_ID_KEY_NAME);
1✔
186
                }
187
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_DEFAULT_MAP_KEY_CASE_FORMAT)) {
1✔
188
                        this.defaultMapKeyCaseFormat = CaseFormat.valueOf(settings
1✔
189
                                        .get(SqlAgentFactory.PROPS_KEY_DEFAULT_MAP_KEY_CASE_FORMAT));
1✔
190
                }
191
                if (settings.containsKey(SqlAgentFactory.PROPS_KEY_DEFAULT_INSERTS_TYPE)) {
1✔
192
                        this.defaultInsertsType = InsertsType.valueOf(settings
×
193
                                        .get(SqlAgentFactory.PROPS_KEY_DEFAULT_INSERTS_TYPE));
×
194
                }
195
        }
1✔
196

197
        /**
198
         * {@inheritDoc}
199
         *
200
         * @see jp.co.future.uroborosql.connection.ConnectionManager#getConnection()
201
         */
202
        @Override
203
        public Connection getConnection() {
204
                return transactionManager.getConnection();
1✔
205
        }
206

207
        /**
208
         * SQLマネージャを取得します。
209
         *
210
         * @return SQLマネージャ
211
         */
212
        protected SqlManager getSqlManager() {
213
                return sqlConfig.getSqlManager();
1✔
214
        }
215

216
        /**
217
         * SqlFilter管理クラスを取得します。
218
         *
219
         * @return SqlFilter管理クラス
220
         */
221
        public SqlFilterManager getSqlFilterManager() {
222
                return sqlConfig.getSqlFilterManager();
1✔
223
        }
224

225
        /**
226
         * ORM処理クラス を取得します。
227
         *
228
         * @return ORM処理クラス
229
         */
230
        protected EntityHandler<?> getEntityHandler() {
231
                return sqlConfig.getEntityHandler();
1✔
232
        }
233

234
        /**
235
         * SqlContextの設定内容を元にSQLを構築する
236
         *
237
         * @param sqlContext SQLコンテキスト
238
         * @param isQuery queryかどうか。queryの場合<code>true</code>
239
         */
240
        protected void transformContext(final SqlContext sqlContext, final boolean isQuery) {
241
                String originalSql = sqlContext.getSql();
1✔
242
                if (StringUtils.isEmpty(originalSql) && getSqlManager() != null) {
1✔
243
                        originalSql = getSqlManager().getSql(sqlContext.getSqlName());
1✔
244
                        if (StringUtils.isEmpty(originalSql)) {
1✔
245
                                throw new UroborosqlRuntimeException("sql file:[" + sqlContext.getSqlName() + "] is not found.");
1✔
246
                        }
247
                }
248
                originalSql = getSqlFilterManager().doTransformSql(sqlContext, originalSql);
1✔
249
                sqlContext.setSql(originalSql);
1✔
250

251
                // SQL-IDの付与
252
                if (originalSql.contains(keySqlId)) {
1✔
253
                        String sqlId = sqlContext.getSqlId();
1✔
254
                        if (StringUtils.isEmpty(sqlId)) {
1✔
255
                                sqlId = sqlContext.getSqlName();
1✔
256
                        }
257
                        if (StringUtils.isEmpty(sqlId)) {
1✔
258
                                sqlId = String.valueOf(originalSql.hashCode());
×
259
                        }
260

261
                        originalSql = originalSql.replace(keySqlId, sqlId);
1✔
262
                }
263

264
                // Dialectに合わせたエスケープキャラクタの設定
265
                sqlContext.param(Dialect.PARAM_KEY_ESCAPE_CHAR, getSqlConfig().getDialect().getEscapeChar());
1✔
266

267
                // 自動パラメータバインド関数の呼出
268
                if (sqlContext.batchCount() == 0) {
1✔
269
                        if (isQuery) {
1✔
270
                                sqlContext.acceptQueryAutoParameterBinder();
1✔
271
                        } else {
272
                                sqlContext.acceptUpdateAutoParameterBinder();
1✔
273
                        }
274
                }
275

276
                if (StringUtils.isEmpty(sqlContext.getExecutableSql())) {
1✔
277
                        boolean outputBindComment = (boolean) sqlContext.contextAttrs().getOrDefault(
1✔
278
                                        CTX_ATTR_KEY_OUTPUT_BIND_COMMENT, true);
1✔
279
                        SqlParser sqlParser = new SqlParserImpl(originalSql, sqlConfig.getExpressionParser(),
1✔
280
                                        sqlConfig.getDialect().isRemoveTerminator(), outputBindComment);
1✔
281
                        ContextTransformer contextTransformer = sqlParser.parse();
1✔
282
                        contextTransformer.transform(sqlContext);
1✔
283

284
                        if (coverageHandlerRef.get() != null) {
1✔
285
                                // SQLカバレッジ用のログを出力する
286
                                CoverageData coverageData = new CoverageData(sqlContext.getSqlName(), originalSql,
1✔
287
                                                contextTransformer.getPassedRoute());
1✔
288
                                COVERAGE_LOG.trace("{}", coverageData);
1✔
289

290
                                coverageHandlerRef.get().accept(coverageData);
1✔
291
                        }
292
                }
293

294
                if (LOG.isTraceEnabled()) {
1✔
295
                        LOG.trace("Template SQL[{}{}{}]", System.lineSeparator(), originalSql, System.lineSeparator());
×
296
                }
297
                if (LOG.isDebugEnabled()) {
1✔
298
                        LOG.debug("Executed SQL[{}{}{}]", System.lineSeparator(), sqlContext.getExecutableSql(),
×
299
                                        System.lineSeparator());
×
300
                }
301
        }
1✔
302

303
        /**
304
         * フェッチサイズとクエリタイムアウトをPreparedStatementに設定する
305
         *
306
         * @param preparedStatement PreparedStatement
307
         * @throws SQLException SQL例外
308
         */
309
        protected void applyProperties(final PreparedStatement preparedStatement) throws SQLException {
310
                // フェッチサイズ指定
311
                if (getFetchSize() >= 0 && !(preparedStatement instanceof CallableStatement)) {
1✔
312
                        preparedStatement.setFetchSize(getFetchSize());
1✔
313
                }
314

315
                // クエリタイムアウト指定
316
                if (getQueryTimeout() >= 0) {
1✔
317
                        preparedStatement.setQueryTimeout(getQueryTimeout());
1✔
318
                }
319
        }
1✔
320

321
        /**
322
         * 例外発生時ハンドラー
323
         *
324
         * @param sqlContext SQLコンテキスト
325
         * @param ex SQL例外
326
         * @throws SQLException SQL例外
327
         */
328
        protected abstract void handleException(SqlContext sqlContext, SQLException ex) throws SQLException;
329

330
        /**
331
         * {@inheritDoc}
332
         *
333
         * @see jp.co.future.uroborosql.SqlAgent#close()
334
         */
335
        @Override
336
        public void close() {
337
                transactionManager.close();
1✔
338
                if (coverageHandlerRef.get() != null) {
1✔
339
                        coverageHandlerRef.get().onSqlAgentClose();
1✔
340
                }
341
        }
1✔
342

343
        /**
344
         * {@inheritDoc}
345
         *
346
         * @see jp.co.future.uroborosql.tx.TransactionManager#required(jp.co.future.uroborosql.tx.SQLRunnable)
347
         */
348
        @Override
349
        public void required(final SQLRunnable runnable) {
350
                transactionManager.required(runnable);
1✔
351
        }
1✔
352

353
        /**
354
         * {@inheritDoc}
355
         *
356
         * @see jp.co.future.uroborosql.tx.TransactionManager#required(jp.co.future.uroborosql.tx.SQLSupplier)
357
         */
358
        @Override
359
        public <R> R required(final SQLSupplier<R> supplier) {
360
                return transactionManager.required(supplier);
1✔
361
        }
362

363
        /**
364
         * {@inheritDoc}
365
         *
366
         * @see jp.co.future.uroborosql.tx.TransactionManager#requiresNew(jp.co.future.uroborosql.tx.SQLRunnable)
367
         */
368
        @Override
369
        public void requiresNew(final SQLRunnable runnable) {
370
                transactionManager.requiresNew(runnable);
1✔
371
        }
1✔
372

373
        /**
374
         * {@inheritDoc}
375
         *
376
         * @see jp.co.future.uroborosql.tx.TransactionManager#requiresNew(jp.co.future.uroborosql.tx.SQLSupplier)
377
         */
378
        @Override
379
        public <R> R requiresNew(final SQLSupplier<R> supplier) {
380
                return transactionManager.requiresNew(supplier);
1✔
381
        }
382

383
        /**
384
         * {@inheritDoc}
385
         *
386
         * @see jp.co.future.uroborosql.tx.TransactionManager#notSupported(jp.co.future.uroborosql.tx.SQLRunnable)
387
         */
388
        @Override
389
        public void notSupported(final SQLRunnable runnable) {
390
                transactionManager.notSupported(runnable);
1✔
391
        }
1✔
392

393
        /**
394
         * {@inheritDoc}
395
         *
396
         * @see jp.co.future.uroborosql.tx.TransactionManager#notSupported(jp.co.future.uroborosql.tx.SQLSupplier)
397
         */
398
        @Override
399
        public <R> R notSupported(final SQLSupplier<R> supplier) {
400
                return transactionManager.notSupported(supplier);
1✔
401
        }
402

403
        /**
404
         * {@inheritDoc}
405
         *
406
         * @see jp.co.future.uroborosql.tx.TransactionManager#setRollbackOnly()
407
         */
408
        @Override
409
        public void setRollbackOnly() {
410
                transactionManager.setRollbackOnly();
1✔
411
        }
1✔
412

413
        /**
414
         * {@inheritDoc}
415
         *
416
         * @see jp.co.future.uroborosql.tx.TransactionManager#setSavepoint(java.lang.String)
417
         */
418
        @Override
419
        public void setSavepoint(final String savepointName) {
420
                transactionManager.setSavepoint(savepointName);
1✔
421
        }
1✔
422

423
        /**
424
         * {@inheritDoc}
425
         *
426
         * @see jp.co.future.uroborosql.tx.TransactionManager#releaseSavepoint(java.lang.String)
427
         */
428
        @Override
429
        public void releaseSavepoint(final String savepointName) {
430
                transactionManager.releaseSavepoint(savepointName);
1✔
431
        }
1✔
432

433
        /**
434
         * {@inheritDoc}
435
         *
436
         * @see jp.co.future.uroborosql.tx.TransactionManager#rollback(java.lang.String)
437
         */
438
        @Override
439
        public void rollback(final String savepointName) {
440
                transactionManager.rollback(savepointName);
1✔
441
        }
1✔
442

443
        /**
444
         * {@inheritDoc}
445
         *
446
         * @see jp.co.future.uroborosql.tx.TransactionManager#savepointScope(jp.co.future.uroborosql.tx.SQLSupplier)
447
         */
448
        @Override
449
        public <R> R savepointScope(final SQLSupplier<R> supplier) {
450
                return transactionManager.savepointScope(supplier);
1✔
451
        }
452

453
        /**
454
         * {@inheritDoc}
455
         *
456
         * @see jp.co.future.uroborosql.tx.TransactionManager#savepointScope(jp.co.future.uroborosql.tx.SQLRunnable)
457
         */
458
        @Override
459
        public void savepointScope(final SQLRunnable runnable) {
460
                transactionManager.savepointScope(runnable);
1✔
461
        }
1✔
462

463
        /**
464
         * {@inheritDoc}
465
         *
466
         * @see jp.co.future.uroborosql.tx.TransactionManager#autoCommitScope(jp.co.future.uroborosql.tx.SQLSupplier)
467
         */
468
        @Override
469
        public <R> R autoCommitScope(final SQLSupplier<R> supplier) {
470
                return transactionManager.autoCommitScope(supplier);
1✔
471
        }
472

473
        /**
474
         * {@inheritDoc}
475
         *
476
         * @see jp.co.future.uroborosql.tx.TransactionManager#autoCommitScope(jp.co.future.uroborosql.tx.SQLRunnable)
477
         */
478
        @Override
479
        public void autoCommitScope(final SQLRunnable runnable) {
480
                transactionManager.autoCommitScope(runnable);
1✔
481
        }
1✔
482

483
        /**
484
         * {@inheritDoc}
485
         *
486
         * @see jp.co.future.uroborosql.SqlAgent#rollback()
487
         */
488
        @Override
489
        public void rollback() {
490
                transactionManager.rollback();
1✔
491
        }
1✔
492

493
        /**
494
         * {@inheritDoc}
495
         *
496
         * @see jp.co.future.uroborosql.SqlAgent#commit()
497
         */
498
        @Override
499
        public void commit() {
500
                transactionManager.commit();
1✔
501
        }
1✔
502

503
        /**
504
         * {@inheritDoc}
505
         *
506
         * @see jp.co.future.uroborosql.config.SqlConfigAware#getSqlConfig()
507
         */
508
        @Override
509
        public SqlConfig getSqlConfig() {
510
                return this.sqlConfig;
1✔
511
        }
512

513
        /**
514
         * {@inheritDoc}
515
         *
516
         * @see jp.co.future.uroborosql.config.SqlConfigAware#setSqlConfig(jp.co.future.uroborosql.config.SqlConfig)
517
         */
518
        @Override
519
        public void setSqlConfig(final SqlConfig config) {
520
                this.sqlConfig = config;
×
521
        }
×
522

523
        /**
524
         * {@inheritDoc}
525
         *
526
         * @see jp.co.future.uroborosql.SqlAgent#context()
527
         */
528
        @Override
529
        public SqlContext context() {
530
                return sqlConfig.context();
1✔
531
        }
532

533
        /**
534
         * {@inheritDoc}
535
         *
536
         * @see jp.co.future.uroborosql.SqlAgent#context()
537
         */
538
        @Override
539
        public SqlContext contextFrom(final String sqlName) {
540
                return sqlConfig.context().setSqlName(sqlName);
1✔
541
        }
542

543
        /**
544
         * {@inheritDoc}
545
         *
546
         * @see jp.co.future.uroborosql.SqlAgent#context()
547
         */
548
        @Override
549
        public SqlContext contextWith(final String sql) {
550
                return sqlConfig.context().setSql(sql);
1✔
551
        }
552

553
        /**
554
         * {@inheritDoc}
555
         *
556
         * @see jp.co.future.uroborosql.SqlAgent#query(java.lang.String)
557
         */
558
        @Override
559
        public SqlQuery query(final String sqlName) {
560
                return new SqlQueryImpl(this, contextFrom(sqlName));
1✔
561
        }
562

563
        /**
564
         * {@inheritDoc}
565
         *
566
         * @see jp.co.future.uroborosql.SqlAgent#queryWith(java.lang.String)
567
         */
568
        @Override
569
        public SqlQuery queryWith(final String sql) {
570
                return new SqlQueryImpl(this, contextWith(sql));
1✔
571
        }
572

573
        /**
574
         * {@inheritDoc}
575
         *
576
         * @see jp.co.future.uroborosql.SqlAgent#update(java.lang.String)
577
         */
578
        @Override
579
        public SqlUpdate update(final String sqlName) {
580
                return new SqlUpdateImpl(this, contextFrom(sqlName));
1✔
581
        }
582

583
        /**
584
         * {@inheritDoc}
585
         *
586
         * @see jp.co.future.uroborosql.SqlAgent#updateWith(java.lang.String)
587
         */
588
        @Override
589
        public SqlUpdate updateWith(final String sql) {
590
                return new SqlUpdateImpl(this, contextWith(sql));
1✔
591
        }
592

593
        /**
594
         * {@inheritDoc}
595
         *
596
         * @see jp.co.future.uroborosql.SqlAgent#batch(java.lang.String)
597
         */
598
        @Override
599
        public SqlBatch batch(final String sqlName) {
600
                return new SqlBatchImpl(this, contextFrom(sqlName));
1✔
601
        }
602

603
        /**
604
         * {@inheritDoc}
605
         *
606
         * @see jp.co.future.uroborosql.SqlAgent#batchWith(java.lang.String)
607
         */
608
        @Override
609
        public SqlBatch batchWith(final String sql) {
610
                return new SqlBatchImpl(this, contextWith(sql));
1✔
611
        }
612

613
        /**
614
         * {@inheritDoc}
615
         *
616
         * @see jp.co.future.uroborosql.SqlAgent#proc(java.lang.String)
617
         */
618
        @Override
619
        public Procedure proc(final String sqlName) {
620
                return new ProcedureImpl(this, contextFrom(sqlName));
1✔
621
        }
622

623
        /**
624
         * {@inheritDoc}
625
         *
626
         * @see jp.co.future.uroborosql.SqlAgent#procWith(java.lang.String)
627
         */
628
        @Override
629
        public Procedure procWith(final String sql) {
630
                return new ProcedureImpl(this, contextWith(sql));
1✔
631
        }
632

633
        /**
634
         * {@inheritDoc}
635
         *
636
         * @see jp.co.future.uroborosql.SqlAgent#query(java.lang.Class)
637
         */
638
        @SuppressWarnings("unchecked")
639
        @Override
640
        public <E> SqlEntityQuery<E> query(final Class<? extends E> entityType) {
641
                @SuppressWarnings("rawtypes")
642
                EntityHandler handler = this.getEntityHandler();
1✔
643
                if (!handler.getEntityType().isAssignableFrom(entityType)) {
1✔
644
                        throw new IllegalArgumentException("Entity type not supported");
×
645
                }
646

647
                try {
648
                        TableMetadata metadata = handler.getMetadata(this.transactionManager, entityType);
1✔
649

650
                        SqlContext context = handler.createSelectContext(this, metadata, entityType, false);
1✔
651

652
                        return new SqlEntityQueryImpl<>(this, handler, metadata, context, entityType);
1✔
653
                } catch (SQLException e) {
×
654
                        throw new EntitySqlRuntimeException(SqlKind.SELECT, e);
×
655
                }
656
        }
657

658
        /**
659
         * {@inheritDoc}
660
         *
661
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition, jp.co.future.uroborosql.enums.InsertsType)
662
         */
663
        @Override
664
        public <E> int inserts(final Class<E> entityType, final Stream<E> entities,
665
                        final InsertsCondition<? super E> condition,
666
                        final InsertsType insertsType) {
667
                if (insertsType == InsertsType.BULK && sqlConfig.getDialect().supportsBulkInsert()) {
1✔
668
                        return bulkInsert(entityType, entities, condition, null);
1✔
669
                } else {
670
                        return batchInsert(entityType, entities, condition, null);
1✔
671
                }
672
        }
673

674
        /**
675
         * {@inheritDoc}
676
         *
677
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition)
678
         */
679
        @Override
680
        public <E> int inserts(final Class<E> entityType, final Stream<E> entities,
681
                        final InsertsCondition<? super E> condition) {
682
                return inserts(entityType, entities, condition, defaultInsertsType);
1✔
683
        }
684

685
        /**
686
         * {@inheritDoc}
687
         *
688
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.lang.Class, java.util.stream.Stream)
689
         */
690
        @Override
691
        public <E> int inserts(final Class<E> entityType, final Stream<E> entities) {
692
                return inserts(entityType, entities,
1✔
693
                                InsertsType.BATCH.equals(defaultInsertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
694
                                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION);
695
        }
696

697
        /**
698
         * {@inheritDoc}
699
         *
700
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.enums.InsertsType)
701
         */
702
        @Override
703
        public <E> int inserts(final Class<E> entityType, final Stream<E> entities, final InsertsType insertsType) {
704
                return inserts(entityType, entities,
1✔
705
                                InsertsType.BATCH.equals(insertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
706
                                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION,
707
                                insertsType);
708
        }
709

710
        /**
711
         * {@inheritDoc}
712
         *
713
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition, jp.co.future.uroborosql.enums.InsertsType)
714
         */
715
        @Override
716
        public <E> int inserts(final Stream<E> entities, final InsertsCondition<? super E> condition,
717
                        final InsertsType insertsType) {
718
                Iterator<E> iterator = entities.iterator();
1✔
719
                if (!iterator.hasNext()) {
1✔
720
                        return 0;
1✔
721
                }
722

723
                E firstEntity = iterator.next();
1✔
724

725
                Spliterator<E> spliterator = Spliterators.spliteratorUnknownSize(iterator, Spliterator.NONNULL);
1✔
726
                Stream<E> otherStream = StreamSupport.stream(spliterator, false);
1✔
727
                Stream<E> stream = Stream.concat(Stream.of(firstEntity), otherStream);
1✔
728

729
                @SuppressWarnings("unchecked")
730
                Class<E> type = (Class<E>) firstEntity.getClass();
1✔
731

732
                return inserts(type, stream, condition, insertsType);
1✔
733
        }
734

735
        /**
736
         * {@inheritDoc}
737
         *
738
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition)
739
         */
740
        @Override
741
        public <E> int inserts(final Stream<E> entities, final InsertsCondition<? super E> condition) {
742
                return inserts(entities, condition, defaultInsertsType);
1✔
743
        }
744

745
        /**
746
         * {@inheritDoc}
747
         *
748
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.util.stream.Stream)
749
         */
750
        @Override
751
        public <E> int inserts(final Stream<E> entities) {
752
                return inserts(entities, InsertsType.BATCH.equals(defaultInsertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
753
                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION);
754
        }
755

756
        /**
757
         * {@inheritDoc}
758
         *
759
         * @see jp.co.future.uroborosql.SqlAgent#inserts(java.util.stream.Stream, jp.co.future.uroborosql.enums.InsertsType)
760
         */
761
        @Override
762
        public <E> int inserts(final Stream<E> entities, final InsertsType insertsType) {
763
                return inserts(entities, InsertsType.BATCH.equals(insertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
764
                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION, insertsType);
765
        }
766

767
        /**
768
         * {@inheritDoc}
769
         *
770
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition, jp.co.future.uroborosql.enums.InsertsType)
771
         */
772
        @Override
773
        public <E> Stream<E> insertsAndReturn(final Class<E> entityType, final Stream<E> entities,
774
                        final InsertsCondition<? super E> condition,
775
                        final InsertsType insertsType) {
776
                List<E> insertedEntities = new ArrayList<>();
1✔
777
                if (insertsType == InsertsType.BULK && sqlConfig.getDialect().supportsBulkInsert()) {
1✔
778
                        bulkInsert(entityType, entities, condition, insertedEntities);
1✔
779
                } else {
780
                        batchInsert(entityType, entities, condition, insertedEntities);
1✔
781
                }
782
                return insertedEntities.stream();
1✔
783
        }
784

785
        /**
786
         * {@inheritDoc}
787
         *
788
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition)
789
         */
790
        @Override
791
        public <E> Stream<E> insertsAndReturn(final Class<E> entityType, final Stream<E> entities,
792
                        final InsertsCondition<? super E> condition) {
793
                return insertsAndReturn(entityType, entities, condition, defaultInsertsType);
1✔
794
        }
795

796
        /**
797
         * {@inheritDoc}
798
         *
799
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.lang.Class, java.util.stream.Stream)
800
         */
801
        @Override
802
        public <E> Stream<E> insertsAndReturn(final Class<E> entityType, final Stream<E> entities) {
803
                return insertsAndReturn(entityType, entities,
1✔
804
                                InsertsType.BATCH.equals(defaultInsertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
805
                                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION);
806
        }
807

808
        /**
809
         * {@inheritDoc}
810
         *
811
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.enums.InsertsType)
812
         */
813
        @Override
814
        public <E> Stream<E> insertsAndReturn(final Class<E> entityType, final Stream<E> entities,
815
                        final InsertsType insertsType) {
816
                return insertsAndReturn(entityType, entities,
1✔
817
                                InsertsType.BATCH.equals(insertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
818
                                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION,
819
                                insertsType);
820
        }
821

822
        /**
823
         * {@inheritDoc}
824
         *
825
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition, jp.co.future.uroborosql.enums.InsertsType)
826
         */
827
        @Override
828
        public <E> Stream<E> insertsAndReturn(final Stream<E> entities, final InsertsCondition<? super E> condition,
829
                        final InsertsType insertsType) {
830
                Iterator<E> iterator = entities.iterator();
1✔
831
                if (!iterator.hasNext()) {
1✔
832
                        return new ArrayList<E>().stream();
1✔
833
                }
834

835
                E firstEntity = iterator.next();
1✔
836

837
                Spliterator<E> spliterator = Spliterators.spliteratorUnknownSize(iterator, Spliterator.NONNULL);
1✔
838
                Stream<E> otherStream = StreamSupport.stream(spliterator, false);
1✔
839
                Stream<E> stream = Stream.concat(Stream.of(firstEntity), otherStream);
1✔
840

841
                @SuppressWarnings("unchecked")
842
                Class<E> type = (Class<E>) firstEntity.getClass();
1✔
843

844
                return insertsAndReturn(type, stream, condition, insertsType);
1✔
845
        }
846

847
        /**
848
         * {@inheritDoc}
849
         *
850
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.InsertsCondition)
851
         */
852
        @Override
853
        public <E> Stream<E> insertsAndReturn(final Stream<E> entities, final InsertsCondition<? super E> condition) {
854
                return insertsAndReturn(entities, condition, defaultInsertsType);
1✔
855
        }
856

857
        /**
858
         * {@inheritDoc}
859
         *
860
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.util.stream.Stream)
861
         */
862
        @Override
863
        public <E> Stream<E> insertsAndReturn(final Stream<E> entities) {
864
                return insertsAndReturn(entities,
1✔
865
                                InsertsType.BATCH.equals(defaultInsertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
866
                                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION);
867
        }
868

869
        /**
870
         * {@inheritDoc}
871
         *
872
         * @see jp.co.future.uroborosql.SqlAgent#insertsAndReturn(java.util.stream.Stream, jp.co.future.uroborosql.enums.InsertsType)
873
         */
874
        @Override
875
        public <E> Stream<E> insertsAndReturn(final Stream<E> entities, final InsertsType insertsType) {
876
                return insertsAndReturn(entities, InsertsType.BATCH.equals(insertsType) ? DEFAULT_BATCH_INSERTS_WHEN_CONDITION
1✔
877
                                : DEFAULT_BULK_INSERTS_WHEN_CONDITION, insertsType);
878
        }
879

880
        /**
881
         * {@inheritDoc}
882
         *
883
         * @see jp.co.future.uroborosql.SqlAgent#updates(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.UpdatesCondition)
884
         */
885
        @Override
886
        public <E> int updates(final Class<E> entityType, final Stream<E> entities,
887
                        final UpdatesCondition<? super E> condition) {
888
                return batchUpdate(entityType, entities, condition, null);
1✔
889
        }
890

891
        /**
892
         * {@inheritDoc}
893
         *
894
         * @see jp.co.future.uroborosql.SqlAgent#updatesAndReturn(java.lang.Class, java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.UpdatesCondition)
895
         */
896
        @Override
897
        public <E> Stream<E> updatesAndReturn(final Class<E> entityType, final Stream<E> entities,
898
                        final UpdatesCondition<? super E> condition) {
899
                List<E> updatedEntities = new ArrayList<>();
1✔
900
                batchUpdate(entityType, entities, condition, updatedEntities);
1✔
901
                return updatedEntities.stream();
1✔
902
        }
903

904
        /**
905
         * {@inheritDoc}
906
         *
907
         * @see jp.co.future.uroborosql.SqlAgent#updates(java.lang.Class, java.util.stream.Stream)
908
         */
909
        @Override
910
        public <E> int updates(final Class<E> entityType, final Stream<E> entities) {
911
                return updates(entityType, entities, DEFAULT_UPDATES_WHEN_CONDITION);
1✔
912
        }
913

914
        /**
915
         * {@inheritDoc}
916
         *
917
         * @see jp.co.future.uroborosql.SqlAgent#updatesAndReturn(java.lang.Class, java.util.stream.Stream)
918
         */
919
        @Override
920
        public <E> Stream<E> updatesAndReturn(final Class<E> entityType, final Stream<E> entities) {
921
                return updatesAndReturn(entityType, entities, DEFAULT_UPDATES_WHEN_CONDITION);
×
922
        }
923

924
        /**
925
         * {@inheritDoc}
926
         *
927
         * @see jp.co.future.uroborosql.SqlAgent#updates(java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.UpdatesCondition)
928
         */
929
        @Override
930
        public <E> int updates(final Stream<E> entities, final UpdatesCondition<? super E> condition) {
931
                Iterator<E> iterator = entities.iterator();
1✔
932
                if (!iterator.hasNext()) {
1✔
933
                        return 0;
×
934
                }
935

936
                E firstEntity = iterator.next();
1✔
937

938
                Spliterator<E> spliterator = Spliterators.spliteratorUnknownSize(iterator, Spliterator.NONNULL);
1✔
939
                Stream<E> otherStream = StreamSupport.stream(spliterator, false);
1✔
940
                Stream<E> stream = Stream.concat(Stream.of(firstEntity), otherStream);
1✔
941

942
                @SuppressWarnings("unchecked")
943
                Class<E> type = (Class<E>) firstEntity.getClass();
1✔
944

945
                return updates(type, stream, condition);
1✔
946
        }
947

948
        /**
949
         * {@inheritDoc}
950
         *
951
         * @see jp.co.future.uroborosql.SqlAgent#updatesAndReturn(java.util.stream.Stream, jp.co.future.uroborosql.SqlAgent.UpdatesCondition)
952
         */
953
        @Override
954
        public <E> Stream<E> updatesAndReturn(final Stream<E> entities, final UpdatesCondition<? super E> condition) {
955
                Iterator<E> iterator = entities.iterator();
1✔
956
                if (!iterator.hasNext()) {
1✔
957
                        return new ArrayList<E>().stream();
×
958
                }
959

960
                E firstEntity = iterator.next();
1✔
961

962
                Spliterator<E> spliterator = Spliterators.spliteratorUnknownSize(iterator, Spliterator.NONNULL);
1✔
963
                Stream<E> otherStream = StreamSupport.stream(spliterator, false);
1✔
964
                Stream<E> stream = Stream.concat(Stream.of(firstEntity), otherStream);
1✔
965

966
                @SuppressWarnings("unchecked")
967
                Class<E> type = (Class<E>) firstEntity.getClass();
1✔
968

969
                return updatesAndReturn(type, stream, condition);
1✔
970
        }
971

972
        /**
973
         * {@inheritDoc}
974
         *
975
         * @see jp.co.future.uroborosql.SqlAgent#updates(java.util.stream.Stream)
976
         */
977
        @Override
978
        public <E> int updates(final Stream<E> entities) {
979
                return updates(entities, DEFAULT_UPDATES_WHEN_CONDITION);
1✔
980
        }
981

982
        /**
983
         * {@inheritDoc}
984
         *
985
         * @see jp.co.future.uroborosql.SqlAgent#updatesAndReturn(java.util.stream.Stream)
986
         */
987
        @Override
988
        public <E> Stream<E> updatesAndReturn(final Stream<E> entities) {
989
                return updatesAndReturn(entities, DEFAULT_UPDATES_WHEN_CONDITION);
1✔
990
        }
991

992
        /**
993
         * {@inheritDoc}
994
         *
995
         * @see jp.co.future.uroborosql.SqlAgent#getFetchSize()
996
         */
997
        @Override
998
        public int getFetchSize() {
999
                return fetchSize;
1✔
1000
        }
1001

1002
        /**
1003
         * {@inheritDoc}
1004
         *
1005
         * @see jp.co.future.uroborosql.SqlAgent#setFetchSize(int)
1006
         */
1007
        @Override
1008
        public void setFetchSize(final int fetchSize) {
1009
                this.fetchSize = fetchSize;
×
1010
        }
×
1011

1012
        /**
1013
         * {@inheritDoc}
1014
         *
1015
         * @see jp.co.future.uroborosql.SqlAgent#getQueryTimeout()
1016
         */
1017
        @Override
1018
        public int getQueryTimeout() {
1019
                return queryTimeout;
1✔
1020
        }
1021

1022
        /**
1023
         * {@inheritDoc}
1024
         *
1025
         * @see jp.co.future.uroborosql.SqlAgent#setQueryTimeout(int)
1026
         */
1027
        @Override
1028
        public void setQueryTimeout(final int queryTimeout) {
1029
                this.queryTimeout = queryTimeout;
×
1030
        }
×
1031

1032
        /**
1033
         * SQL実行をリトライするSQLエラーコードのリスト を取得します
1034
         *
1035
         * @return SQL実行をリトライするSQLエラーコードのリスト
1036
         */
1037
        public List<String> getSqlRetryCodes() {
1038
                return sqlRetryCodes;
1✔
1039
        }
1040

1041
        /**
1042
         * SQL実行をリトライするSQLエラーコードのリスト を設定します
1043
         *
1044
         * @param sqlRetryCodes SQL実行をリトライするSQLエラーコードのリスト
1045
         */
1046
        public void setSqlRetryCodes(final List<String> sqlRetryCodes) {
1047
                this.sqlRetryCodes = sqlRetryCodes;
×
1048
        }
×
1049

1050
        /**
1051
         * 最大リトライ回数 を取得します
1052
         *
1053
         * @return 最大リトライ回数
1054
         */
1055
        public int getMaxRetryCount() {
1056
                return maxRetryCount;
1✔
1057
        }
1058

1059
        /**
1060
         * 最大リトライ回数 を設定します
1061
         *
1062
         * @param maxRetryCount 最大リトライ回数
1063
         */
1064
        public void setMaxRetryCount(final int maxRetryCount) {
1065
                this.maxRetryCount = maxRetryCount;
×
1066
        }
×
1067

1068
        /**
1069
         * リトライタイムアウト時間(ms) を取得します
1070
         *
1071
         * @return リトライタイムアウト時間(ms)
1072
         */
1073
        public int getRetryWaitTime() {
1074
                return retryWaitTime;
1✔
1075
        }
1076

1077
        /**
1078
         * リトライタイムアウト時間(ms) を設定します
1079
         *
1080
         * @param retryWaitTime リトライタイムアウト時間(ms)
1081
         */
1082
        public void setRetryWaitTime(final int retryWaitTime) {
1083
                this.retryWaitTime = retryWaitTime;
×
1084
        }
×
1085

1086
        /**
1087
         * Queryの結果を格納するMapのキーを生成する際に使用するCaseFormatを取得する
1088
         *
1089
         * @return Queryの結果を格納するMapのキーを生成する際に使用するCaseFormat
1090
         */
1091
        @Override
1092
        public CaseFormat getDefaultMapKeyCaseFormat() {
1093
                return defaultMapKeyCaseFormat;
1✔
1094
        }
1095

1096
        /**
1097
         * Queryの結果を格納するMapのキーを生成する際に使用するCaseFormatを設定する。
1098
         *
1099
         * @param defaultMapKeyCaseFormat Queryの結果を格納するMapのキーを生成する際に使用するCaseFormat
1100
         */
1101
        @Override
1102
        public void setDefaultMapKeyCaseFormat(final CaseFormat defaultMapKeyCaseFormat) {
1103
                this.defaultMapKeyCaseFormat = defaultMapKeyCaseFormat;
×
1104
        }
×
1105

1106
        /**
1107
         * デフォルトの{@link InsertsType}を取得する
1108
         *
1109
         * @return insertsType
1110
         * @see jp.co.future.uroborosql.enums.InsertsType
1111
         */
1112
        @Override
1113
        public InsertsType getDefaultInsertsType() {
1114
                return defaultInsertsType;
×
1115
        }
1116

1117
        /**
1118
         * デフォルトの{@link InsertsType}を設定する
1119
         *
1120
         * @param defaultInsertsType デフォルトの{@link InsertsType}
1121
         * @see jp.co.future.uroborosql.enums.InsertsType
1122
         */
1123
        @Override
1124
        public void setDefaultInsertsType(final InsertsType defaultInsertsType) {
1125
                this.defaultInsertsType = defaultInsertsType;
1✔
1126
        }
1✔
1127

1128
        /**
1129
         * ステートメント初期化。
1130
         *
1131
         * @param sqlContext SQLコンテキスト
1132
         * @return PreparedStatement
1133
         * @throws SQLException SQL例外
1134
         */
1135
        protected PreparedStatement getPreparedStatement(final SqlContext sqlContext) throws SQLException {
1136
                PreparedStatement stmt = ((LocalTransactionManager) transactionManager).getPreparedStatement(sqlContext);
1✔
1137
                // プロパティ設定
1138
                applyProperties(stmt);
1✔
1139
                return stmt;
1✔
1140
        }
1141

1142
        /**
1143
         * Callableステートメント初期化
1144
         *
1145
         * @param sqlContext SQLコンテキスト
1146
         * @return CallableStatement
1147
         * @throws SQLException SQL例外
1148
         */
1149
        protected CallableStatement getCallableStatement(final SqlContext sqlContext) throws SQLException {
1150
                CallableStatement stmt = ((LocalTransactionManager) transactionManager).getCallableStatement(sqlContext);
1✔
1151
                // プロパティ設定
1152
                applyProperties(stmt);
1✔
1153
                return stmt;
1✔
1154
        }
1155

1156
        /**
1157
         * 複数エンティティのBULK INSERTを実行
1158
         *
1159
         * @param <E> エンティティの型
1160
         * @param entityType エンティティの型
1161
         * @param entities エンティティ
1162
         * @param condition 一括INSERT用のフレームの判定条件
1163
         * @param insertedEntities INSERTしたEntityのList. <code>null</code>の場合は格納されない
1164
         * @return SQL実行結果
1165
         */
1166
        protected abstract <E> int batchInsert(final Class<E> entityType, final Stream<E> entities,
1167
                        final InsertsCondition<? super E> condition, List<E> insertedEntities);
1168

1169
        /**
1170
         * 複数エンティティのINSERTをバッチ実行
1171
         *
1172
         * @param <E> エンティティの型
1173
         * @param entityType エンティティの型
1174
         * @param entities エンティティ
1175
         * @param condition 一括INSERT用のフレームの判定条件
1176
         * @param insertedEntities INSERTしたEntityのList. <code>null</code>の場合は格納されない
1177
         * @return SQL実行結果
1178
         */
1179
        protected abstract <E> int bulkInsert(final Class<E> entityType, final Stream<E> entities,
1180
                        final InsertsCondition<? super E> condition, List<E> insertedEntities);
1181

1182
        /**
1183
         * 複数エンティティのBULK UPDATEを実行
1184
         *
1185
         * @param <E> エンティティの型
1186
         * @param entityType エンティティの型
1187
         * @param entities エンティティ
1188
         * @param condition 一括更新用のフレームの判定条件
1189
         * @param updatedEntities INSERTしたEntityのList. <code>null</code>の場合は格納されない
1190
         * @return SQL実行結果
1191
         */
1192
        protected abstract <E> int batchUpdate(final Class<E> entityType, final Stream<E> entities,
1193
                        final UpdatesCondition<? super E> condition, List<E> updatedEntities);
1194

1195
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc