1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.spring.batch;
17
18 import static org.springframework.util.Assert.notNull;
19 import static org.springframework.util.ClassUtils.getShortName;
20
21 import java.util.HashMap;
22 import java.util.Map;
23 import java.util.Optional;
24 import java.util.concurrent.CopyOnWriteArrayList;
25 import java.util.function.Supplier;
26
27 import org.apache.ibatis.session.ExecutorType;
28 import org.apache.ibatis.session.SqlSession;
29 import org.apache.ibatis.session.SqlSessionFactory;
30 import org.mybatis.spring.SqlSessionTemplate;
31 import org.springframework.batch.item.database.AbstractPagingItemReader;
32
33
34
35
36
37
38
39
40
41
42 public class MyBatisPagingItemReader<T> extends AbstractPagingItemReader<T> {
43
44 private String queryId;
45
46 private SqlSessionFactory sqlSessionFactory;
47
48 private SqlSessionTemplate sqlSessionTemplate;
49
50 private Map<String, Object> parameterValues;
51
52 private Supplier<Map<String, Object>> parameterValuesSupplier;
53
54 public MyBatisPagingItemReader() {
55 setName(getShortName(MyBatisPagingItemReader.class));
56 }
57
58
59
60
61
62
63
64 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
65 this.sqlSessionFactory = sqlSessionFactory;
66 }
67
68
69
70
71
72
73
74 public void setQueryId(String queryId) {
75 this.queryId = queryId;
76 }
77
78
79
80
81
82
83
84 public void setParameterValues(Map<String, Object> parameterValues) {
85 this.parameterValues = parameterValues;
86 }
87
88
89
90
91
92
93
94
95
96 public void setParameterValuesSupplier(Supplier<Map<String, Object>> parameterValuesSupplier) {
97 this.parameterValuesSupplier = parameterValuesSupplier;
98 }
99
100
101
102
103
104
105 @Override
106 public void afterPropertiesSet() throws Exception {
107 super.afterPropertiesSet();
108 notNull(sqlSessionFactory, "A SqlSessionFactory is required.");
109 notNull(queryId, "A queryId is required.");
110 }
111
112 @Override
113 protected void doReadPage() {
114 if (sqlSessionTemplate == null) {
115 sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
116 }
117 Map<String, Object> parameters = new HashMap<>();
118 if (parameterValues != null) {
119 parameters.putAll(parameterValues);
120 }
121 Optional.ofNullable(parameterValuesSupplier).map(Supplier::get).ifPresent(parameters::putAll);
122 parameters.put("_page", getPage());
123 parameters.put("_pagesize", getPageSize());
124 parameters.put("_skiprows", getPage() * getPageSize());
125 if (results == null) {
126 results = new CopyOnWriteArrayList<>();
127 } else {
128 results.clear();
129 }
130 results.addAll(sqlSessionTemplate.selectList(queryId, parameters));
131 }
132
133 }