Skip to content

Commit b0e58e5

Browse files
Merge branch 'master' into markdown
2 parents feef659 + ee2e2d8 commit b0e58e5

File tree

15 files changed

+402
-15
lines changed

15 files changed

+402
-15
lines changed

pom.xml

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,13 @@
163163
<dependency>
164164
<groupId>org.slf4j</groupId>
165165
<artifactId>slf4j-api</artifactId>
166-
<version>2.0.4</version>
166+
<version>2.0.6</version>
167167
<optional>true</optional>
168168
</dependency>
169169
<dependency>
170170
<groupId>ch.qos.reload4j</groupId>
171171
<artifactId>reload4j</artifactId>
172-
<version>1.2.23</version>
172+
<version>1.2.24</version>
173173
<optional>true</optional>
174174
</dependency>
175175
<dependency>
@@ -237,13 +237,13 @@
237237
<dependency>
238238
<groupId>org.mockito</groupId>
239239
<artifactId>mockito-core</artifactId>
240-
<version>4.9.0</version>
240+
<version>4.10.0</version>
241241
<scope>test</scope>
242242
</dependency>
243243
<dependency>
244244
<groupId>org.mockito</groupId>
245245
<artifactId>mockito-junit-jupiter</artifactId>
246-
<version>4.9.0</version>
246+
<version>4.10.0</version>
247247
<scope>test</scope>
248248
</dependency>
249249
<dependency>
@@ -260,8 +260,8 @@
260260
<scope>test</scope>
261261
</dependency>
262262
<dependency>
263-
<groupId>mysql</groupId>
264-
<artifactId>mysql-connector-java</artifactId>
263+
<groupId>com.mysql</groupId>
264+
<artifactId>mysql-connector-j</artifactId>
265265
<version>8.0.31</version>
266266
<scope>test</scope>
267267
</dependency>
@@ -363,6 +363,20 @@
363363
<include>org.javassist:javassist</include>
364364
</includes>
365365
</artifactSet>
366+
<filters>
367+
<filter>
368+
<artifact>ognl:ognl</artifact>
369+
<excludes>
370+
<exclude>META-INF/MANIFEST.MF</exclude>
371+
</excludes>
372+
</filter>
373+
<filter>
374+
<artifact>org.javassist:javassist</artifact>
375+
<excludes>
376+
<exclude>META-INF/MANIFEST.MF</exclude>
377+
</excludes>
378+
</filter>
379+
</filters>
366380
<relocations>
367381
<relocation>
368382
<pattern>ognl</pattern>

src/main/java/org/apache/ibatis/annotations/Select.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@
5555
*/
5656
String databaseId() default "";
5757

58+
/**
59+
* Returns whether this select affects DB data.<br>
60+
* e.g. RETURNING of PostgreSQL or OUTPUT of MS SQL Server.
61+
*
62+
* @return {@code true} if this select affects DB data; {@code false} if otherwise
63+
* @since 3.5.12
64+
*/
65+
boolean affectData() default false;
66+
5867
/**
5968
* The container annotation for {@link Select}.
6069
* @author Kazuki Shimizu

src/main/java/org/apache/ibatis/annotations/SelectProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@
9999
*/
100100
String databaseId() default "";
101101

