Skip to content

Commit 1d05c43

Browse files
committed
Improve batch insertion for entities with auto-increment primary keys.
Retrieve primary keys using `Statement.getGeneratedKeys()` after executing `Statement.executeBatch()`, if supported by the DBMS.
1 parent 672f17f commit 1d05c43

File tree

13 files changed

+68
-58
lines changed

13 files changed

+68
-58
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/command/BatchInsertCommand.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,9 @@ protected int executeUpdate(PreparedStatement preparedStatement, PreparedSql sql
4646
throw e;
4747
}
4848
}
49+
50+
@Override
51+
protected void postExecuteBatch(PreparedStatement preparedStatement, int position, int length) {
52+
query.generateIds(preparedStatement, position, length);
53+
}
4954
}

doma-core/src/main/java/org/seasar/doma/jdbc/command/BatchModifyCommand.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ protected int[] executeBatch(PreparedStatement preparedStatement, List<PreparedS
9696
if (i == sqlSize - 1 || (batchSize > 0 && (i + 1) % batchSize == 0)) {
9797
int[] rows = executeBatch(preparedStatement, sql);
9898
validateRows(preparedStatement, sql, rows);
99+
postExecuteBatch(preparedStatement, pos, rows.length);
99100
System.arraycopy(rows, 0, updatedRows, pos, rows.length);
100101
pos = i + 1;
101102
}
@@ -118,6 +119,9 @@ protected int[] executeBatch(PreparedStatement preparedStatement, PreparedSql sq
118119
}
119120
}
120121

122+
protected void postExecuteBatch(
123+
PreparedStatement preparedStatement, int position, int length) {}
124+
121125
protected void log(PreparedSql sql) {
122126
JdbcLogger logger = query.getConfig().getJdbcLogger();
123127
logger.logSql(query.getClassName(), query.getMethodName(), sql);

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ default boolean supportsBatchExecutionReturningGeneratedValues() {
129129
*
130130
* @return {@code true}, if this object supports it
131131
*/
132+
@Deprecated
132133
boolean supportsIdentityReservation();
133134

134135
/**
@@ -218,6 +219,7 @@ Sql<?> getIdentitySelectSql(
218219
* @throws DomaNullPointerException if either the {@code tableName} or the {@code columnName} is
219220
* {@code null}
220221
*/
222+
@Deprecated
221223
Sql<?> getIdentityReservationSql(
222224
String catalogName,
223225
String schemaName,

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/H2Dialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public boolean supportsUpsertEmulationWithMergeStatement() {
4747
return true;
4848
}
4949

50+
@Override
51+
public boolean supportsBatchExecutionReturningGeneratedValues() {
52+
return true;
53+
}
54+
5055
public static class H2JdbcMappingVisitor extends H214199JdbcMappingVisitor {}
5156

5257
public static class H2SqlLogFormattingVisitor extends H214199SqlLogFormattingVisitor {}

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/MysqlDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ public boolean supportsAliasInDeleteClause() {
156156
return true;
157157
}
158158

159+
@Override
160+
public boolean supportsBatchExecutionReturningGeneratedValues() {
161+
return true;
162+
}
163+
159164
@Override
160165
protected SqlNode toCountCalculatingSqlNode(SqlNode sqlNode) {
161166
switch (version) {

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/PostgresDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,11 @@ public boolean supportsAutoGeneratedKeys() {
227227
return true;
228228
}
229229

230+
@Override
231+
public boolean supportsBatchExecutionReturningGeneratedValues() {
232+
return true;
233+
}
234+
230235
@Override
231236
public JdbcType<ResultSet> getResultSetType() {
232237
return RESULT_SET;

doma-core/src/main/java/org/seasar/doma/jdbc/id/BuiltinIdentityIdGenerator.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,26 @@ public class BuiltinIdentityIdGenerator extends AbstractIdGenerator implements I
1919

2020
@Override
2121
public boolean supportsBatch(IdGenerationConfig config) {
22-
return config.getIdProvider().isAvailable();
22+
return config.getDialect().supportsBatchExecutionReturningGeneratedValues();
2323
}
2424

2525
@Override
2626
public boolean includesIdentityColumn(IdGenerationConfig config) {
27-
if (config.getIdProvider().isAvailable()) {
28-
return true;
29-
}
3027
return config.getDialect().includesIdentityColumn();
3128
}
3229

3330
@Override
3431
public boolean supportsAutoGeneratedKeys(IdGenerationConfig config) {
35-
if (config.getIdProvider().isAvailable()) {
36-
return false;
37-
}
3832
return config.getDialect().supportsAutoGeneratedKeys();
3933
}
4034

4135
@Override
4236
public Long generatePreInsert(IdGenerationConfig config) {
43-
IdProvider idProvider = config.getIdProvider();
44-
if (idProvider.isAvailable()) {
45-
return idProvider.get();
46-
}
4737
return null;
4838
}
4939

5040
@Override
5141
public Long generatePostInsert(IdGenerationConfig config, Statement statement) {
52-
if (config.getIdProvider().isAvailable()) {
53-
return null;
54-
}
5542
if (config.getDialect().supportsAutoGeneratedKeys()) {
5643
return getGeneratedValue(config, statement);
5744
}

doma-core/src/main/java/org/seasar/doma/jdbc/id/IdGenerationConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public IdProvider getIdProvider() {
7474
return idProvider;
7575
}
7676

77+
@Deprecated
7778
protected static class UnavailableIdProvider implements IdProvider {
7879
@Override
7980
public boolean isAvailable() {

doma-core/src/main/java/org/seasar/doma/jdbc/id/IdProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.seasar.doma.jdbc.id;
22

33
/** An identity provider. */
4+
@Deprecated
45
public interface IdProvider {
56

67
/**

doma-core/src/main/java/org/seasar/doma/jdbc/id/ReservedIdProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.seasar.doma.message.Message;
1818

1919
/** An identity provider that reserves identity values in advance. */
20+
@Deprecated
2021
public class ReservedIdProvider implements IdProvider {
2122

2223
protected final Config config;

0 commit comments

Comments
 (0)