Skip to content

Commit 7d0d94b

Browse files
committed
Merge branch 'master' into 3.x
2 parents 789a832 + 2122b94 commit 7d0d94b

File tree

7 files changed

+92
-2
lines changed

7 files changed

+92
-2
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@
219219
<dependency>
220220
<groupId>org.slf4j</groupId>
221221
<artifactId>slf4j-simple</artifactId>
222-
<version>2.0.2</version>
222+
<version>2.0.3</version>
223223
<scope>test</scope>
224224
</dependency>
225225

src/main/java/org/mybatis/spring/batch/MyBatisCursorItemReader.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.HashMap;
2222
import java.util.Iterator;
2323
import java.util.Map;
24+
import java.util.Optional;
25+
import java.util.function.Supplier;
2426

2527
import org.apache.ibatis.cursor.Cursor;
2628
import org.apache.ibatis.session.ExecutorType;
@@ -41,6 +43,7 @@ public class MyBatisCursorItemReader<T> extends AbstractItemCountingItemStreamIt
4143
private SqlSession sqlSession;
4244

4345
private Map<String, Object> parameterValues;
46+
private Supplier<Map<String, Object>> parameterValuesSupplier;
4447

4548
private Cursor<T> cursor;
4649
private Iterator<T> cursorIterator;
@@ -65,6 +68,8 @@ protected void doOpen() throws Exception {
6568
parameters.putAll(parameterValues);
6669
}
6770

71+
Optional.ofNullable(parameterValuesSupplier).map(Supplier::get).ifPresent(parameters::putAll);
72+
6873
sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE);
6974
cursor = sqlSession.selectCursor(queryId, parameters);
7075
cursorIterator = cursor.iterator();
@@ -121,4 +126,16 @@ public void setQueryId(String queryId) {
121126
public void setParameterValues(Map<String, Object> parameterValues) {
122127
this.parameterValues = parameterValues;
123128
}
129+
130+
/**
131+
* The parameter supplier used to get parameter values for the query execution.
132+
*
133+
* @param parameterValuesSupplier
134+
* the supplier used to get values keyed by the parameter named used in the query string.
135+
*
136+
* @since 2.1.0
137+
*/
138+
public void setParameterValuesSupplier(Supplier<Map<String, Object>> parameterValuesSupplier) {
139+
this.parameterValuesSupplier = parameterValuesSupplier;
140+
}
124141
}

src/main/java/org/mybatis/spring/batch/MyBatisPagingItemReader.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020

2121
import java.util.HashMap;
2222
import java.util.Map;
23+
import java.util.Optional;
2324
import java.util.concurrent.CopyOnWriteArrayList;
25+
import java.util.function.Supplier;
2426