102+
/**
103+
* Returns whether this select affects DB data.<br>
104+
* e.g. RETURNING of PostgreSQL or OUTPUT of MS SQL Server.
105+
*
106+
* @return {@code true} if this select affects DB data; {@code false} if otherwise
107+
* @since 3.5.12
108+
*/
109+
boolean affectData() default false;
110+
102111
/**
103112
* The container annotation for {@link SelectProvider}.
104113
* @author Kazuki Shimizu

src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ public MappedStatement addMappedStatement(
261261
String keyColumn,
262262
String databaseId,
263263
LanguageDriver lang,
264-
String resultSets) {
264+
String resultSets,
265+
boolean dirtySelect) {
265266

266267
if (unresolvedCacheRef) {
267268
throw new IncompleteElementException("Cache-ref not yet resolved");
@@ -285,7 +286,8 @@ public MappedStatement addMappedStatement(
285286
.resultSetType(resultSetType)
286287
.flushCacheRequired(flushCache)
287288
.useCache(useCache)
288-
.cache(currentCache);
289+
.cache(currentCache)
290+
.dirtySelect(dirtySelect);
289291

290292
ParameterMap statementParameterMap = getStatementParameterMap(parameterMap, parameterType, id);
291293
if (statementParameterMap != null) {
@@ -344,12 +346,24 @@ public MappedStatement addMappedStatement(String id, SqlSource sqlSource, Statem
344346
SqlCommandType sqlCommandType, Integer fetchSize, Integer timeout, String parameterMap, Class<?> parameterType,
345347
String resultMap, Class<?> resultType, ResultSetType resultSetType, boolean flushCache, boolean useCache,
346348
boolean resultOrdered, KeyGenerator keyGenerator, String keyProperty, String keyColumn, String databaseId,
347-
LanguageDriver lang) {
349+
LanguageDriver lang, String resultSets) {
348350
return addMappedStatement(
349351
id, sqlSource, statementType, sqlCommandType, fetchSize, timeout,
350352
parameterMap, parameterType, resultMap, resultType, resultSetType,
351353
flushCache, useCache, resultOrdered, keyGenerator, keyProperty,
352-
keyColumn, databaseId, lang, null);
354+
keyColumn, databaseId, lang, null, false);
355+
}
356+
357+
public MappedStatement addMappedStatement(String id, SqlSource sqlSource, StatementType statementType,
358+
SqlCommandType sqlCommandType, Integer fetchSize, Integer timeout, String parameterMap, Class<?> parameterType,
359+
String resultMap, Class<?> resultType, ResultSetType resultSetType, boolean flushCache, boolean useCache,
360+
boolean resultOrdered, KeyGenerator keyGenerator, String keyProperty, String keyColumn, String databaseId,
361+
LanguageDriver lang) {
362+
return addMappedStatement(
363+
id, sqlSource, statementType, sqlCommandType, fetchSize, timeout,
364+
parameterMap, parameterType, resultMap, resultType, resultSetType,
365+
flushCache, useCache, resultOrdered, keyGenerator, keyProperty,
366+
keyColumn, databaseId, lang, null);
353367
}
354368

355369
private <T> T valueOrDefault(T value, T defaultValue) {

src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ void parseStatement(Method method) {
378378
statementAnnotation.getDatabaseId(),
379379
languageDriver,
380380
// ResultSets
381-
options != null ? nullOrEmpty(options.resultSets()) : null);
381+
options != null ? nullOrEmpty(options.resultSets()) : null,
382+
statementAnnotation.isDirtySelect());
382383
});
383384
}
384385

@@ -604,7 +605,7 @@ private KeyGenerator handleSelectKeyAnnotation(SelectKey selectKeyAnnotation, St
604605

605606
assistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass, resultSetTypeEnum,
606607
flushCache, useCache, false,
607-
keyGenerator, keyProperty, keyColumn, databaseId, languageDriver, null);
608+
keyGenerator, keyProperty, keyColumn, databaseId, languageDriver, null, false);
608609

609610
id = assistant.applyCurrentNamespace(id, false);
610611

@@ -672,13 +673,15 @@ private class AnnotationWrapper {
672673
private final Annotation annotation;
673674
private final String databaseId;
674675
private final SqlCommandType sqlCommandType;
676+
private boolean dirtySelect;
675677

676678
AnnotationWrapper(Annotation annotation) {
677679
super();
678680
this.annotation = annotation;
679681
if (annotation instanceof Select) {
680682
databaseId = ((Select) annotation).databaseId();
681683
sqlCommandType = SqlCommandType.SELECT;
684+
dirtySelect = ((Select) annotation).affectData();
682685
} else if (annotation instanceof Update) {
683686
databaseId = ((Update) annotation).databaseId();
684687
sqlCommandType = SqlCommandType.UPDATE;
@@ -691,6 +694,7 @@ private class AnnotationWrapper {
691694
} else if (annotation instanceof SelectProvider) {
692695
databaseId = ((SelectProvider) annotation).databaseId();
693696
sqlCommandType = SqlCommandType.SELECT;
697+
dirtySelect = ((SelectProvider) annotation).affectData();
694698
} else if (annotation instanceof UpdateProvider) {
695699
databaseId = ((UpdateProvider) annotation).databaseId();
696700
sqlCommandType = SqlCommandType.UPDATE;
@@ -723,5 +727,9 @@ SqlCommandType getSqlCommandType() {
723727
String getDatabaseId() {
724728
return databaseId;
725729
}
730+
731+
boolean isDirtySelect() {
732+
return dirtySelect;
733+
}
726734
}
727735
}

src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,12 @@ public void parseStatementNode() {
109109
String keyProperty = context.getStringAttribute("keyProperty");
110110
String keyColumn = context.getStringAttribute("keyColumn");
111111
String resultSets = context.getStringAttribute("resultSets");
112+
boolean dirtySelect = context.getBooleanAttribute("affectData", Boolean.FALSE);
112113

113114
builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType,
114115
fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass,
115116
resultSetTypeEnum, flushCache, useCache, resultOrdered,
116-
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
117+
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets, dirtySelect);
117118
}
118119

119120
private void processSelectKeyNodes(String id, Class<?> parameterTypeClass, LanguageDriver langDriver) {
@@ -160,7 +161,7 @@ private void parseSelectKeyNode(String id, XNode nodeToHandle, Class<?> paramete
160161
builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType,
161162
fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass,
162163
resultSetTypeEnum, flushCache, useCache, resultOrdered,
163-
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, null);
164+
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, null, false);
164165

165166
id = builderAssistant.applyCurrentNamespace(id, false);
166167

src/main/java/org/apache/ibatis/mapping/MappedStatement.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public final class MappedStatement {
5656
private Log statementLog;
5757
private LanguageDriver lang;
5858
private String[] resultSets;
59+
private boolean dirtySelect;
5960

6061
MappedStatement() {
6162
// constructor disabled
@@ -174,6 +175,11 @@ public Builder resultSets(String resultSet) {
174175
return this;
175176
}
176177

178+
public Builder dirtySelect(boolean dirtySelect) {
179+
mappedStatement.dirtySelect = dirtySelect;
180+
return this;
181+
}
182+
177183
/**
178184
* Resul sets.
179185
*
@@ -290,6 +296,10 @@ public String[] getResultSets() {
290296
return resultSets;
291297
}
292298

299+
public boolean isDirtySelect() {
300+
return dirtySelect;
301+
}
302+
293303
/**
294304
* Gets the resul sets.
295305
*

src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ public <T> Cursor<T> selectCursor(String statement, Object parameter) {
120120
public <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds) {
121121
try {
122122
MappedStatement ms = configuration.getMappedStatement(statement);
123+
dirty |= ms.isDirtySelect();
123124
Cursor<T> cursor = executor.queryCursor(ms, wrapCollection(parameter), rowBounds);
124125
registerCursor(cursor);
125126
return cursor;
@@ -148,6 +149,7 @@ public <E> List<E> selectList(String statement, Object parameter, RowBounds rowB
148149
private <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
149150
try {
150151
MappedStatement ms = configuration.getMappedStatement(statement);
152+
dirty |= ms.isDirtySelect();
151153
return executor.query(ms, wrapCollection(parameter), rowBounds, handler);
152154
} catch (Exception e) {
153155
throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);

src/main/resources/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ databaseId CDATA #IMPLIED
184184
lang CDATA #IMPLIED
185185
resultOrdered (true|false) #IMPLIED
186186
resultSets CDATA #IMPLIED
187+
affectData (true|false) #IMPLIED
187188
>
188189

189190
<!ELEMENT insert (#PCDATA | selectKey | include | trim | where | set | foreach | choose | if | bind)*>

src/test/java/org/apache/ibatis/io/ExternalResourcesTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.FileNotFoundException;
2222
import java.io.FileWriter;
2323
import java.io.IOException;
24+
import java.nio.charset.StandardCharsets;
2425

2526
import org.junit.jupiter.api.AfterEach;
2627
import org.junit.jupiter.api.BeforeEach;
@@ -82,7 +83,7 @@ void testcopyExternalResource_emptyStringAsFile() {
8283
void testGetConfiguredTemplate() {
8384
String templateName = "";
8485

85-
try (FileWriter fileWriter = new FileWriter(tempFile)) {
86+
try (FileWriter fileWriter = new FileWriter(tempFile, StandardCharsets.UTF_8)) {
8687
fileWriter.append("new_command.template=templates/col_new_template_migration.sql");
8788
fileWriter.flush();
8889
templateName = ExternalResources.getConfiguredTemplate(tempFile.getAbsolutePath(), "new_command.template");

0 commit comments

Comments
 (0)