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.infrastructure.item.database.AbstractPagingItemReader;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class MyBatisPagingItemReader<T> extends AbstractPagingItemReader<T> {
47
48 private String queryId;
49
50 private SqlSessionFactory sqlSessionFactory;
51
52 private SqlSessionTemplate sqlSessionTemplate;
53
54 private Map<String, Object> parameterValues;
55
56 private Supplier<Map<String, Object>> parameterValuesSupplier;
57
58
59
60
61 public MyBatisPagingItemReader() {
62 setName(getShortName(MyBatisPagingItemReader.class));
63 }
64
65
66
67
68
69
70
71 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
72 this.sqlSessionFactory = sqlSessionFactory;
73 }
74
75
76
77
78
79
80
81 public void setQueryId(String queryId) {
82 this.queryId = queryId;
83 }
84
85
86
87
88
89
90
91 public void setParameterValues(Map<String, Object> parameterValues) {
92 this.parameterValues = parameterValues;
93 }
94
95
96
97
98
99
100
101
102
103 public void setParameterValuesSupplier(Supplier<Map<String, Object>> parameterValuesSupplier) {
104 this.parameterValuesSupplier = parameterValuesSupplier;
105 }
106
107
108
109
110
111
112 @Override
113 public void afterPropertiesSet() throws Exception {
114 super.afterPropertiesSet();
115 notNull(sqlSessionFactory, "A SqlSessionFactory is required.");
116 notNull(queryId, "A queryId is required.");
117 }
118
119 @Override
120 protected void doReadPage() {
121 if (sqlSessionTemplate == null) {
122 sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
123 }
124 Map<String, Object> parameters = new HashMap<>();
125 if (parameterValues != null) {
126 parameters.putAll(parameterValues);
127 }
128 Optional.ofNullable(parameterValuesSupplier).map(Supplier::get).ifPresent(parameters::putAll);
129 parameters.put("_page", getPage());
130 parameters.put("_pagesize", getPageSize());
131 parameters.put("_skiprows", getPage() * getPageSize());
132 if (results == null) {
133 results = new CopyOnWriteArrayList<>();
134 } else {
135 results.clear();
136 }
137 results.addAll(sqlSessionTemplate.selectList(queryId, parameters));
138 }
139
140 }