2527
import org.apache.ibatis.session.ExecutorType;
2628
import org.apache.ibatis.session.SqlSession;
@@ -47,6 +49,8 @@ public class MyBatisPagingItemReader<T> extends AbstractPagingItemReader<T> {
4749

4850
private Map<String, Object> parameterValues;
4951

52+
private Supplier<Map<String, Object>> parameterValuesSupplier;
53+
5054
public MyBatisPagingItemReader() {
5155
setName(getShortName(MyBatisPagingItemReader.class));
5256
}
@@ -81,6 +85,18 @@ public void setParameterValues(Map<String, Object> parameterValues) {
8185
this.parameterValues = parameterValues;
8286
}
8387

88+
/**
89+
* The parameter supplier used to get parameter values for the query execution.
90+
*
91+
* @param parameterValuesSupplier
92+
* the supplier used to get values keyed by the parameter named used in the query string.
93+
*
94+
* @since 2.1.0
95+
*/
96+
public void setParameterValuesSupplier(Supplier<Map<String, Object>> parameterValuesSupplier) {
97+
this.parameterValuesSupplier = parameterValuesSupplier;
98+
}
99+
84100
/**
85101
* Check mandatory properties.
86102
*
@@ -102,6 +118,7 @@ protected void doReadPage() {
102118
if (parameterValues != null) {
103119
parameters.putAll(parameterValues);
104120
}
121+
Optional.ofNullable(parameterValuesSupplier).map(Supplier::get).ifPresent(parameters::putAll);
105122
parameters.put("_page", getPage());
106123
parameters.put("_pagesize", getPageSize());
107124
parameters.put("_skiprows", getPage() * getPageSize());

src/main/java/org/mybatis/spring/batch/builder/MyBatisCursorItemReaderBuilder.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Map;
1919
import java.util.Optional;
20+
import java.util.function.Supplier;
2021

2122
import org.apache.ibatis.session.SqlSessionFactory;
2223
import org.mybatis.spring.batch.MyBatisCursorItemReader;
@@ -35,6 +36,7 @@ public class MyBatisCursorItemReaderBuilder<T> {
3536
private SqlSessionFactory sqlSessionFactory;
3637
private String queryId;
3738
private Map<String, Object> parameterValues;
39+
private Supplier<Map<String, Object>> parameterValuesSupplier;
3840
private Boolean saveState;
3941
private Integer maxItemCount;
4042

@@ -83,6 +85,24 @@ public MyBatisCursorItemReaderBuilder<T> parameterValues(Map<String, Object> par
8385
return this;
8486
}
8587

88+
/**
89+
* Set the parameter supplier to be used to get parameters for the query execution.
90+
*
91+
* @param parameterValuesSupplier
92+
* the parameter supplier to be used to get parameters for the query execution
93+
*
94+
* @return this instance for method chaining
95+
*
96+
* @see MyBatisCursorItemReader#setParameterValuesSupplier(Supplier)
97+
*
98+
* @since 2.1.0
99+
*/
100+
public MyBatisCursorItemReaderBuilder<T> parameterValuesSupplier(
101+
Supplier<Map<String, Object>> parameterValuesSupplier) {
102+
this.parameterValuesSupplier = parameterValuesSupplier;
103+
return this;
104+
}
105+
86106
/**
87107
* Configure if the state of the {@link org.springframework.batch.item.ItemStreamSupport} should be persisted within
88108
* the {@link org.springframework.batch.item.ExecutionContext} for restart purposes.
@@ -124,6 +144,7 @@ public MyBatisCursorItemReader<T> build() {
124144
reader.setSqlSessionFactory(this.sqlSessionFactory);
125145
reader.setQueryId(this.queryId);
126146
reader.setParameterValues(this.parameterValues);
147+
reader.setParameterValuesSupplier(this.parameterValuesSupplier);
127148
Optional.ofNullable(this.saveState).ifPresent(reader::setSaveState);
128149
Optional.ofNullable(this.maxItemCount).ifPresent(reader::setMaxItemCount);
129150
return reader;

src/main/java/org/mybatis/spring/batch/builder/MyBatisPagingItemReaderBuilder.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Map;
1919
import java.util.Optional;
20+
import java.util.function.Supplier;
2021

2122
import org.apache.ibatis.session.SqlSessionFactory;
2223
import org.mybatis.spring.batch.MyBatisPagingItemReader;
@@ -35,6 +36,7 @@ public class MyBatisPagingItemReaderBuilder<T> {
3536
private SqlSessionFactory sqlSessionFactory;
3637
private String queryId;
3738
private Map<String, Object> parameterValues;
39+
private Supplier<Map<String, Object>> parameterValuesSupplier;
3840
private Integer pageSize;
3941
private Boolean saveState;
4042
private Integer maxItemCount;
@@ -84,6 +86,24 @@ public MyBatisPagingItemReaderBuilder<T> parameterValues(Map<String, Object> par
8486
return this;
8587
}
8688

89+
/**
90+
* Set the parameter supplier to be used to get parameters for the query execution.
91+
*
92+
* @param parameterValuesSupplier
93+
* the parameter supplier to be used to get parameters for the query execution
94+
*
95+
* @return this instance for method chaining
96+
*
97+
* @see MyBatisPagingItemReader#setParameterValuesSupplier(Supplier)
98+
*
99+
* @since 2.1.0
100+
*/
101+
public MyBatisPagingItemReaderBuilder<T> parameterValuesSupplier(
102+
Supplier<Map<String, Object>> parameterValuesSupplier) {
103+
this.parameterValuesSupplier = parameterValuesSupplier;
104+
return this;
105+
}
106+
87107
/**
88108
* The number of records to request per page/query. Defaults to 10. Must be greater than zero.
89109
*
@@ -140,6 +160,7 @@ public MyBatisPagingItemReader<T> build() {
140160
reader.setSqlSessionFactory(this.sqlSessionFactory);
141161
reader.setQueryId(this.queryId);
142162
reader.setParameterValues(this.parameterValues);
163+
reader.setParameterValuesSupplier(this.parameterValuesSupplier);
143164
Optional.ofNullable(this.pageSize).ifPresent(reader::setPageSize);
144165
Optional.ofNullable(this.saveState).ifPresent(reader::setSaveState);
145166
Optional.ofNullable(this.maxItemCount).ifPresent(reader::setMaxItemCount);

src/test/java/org/mybatis/spring/batch/builder/MyBatisCursorItemReaderBuilderTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717

1818
import java.util.Arrays;
1919
import java.util.Collections;
20+
import java.util.HashMap;
2021
import java.util.List;
22+
import java.util.Map;
2123

2224
import org.apache.ibatis.cursor.Cursor;
2325
import org.apache.ibatis.session.ExecutorType;
@@ -56,7 +58,10 @@ void setUp() {
5658

5759
Mockito.when(this.sqlSessionFactory.openSession(ExecutorType.SIMPLE)).thenReturn(this.sqlSession);
5860
Mockito.when(this.cursor.iterator()).thenReturn(getFoos().iterator());
59-
Mockito.when(this.sqlSession.selectCursor("selectFoo", Collections.singletonMap("id", 1))).thenReturn(this.cursor);
61+
Map<String, Object> parameters = new HashMap<>();
62+
parameters.put("id", 1);
63+
parameters.put("name", "Doe");
64+
Mockito.when(this.sqlSession.selectCursor("selectFoo", parameters)).thenReturn(this.cursor);
6065
}
6166

6267
@Test
@@ -67,6 +72,7 @@ void testConfiguration() throws Exception {
6772
.sqlSessionFactory(this.sqlSessionFactory)
6873
.queryId("selectFoo")
6974
.parameterValues(Collections.singletonMap("id", 1))
75+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
7076
.build();
7177
// @formatter:on
7278
itemReader.afterPropertiesSet();
@@ -93,6 +99,7 @@ void testConfigurationSaveStateIsFalse() throws Exception {
9399
.sqlSessionFactory(this.sqlSessionFactory)
94100
.queryId("selectFoo")
95101
.parameterValues(Collections.singletonMap("id", 1))
102+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
96103
.saveState(false)
97104
.build();
98105
// @formatter:on
@@ -118,6 +125,7 @@ void testConfigurationMaxItemCount() throws Exception {
118125
.sqlSessionFactory(this.sqlSessionFactory)
119126
.queryId("selectFoo")
120127
.parameterValues(Collections.singletonMap("id", 1))
128+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
121129
.maxItemCount(2)
122130
.build();
123131
// @formatter:on

src/test/java/org/mybatis/spring/batch/builder/MyBatisPagingItemReaderBuilderTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ void setUp() {
6767
Mockito.when(this.sqlSessionFactory.openSession(ExecutorType.BATCH)).thenReturn(this.sqlSession);
6868
Map<String, Object> parameters = new HashMap<>();
6969
parameters.put("id", 1);
70+
parameters.put("name", "Doe");
7071
parameters.put("_page", 0);
7172
parameters.put("_pagesize", 10);
7273
parameters.put("_skiprows", 0);
@@ -80,6 +81,7 @@ void testConfiguration() throws Exception {
8081
.sqlSessionFactory(this.sqlSessionFactory)
8182
.queryId("selectFoo")
8283
.parameterValues(Collections.singletonMap("id", 1))
84+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
8385
.build();
8486
// @formatter:on
8587
itemReader.afterPropertiesSet();
@@ -105,6 +107,7 @@ void testConfigurationSaveStateIsFalse() throws Exception {
105107
.sqlSessionFactory(this.sqlSessionFactory)
106108
.queryId("selectFoo")
107109
.parameterValues(Collections.singletonMap("id", 1))
110+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
108111
.saveState(false)
109112
.build();
110113
// @formatter:on
@@ -128,6 +131,7 @@ void testConfigurationMaxItemCount() throws Exception {
128131
.sqlSessionFactory(this.sqlSessionFactory)
129132
.queryId("selectFoo")
130133
.parameterValues(Collections.singletonMap("id", 1))
134+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
131135
.maxItemCount(2)
132136
.build();
133137
// @formatter:on
@@ -152,6 +156,7 @@ void testConfigurationPageSize() throws Exception {
152156
.sqlSessionFactory(this.sqlSessionFactory)
153157
.queryId("selectFoo")
154158
.parameterValues(Collections.singletonMap("id", 1))
159+
.parameterValuesSupplier(() -> Collections.singletonMap("name", "Doe"))
155160
.pageSize(2)
156161
.build();
157162
// @formatter:on
@@ -160,6 +165,7 @@ void testConfigurationPageSize() throws Exception {
160165
Map<String, Object> parameters = new HashMap<>();
161166
parameters.put("id", 1);
162167
parameters.put("_page", 0);
168+
parameters.put("name", "Doe");
163169
parameters.put("_pagesize", 2);
164170
parameters.put("_skiprows", 0);
165171
Mockito.when(this.sqlSession.selectList("selectFoo", parameters)).thenReturn(getFoos());

0 commit comments

Comments
 (0)