Commit ab78e9de8cd2987e951310aa9215b21eeb906a43

Authored by 王彬
1 parent c2088608
Exists in master

1.upgrade repository version

Showing 31 changed files with 293 additions and 4833 deletions   Show diff stats
@@ -21,9 +21,7 @@ dependencies { @@ -21,9 +21,7 @@ dependencies {
21 compile("org.springframework.boot:spring-boot-starter:2.0.5.RELEASE") 21 compile("org.springframework.boot:spring-boot-starter:2.0.5.RELEASE")
22 compile("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final") 22 compile("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final")
23 compile('org.springframework:spring-jdbc:5.1.9.RELEASE') 23 compile('org.springframework:spring-jdbc:5.1.9.RELEASE')
24 - compile('com.alibaba:druid:1.2.4')  
25 - compile("org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter:5.0.0-alpha")  
26 - compile("org.apache.shardingsphere:shardingsphere-infra-binder:6.0.0-alpha") 24 + compile('com.alibaba:druid-spring-boot-starter:1.2.4')
27 testCompile('mysql:mysql-connector-java:8.0.11') 25 testCompile('mysql:mysql-connector-java:8.0.11')
28 } 26 }
29 27
@@ -58,7 +56,7 @@ uploadArchives { @@ -58,7 +56,7 @@ uploadArchives {
58 authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) 56 authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
59 } 57 }
60 pom.project { 58 pom.project {
61 - version '2.2.4' 59 + version '2.3.0'
62 artifactId ARTIFACT_Id 60 artifactId ARTIFACT_Id
63 groupId GROUP_ID 61 groupId GROUP_ID
64 packaging TYPE 62 packaging TYPE
src/main/java/com/taover/repository/CustomJdbcTemplate.java
@@ -1,929 +0,0 @@ @@ -1,929 +0,0 @@
1 -package com.taover.repository;  
2 -  
3 -import java.io.Serializable;  
4 -import java.lang.reflect.Field;  
5 -import java.lang.reflect.ParameterizedType;  
6 -import java.math.BigDecimal;  
7 -import java.sql.Connection;  
8 -import java.sql.PreparedStatement;  
9 -import java.sql.SQLException;  
10 -import java.util.ArrayList;  
11 -import java.util.HashMap;  
12 -import java.util.Iterator;  
13 -import java.util.List;  
14 -import java.util.Map;  
15 -  
16 -import javax.annotation.Resource;  
17 -import javax.persistence.Column;  
18 -import javax.persistence.Id;  
19 -import javax.persistence.Table;  
20 -  
21 -import org.springframework.dao.DataRetrievalFailureException;  
22 -import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;  
23 -import org.springframework.jdbc.core.JdbcTemplate;  
24 -import org.springframework.jdbc.core.PreparedStatementCreator;  
25 -import org.springframework.jdbc.core.PreparedStatementSetter;  
26 -import org.springframework.jdbc.support.GeneratedKeyHolder;  
27 -import org.springframework.jdbc.support.KeyHolder;  
28 -  
29 -import com.taover.repository.mapper.CustomJdbcTemplateRowMapper;  
30 -import com.taover.repository.util.UtilsSql;  
31 -  
32 -/**  
33 - *  
34 - * @author root  
35 - *  
36 - * @param <T>  
37 - * @param <ID>  
38 - */  
39 -public class CustomJdbcTemplate<T, ID extends Serializable> {  
40 - @Resource  
41 - private JdbcTemplate jdbcTemplateRead;  
42 - @Resource  
43 - private JdbcTemplate jdbcTemplateWrite;  
44 -  
45 - private Map<String, String> beanToTableField;  
46 - private Map<String, String> tableToBeanField;  
47 - private String tableFieldNameListGapWithComma;  
48 - private String idTableFieldName;  
49 - private String idBeanFieldName;  
50 - private String dbName;  
51 - private String tableName;  
52 - private Class<T> tClassInfo;  
53 - private CustomJdbcTemplateRowMapper customJdbcTemplateRowMapper;  
54 -  
55 - public CustomJdbcTemplateRowMapper getCustomJdbcTemplateRowMapper(){  
56 - return this.customJdbcTemplateRowMapper;  
57 - }  
58 -  
59 - public CustomJdbcTemplate(JdbcTemplate jdbcTemplateWrite) throws Exception{  
60 - this();  
61 - this.jdbcTemplateWrite = jdbcTemplateWrite;  
62 - this.jdbcTemplateRead = jdbcTemplateWrite;  
63 - }  
64 -  
65 - public CustomJdbcTemplate() throws Exception{  
66 - //获取泛型类Class  
67 - this.tClassInfo = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];  
68 -  
69 - //检查实体声明  
70 - Table annoTable = (Table) tClassInfo.getAnnotation(Table.class);  
71 - if(annoTable == null){  
72 - throw new Exception("DAO层初始化失败,失败原因:"+tClassInfo.getName()+"实体类,没有@Table注解指定表名");  
73 - }  
74 - this.tableName = annoTable.name();  
75 - String schema = annoTable.schema();  
76 - String catalog = annoTable.catalog();  
77 - if(schema != null && !"".equals(schema)){  
78 - this.dbName = schema;  
79 - }else if(catalog != null && !"".equals(catalog)){  
80 - this.dbName = catalog;  
81 - }  
82 -  
83 - //初始化数据  
84 - beanToTableField = new HashMap<String, String>();  
85 - tableToBeanField = new HashMap<String, String>();  
86 - tableFieldNameListGapWithComma = "";  
87 - Field[] declaredFields = tClassInfo.getDeclaredFields();  
88 - for(int i=0; i<declaredFields.length; ++i){  
89 - Field currField = declaredFields[i];  
90 - String fieldName = currField.getName();  
91 - Id annoId = (Id)currField.getAnnotation(Id.class);  
92 - Column annoColumn = (Column)currField.getAnnotation(Column.class);  
93 - if(annoId != null){  
94 - if(annoColumn == null){  
95 - idTableFieldName = this.camelToUnderline(fieldName);  
96 - }else{  
97 - idTableFieldName = annoColumn.name();  
98 - }  
99 - idBeanFieldName = fieldName;  
100 - tableFieldNameListGapWithComma += idTableFieldName+",";  
101 - beanToTableField.put(fieldName, idTableFieldName);  
102 - tableToBeanField.put(idTableFieldName, fieldName);  
103 - }else{  
104 - if(annoColumn != null){  
105 - String tableFieldName = annoColumn.name();  
106 - tableFieldNameListGapWithComma += tableFieldName+",";  
107 - beanToTableField.put(fieldName, tableFieldName);  
108 - tableToBeanField.put(tableFieldName, fieldName);  
109 - }  
110 - }  
111 - }  
112 -  
113 - //检验是否有属性  
114 - if(beanToTableField.isEmpty()){  
115 - throw new Exception("DAO层初始化失败,失败原因:"+this.tClassInfo.getName()+"实体类,没有在实体中找到属性信息");  
116 - }  
117 -  
118 - //去除逗号  
119 - tableFieldNameListGapWithComma = tableFieldNameListGapWithComma.substring(0, tableFieldNameListGapWithComma.length()-1);  
120 -  
121 - //创建rowmapper  
122 - this.customJdbcTemplateRowMapper = new CustomJdbcTemplateRowMapper(this.tClassInfo, this.tableToBeanField);  
123 - }  
124 -  
125 - /**  
126 - * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。</br>  
127 - * 例如:HelloWorld->HELLO_WORLD  
128 - * @param name 转换前的驼峰式命名的字符串  
129 - * @return 转换后下划线大写方式命名的字符串  
130 - */  
131 - private String camelToUnderline(String name) {  
132 - StringBuilder result = new StringBuilder();  
133 - if (name != null && name.length() > 0) {  
134 - // 将第一个字符处理成大写  
135 - result.append(name.substring(0, 1).toUpperCase());  
136 - // 循环处理其余字符  
137 - for (int i = 1; i < name.length(); i++) {  
138 - String s = name.substring(i, i + 1);  
139 - // 在大写字母前添加下划线  
140 - if (Character.isUpperCase(s.charAt(0)) && Character.isLetter(s.charAt(0))) {  
141 - result.append("_");  
142 - }  
143 - // 其他字符直接转成大写  
144 - result.append(s.toUpperCase());  
145 - }  
146 - }  
147 - return result.toString();  
148 - }  
149 -  
150 - /**  
151 - * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>  
152 - * 例如:HELLO_WORLD->HelloWorld  
153 - * @param name 转换前的下划线大写方式命名的字符串  
154 - * @return 转换后的驼峰式命名的字符串  
155 - */  
156 - private String underlineToCamel(String name) {  
157 - StringBuilder result = new StringBuilder();  
158 - // 快速检查  
159 - if (name == null || name.isEmpty()) {  
160 - // 没必要转换  
161 - return "";  
162 - } else if (!name.contains("_")) {  
163 - // 不含下划线,仅将首字母小写  
164 - return name.substring(0, 1).toLowerCase() + name.substring(1);  
165 - }  
166 - // 用下划线将原始字符串分割  
167 - String camels[] = name.split("_");  
168 - for (String camel : camels) {  
169 - // 跳过原始字符串中开头、结尾的下换线或双重下划线  
170 - if (camel.isEmpty()) {  
171 - continue;  
172 - }  
173 - // 处理真正的驼峰片段  
174 - if (result.length() == 0) {  
175 - // 第一个驼峰片段,全部字母都小写  
176 - result.append(camel.toLowerCase());  
177 - } else {  
178 - // 其他的驼峰片段,首字母大写  
179 - result.append(camel.substring(0, 1).toUpperCase());  
180 - result.append(camel.substring(1).toLowerCase());  
181 - }  
182 - }  
183 - return result.toString();  
184 - }  
185 -  
186 - private void appendWhereCondition(StringBuffer sql, StringBuffer pql, List<Object> list, List<Object[]> condition) {  
187 - if (condition == null || condition.size() == 0) return;  
188 - Object[] con = condition.get(0);  
189 - int iLen = condition.size();  
190 - sql.append(" WHERE ");  
191 - pql.append(" WHERE ");  
192 - sql.append(con[0]);  
193 - pql.append(con[0]);  
194 - if (null != con[1] && con[1] != "" && con[1] != "useArg[0]") {  
195 - sql.append(" " + con[1] + " ?");  
196 - pql.append(" " + con[1] + " " + con[2]);  
197 - list.add(con[2]);  
198 - }  
199 - for (int i = 1; i < iLen; i++) {  
200 - con = condition.get(i);  
201 - sql.append(" AND ");  
202 - pql.append(" AND ");  
203 - sql.append(con[0]);  
204 - pql.append(con[0]);  
205 - if (null == con[1] || "" == con[1] || con[1] == "useArg[0]") continue;  
206 - sql.append(" " + con[1] + " ?");  
207 - pql.append(" " + con[1] + " " + con[2]);  
208 - list.add(con[2]);  
209 - }  
210 - }  
211 -  
212 - private void appendWhereConditionForCount(StringBuffer sql, List<Object[]> condition) {  
213 - if (condition == null || condition.size() == 0) return;  
214 - Object[] con = condition.get(0);  
215 - int iLen = condition.size();  
216 - sql.append(" WHERE ");  
217 - sql.append(con[0]);  
218 - if (null != con[1] && con[1] != "" && con[1] != "useArg[0]") {  
219 - sql.append(" " + con[1] + " ?");  
220 - }  
221 - for (int i = 1; i < iLen; i++) {  
222 - con = condition.get(i);  
223 - sql.append(" AND ");  
224 - sql.append(con[0]);  
225 - if (null == con[1] || "" == con[1] || con[1] == "useArg[0]") continue;  
226 - sql.append(" " + con[1] + " ?");  
227 - }  
228 - }  
229 -  
230 - private void appendSetSql(StringBuffer sql, StringBuffer pql, List<Object> list, List<Object[]> obj) {  
231 - for (Object[] arg : obj) {  
232 - if (arg.length > 2) {  
233 - sql.append(" " + arg[0] + " = " + arg[0] + arg[2] + " ?,");  
234 - pql.append(" " + arg[0] + " = " + arg[0] + arg[2] + arg[1] +",");  
235 - list.add(arg[1]);  
236 - }else if(arg.length == 2) {  
237 - sql.append(" " + arg[0] + " = ?,");  
238 - pql.append(" " + arg[0] + " = " + arg[1] + ",");  
239 - list.add(arg[1]);  
240 - }else if(arg.length == 1) {  
241 - sql.append(" " + arg[0] + ",");  
242 - pql.append(" " + arg[0] + ",");  
243 - }  
244 - }  
245 - }  
246 -  
247 - private String getTableSql(){  
248 - return (this.dbName == null || "".equals(this.dbName.trim()))?  
249 - ("`"+this.tableName+"`"):  
250 - ("`"+this.dbName+"`.`"+this.tableName+"`");  
251 - }  
252 -  
253 - /**  
254 - * 按主键查询  
255 - */  
256 - public T findEntityByID(ID id) {  
257 - return findEntityByID(id, true, false);  
258 - }  
259 -  
260 - /**  
261 - * 按主键查询  
262 - * isLock 是否锁定, 默认不锁  
263 - * fromWriteDB 是否从写库读写,默认从读库查询  
264 - */  
265 - public T findEntityByID(ID id, boolean fromWriteDB, boolean isLock) {  
266 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
267 - StringBuffer pql = new StringBuffer(sql.toString());  
268 - sql.append(" WHERE "+idTableFieldName+" = ?");  
269 - pql.append(" WHERE "+idTableFieldName+" = " + id);  
270 - if (isLock) {  
271 - sql.append(" FOR UPDATE");  
272 - pql.append(" FOR UPDATE");  
273 - }  
274 - return (T) (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForObject(sql.toString(), this.customJdbcTemplateRowMapper, id);  
275 - }  
276 -  
277 - /**  
278 - * 根据条件List<Object[]>查询  
279 - * Object[]数组长度是3  
280 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
281 - */  
282 - public T findEntityByCondition(List<Object[]> condition) throws Exception {  
283 - List<T> tempList = findListByCondition(condition, null, false);  
284 - if(tempList == null || tempList.size() == 0){  
285 - return null;  
286 - }  
287 - if(tempList != null && tempList.size() == 1){  
288 - return tempList.get(0);  
289 - }else{  
290 - throw new Exception("found multi rows with condition,but this func expected one row");  
291 - }  
292 - }  
293 -  
294 - /**  
295 - * 根据条件sql查询  
296 - * sqlCondition 为where 后面的条件。  
297 - */  
298 - public T findEntityBySql(String sqlCondition) throws Exception{  
299 - List<T> tempList = findListBySql(sqlCondition, false);  
300 - if(tempList == null || tempList.size() == 0){  
301 - return null;  
302 - }  
303 - if(tempList != null && tempList.size() == 1){  
304 - return tempList.get(0);  
305 - }else{  
306 - throw new Exception("found multi rows with condition,but this func expected one row");  
307 - }  
308 - }  
309 -  
310 - /**  
311 - * 根据条件List<Object[]>查询  
312 - * Object[]数组长度是3  
313 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
314 - */  
315 - public List<T> findListByCondition(List<Object[]> condition) {  
316 - return findListByCondition(condition,null, false);  
317 - }  
318 -  
319 - /**  
320 - * 根据条件List<Object[]>查询  
321 - * Object[]数组长度是3  
322 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
323 - */  
324 - public List<T> findListByCondition(List<Object[]> condition, String sortCondition, boolean fromWriteDB) {  
325 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
326 - StringBuffer pql = new StringBuffer(sql.toString());  
327 - List<Object> list = new ArrayList<Object>();  
328 - this.appendWhereCondition(sql, pql, list, condition);  
329 - if(sortCondition != null && !sortCondition.equals("")){  
330 - sql.append(" " + sortCondition + " ");  
331 - pql.append(" " + sortCondition + " ");  
332 - }  
333 - return (List<T>)(fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(sql.toString(), this.customJdbcTemplateRowMapper, list.toArray());  
334 - }  
335 -  
336 - /**  
337 - * 根据条件sql查询  
338 - * sqlCondition 为where 后面的条件。  
339 - */  
340 - public List<T> findListBySql(String sqlCondition) {  
341 - return findListBySql(sqlCondition, false);  
342 - }  
343 -  
344 - /**  
345 - * 根据条件sql查询  
346 - * sqlCondition 为where 后面的条件。  
347 - */  
348 - public List<T> findListBySql(String sqlCondition, boolean fromWriteDB) {  
349 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
350 - return (List<T>)(fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(sql.toString(), this.customJdbcTemplateRowMapper);  
351 - }  
352 -  
353 - /**  
354 - * 按条件分页查询  
355 - * Object[]数组长度是3  
356 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
357 - */  
358 - public Map<String, Object> findPageByCondition(List<Object[]> condition,int page, int pageSize) {  
359 - return findPageByCondition(condition, null , page, pageSize, false);  
360 - }  
361 -  
362 - /**  
363 - * 按条件分页查询  
364 - * Object[]数组长度是3  
365 - * Object[]第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
366 - * boolean isUseCache, 是否用缓存,默认用。  
367 - * boolean isAddCache, 是否添加缓存,默认添加。  
368 - */  
369 - public Map<String, Object> findPageByCondition(List<Object[]> condition,String sortCondition, int page, int pageSize, boolean fromWriteDB) {  
370 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
371 - StringBuffer pql = new StringBuffer(sql.toString());  
372 - StringBuffer sqlCount = new StringBuffer("SELECT COUNT(1) rowCount FROM "+this.getTableSql());  
373 -  
374 - List<Object> count_list = new ArrayList<Object>();  
375 - List<Object> page_list = new ArrayList<Object>();  
376 - this.appendWhereConditionForCount(sqlCount, condition);  
377 - this.appendWhereCondition(sql, pql, count_list, condition);  
378 - for (int i = 0; i < count_list.size(); i++)  
379 - page_list.add(count_list.get(i));  
380 -  
381 - page_list.add((page - 1) * pageSize);  
382 - page_list.add(pageSize);  
383 -  
384 - if(sortCondition != null && !sortCondition.equals("")){  
385 - sql.append(" " + sortCondition + " ");  
386 - pql.append(" " + sortCondition + " ");  
387 - }  
388 -  
389 - String pageSql = sql.toString() + " limit ?, ?";  
390 -  
391 - Map<String, Object> totalRowsMap = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForMap(sqlCount.toString(), count_list.toArray()) ;  
392 - List<T> resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(pageSql.toString(), this.customJdbcTemplateRowMapper, page_list.toArray());  
393 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(totalRowsMap.get("rowCount").toString()), resultList);  
394 - }  
395 -  
396 - /**  
397 - * 按sql分页查询, sqlCondition为where 后条件sql  
398 - */  
399 - public Map<String, Object> findPageBySql(String sqlCondition, int page, int pageSize) {  
400 - return findPageBySql(sqlCondition, page, pageSize, false);  
401 - }  
402 -  
403 - /**  
404 - * 按sql分页查询, sqlCondition为where 后条件sql  
405 - */  
406 - public Map<String, Object> findPageBySql(String sqlCondition, int page, int pageSize,boolean fromWriteDB) {  
407 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition );  
408 - StringBuffer sqlCount = new StringBuffer("SELECT count(1) rowCount FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
409 - String pageSql = sql.toString() + " limit ?, ?";  
410 - String pagePql = sql.toString() + " limit " + ((page -1) * pageSize) + ", " + (page * pageSize);  
411 - List<Object> page_list = new ArrayList<Object>();  
412 - page_list.add((page - 1) * pageSize);  
413 - page_list.add(page * pageSize);  
414 -  
415 - Map<String, Object> totalRowsMap = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForMap(sqlCount.toString());  
416 - List<T> resultList =(fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(pageSql.toString(), this.customJdbcTemplateRowMapper, page_list.toArray());  
417 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(totalRowsMap.get("rowCount").toString()), resultList);  
418 - }  
419 -  
420 - /**  
421 - * 添加  
422 - */  
423 - public Number addEntityForAutoincrementId(T entity) {  
424 - StringBuffer sqlForLog = new StringBuffer("INSERT INTO "+this.getTableSql()+"(");  
425 - StringBuffer sqlValueForLog = new StringBuffer(") VALUES (");  
426 - StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"(");  
427 - StringBuffer sqlColumnPart = new StringBuffer(") VALUES (");  
428 - List<Object> paramList = new ArrayList<Object>();  
429 -  
430 - Iterator<String> beanFieldIter = this.beanToTableField.keySet().iterator();  
431 - while(beanFieldIter.hasNext()){  
432 - String beanFieldName = beanFieldIter.next();  
433 - String tableFieldName = this.beanToTableField.get(beanFieldName);  
434 - Field beanField;  
435 - Object beanFieldValue = null;  
436 - try {  
437 - beanField = this.tClassInfo.getDeclaredField(beanFieldName);  
438 - beanField.setAccessible(true);  
439 - beanFieldValue = beanField.get(entity);  
440 - } catch (Exception e) {  
441 - e.printStackTrace();  
442 - }  
443 -  
444 - if(tableFieldName == null || beanFieldName == null || beanFieldValue == null){  
445 - continue;  
446 - }  
447 -  
448 - sqlForLog.append("`"+tableFieldName+"`,");  
449 - sqlValueForLog.append(beanFieldValue.toString()+",");  
450 - sqlInsertPart.append("`"+tableFieldName+"`,");  
451 - sqlColumnPart.append(" ?,");  
452 - paramList.add(beanFieldValue);  
453 - }  
454 - //打印日志内容  
455 - sqlForLog.substring(0, sqlForLog.length()-1);  
456 - sqlForLog.append(") VALUES (");  
457 - sqlForLog.append(sqlValueForLog+")");  
458 - //UtilsLog.infoForMessage(sqlForLog.toString(), this.getClass());  
459 -  
460 - //执行SQL  
461 - String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")";  
462 - KeyHolder keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(1));  
463 - jdbcTemplateWrite.update(new PreparedStatementCreator() {  
464 - @Override  
465 - public PreparedStatement createPreparedStatement(Connection con) throws SQLException {  
466 - PreparedStatement stat = con.prepareStatement(exeSql, new String[] {idTableFieldName});  
467 - PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(paramList.toArray());  
468 - setter.setValues(stat);  
469 - return stat;  
470 - }  
471 -  
472 - }, keyHolder);  
473 -  
474 - return keyHolder.getKey();  
475 - }  
476 -  
477 - /**  
478 - * 批量添加  
479 - * @throws Exception  
480 - */  
481 - public List<Number> addEntityList(List<T> entityList) throws Exception {  
482 - if(entityList == null || entityList.isEmpty()) {  
483 - throw new Exception("entitylist is empty or null");  
484 - }  
485 - //构造SQL语句及Entity Field列表  
486 - List<Field> beanFieldList = new ArrayList<Field>(this.beanToTableField.size());  
487 - StringBuffer exeSql = new StringBuffer(this.constructUpdateSql(entityList.get(0), beanFieldList));  
488 -  
489 - //构造参数信息  
490 - List<Object> args = new ArrayList<Object>();  
491 - exeSql.append(" VALUES");  
492 - for(int itemIndex=0; itemIndex<entityList.size(); ++itemIndex) {  
493 - T item = entityList.get(itemIndex);  
494 - exeSql.append("(");  
495 - for(int i=0; i<beanFieldList.size(); ++i) {  
496 - Field itemField = beanFieldList.get(i);  
497 - Object itemData = itemField.get(item);  
498 - if(itemData == null) {  
499 - args.add(this.getDefaultValueByFieldType(itemField));  
500 - }else {  
501 - args.add(itemData);  
502 - }  
503 - exeSql.append("?,");  
504 - }  
505 - exeSql.setCharAt(exeSql.length()-1, ' ');  
506 - exeSql.append("),");  
507 - }  
508 - exeSql.setCharAt(exeSql.length()-1, ';');  
509 -  
510 - //调用更新接口  
511 - KeyHolder keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(entityList.size()));  
512 - jdbcTemplateWrite.update(new PreparedStatementCreator() {  
513 - @Override  
514 - public PreparedStatement createPreparedStatement(Connection con) throws SQLException {  
515 - PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {idTableFieldName});  
516 - PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args.toArray());  
517 - setter.setValues(stat);  
518 - return stat;  
519 - }  
520 -  
521 - }, keyHolder);  
522 -  
523 - //处理结果数据  
524 - List<Map<String, Object>> data = keyHolder.getKeyList();  
525 - if(data.size() != entityList.size()) {  
526 - throw new Exception("param entity size not equal return generate key list size");  
527 - }  
528 - List<Number> dataT = new ArrayList<Number>(data.size());  
529 - for(Map<String, Object> item: data) {  
530 - Iterator<Object> keyIter = item.values().iterator();  
531 - if (keyIter.hasNext()) {  
532 - Object key = keyIter.next();  
533 - if (!(key instanceof Number)) {  
534 - throw new DataRetrievalFailureException(  
535 - "The generated key is not of a supported numeric type. " +  
536 - "Unable to cast [" + (key != null ? key.getClass().getName() : null) +  
537 - "] to [" + Number.class.getName() + "]");  
538 - }  
539 - dataT.add((Number)key);  
540 - }else {  
541 - throw new DataRetrievalFailureException("Unable to retrieve the generated key. " +  
542 - "Check that the table has an identity column enabled.");  
543 - }  
544 - }  
545 - return dataT;  
546 - }  
547 -  
548 - private String constructUpdateSql(T entity, List<Field> beanFieldList) {  
549 - StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"(");  
550 - Iterator<String> beanFieldIter = this.beanToTableField.keySet().iterator();  
551 - while(beanFieldIter.hasNext()){  
552 - String beanFieldName = beanFieldIter.next();  
553 - String tableFieldName = this.beanToTableField.get(beanFieldName);  
554 - Field beanField = null;  
555 - try {  
556 - beanField = this.tClassInfo.getDeclaredField(beanFieldName);  
557 - beanField.setAccessible(true);  
558 - if(beanField.get(entity) == null) {  
559 - continue;  
560 - }  
561 - } catch (Exception e) {  
562 - continue;  
563 - }  
564 -  
565 - if(tableFieldName == null || beanFieldName == null){  
566 - continue;  
567 - }  
568 -  
569 - beanFieldList.add(beanField);  
570 - sqlInsertPart.append("`"+tableFieldName+"`,");  
571 - }  
572 - return sqlInsertPart.substring(0, sqlInsertPart.length()-1)+")";  
573 - }  
574 -  
575 - private Object getDefaultValueByFieldType(Field itemField) {  
576 - String simpleName = itemField.getType().getSimpleName();  
577 - if("String".equals(simpleName)) {  
578 - return "";  
579 - }else if("Date".equals(simpleName) || "Timestamp".equals(simpleName)) {  
580 - return "2000-01-01 00:00:00";  
581 - }else if("BigDecimal".equals(simpleName)){  
582 - return BigDecimal.ZERO;  
583 - }else {  
584 - return 0;  
585 - }  
586 - }  
587 -  
588 - /**  
589 - * 按ID删除  
590 - */  
591 - public int deleteEntityByID(ID id) {  
592 - StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+" WHERE");  
593 - StringBuffer pql = new StringBuffer(sql.toString());  
594 - pql.append(" "+this.idTableFieldName+" = " + id);  
595 - sql.append(" "+this.idTableFieldName+" = ?");  
596 - return jdbcTemplateWrite.update(sql.toString(), id);  
597 - }  
598 - /**  
599 - * 删除按List<Object[]>条件  
600 - * Object[]数组长度是3  
601 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
602 - */  
603 - public int deleteEntityByCondition(List<Object[]> condition) throws Exception{  
604 - if (null == condition || condition.size() == 0) {  
605 - throw new Exception("params[condition] is empty");  
606 - }  
607 -  
608 - List<Object> list = new ArrayList<Object>();  
609 - StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+"");  
610 - StringBuffer pql = new StringBuffer(sql.toString());  
611 - this.appendWhereCondition(sql, pql, list, condition);  
612 - return jdbcTemplateWrite.update( sql.toString(), list.toArray());  
613 - }  
614 -  
615 - /**  
616 - * 删除按condition条件  
617 - * 建议使用deleteTByCondition(List<Object[]> condition), 如果removeTByCondition(List<Object[]> condition)满足不了where条件可以使用此方法。  
618 - * condition为where后面的条件,condition不能为空。  
619 - */  
620 - public int deleteEntityBySql(String sqlCondition) throws Exception{  
621 - if("".equals(sqlCondition)) {  
622 - throw new Exception("params[sqlCondition] is empty");  
623 - }  
624 - return jdbcTemplateWrite.update( "DELETE FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
625 - }  
626 -  
627 - /**  
628 - * 根据list对象逐个删除。  
629 - */  
630 - public List<Integer> deleteEntityList(List<T> entityList) {  
631 - List<Integer> result = new ArrayList<Integer>();  
632 - for (T entity : entityList) {  
633 - Field beanField;  
634 - Object beanFieldValue = Integer.valueOf(0);  
635 - try {  
636 - beanField = this.tClassInfo.getDeclaredField(this.idBeanFieldName);  
637 - beanField.setAccessible(true);  
638 - beanFieldValue = beanField.get(entity);  
639 - } catch (Exception e) {  
640 - e.printStackTrace();  
641 - }  
642 - result.add(deleteEntityByID((ID)beanFieldValue));  
643 - }  
644 - return result;  
645 - }  
646 -  
647 - /**  
648 - * 根据ID修改指定的值  
649 - */  
650 - public int updateEntityById(List<Object[]> changeList, ID id) throws Exception{  
651 - if(null == id){  
652 - throw new Exception("params[id] is null");  
653 - }  
654 - if (null == changeList || changeList.size() == 0) {  
655 - throw new Exception("params[changeList] is empty");  
656 - }  
657 -  
658 - StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET");  
659 - StringBuffer pql = new StringBuffer(sql.toString());  
660 - List<Object> list = new ArrayList<Object>();  
661 - this.appendSetSql(sql, pql, list, changeList);  
662 -  
663 - String where = " WHERE "+this.idTableFieldName+"=?";  
664 - String updateSql = sql.substring(0, sql.length()-1)+where;  
665 - list.add(id);  
666 - return jdbcTemplateWrite.update(updateSql, list.toArray());  
667 - }  
668 -  
669 - /**  
670 - * List<Object[]> updateObj 要修改成的值,数组长度为2,第一个值为列名,第二个值是要改成的值。  
671 - * List<Object[]> condition 修改的条件, 数组长度是3, 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
672 - */  
673 - public int updateEntityByCondition(List<Object[]> updateObj, List<Object[]> condition) throws Exception{  
674 - if (null == updateObj || updateObj.size() == 0) {  
675 - throw new Exception("params[updateObj] is empty");  
676 - }  
677 - if (null == condition || condition.size() == 0) {  
678 - throw new Exception("params[condition] is empty");  
679 - }  
680 -  
681 - StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET");  
682 - StringBuffer pql = new StringBuffer(sql.toString());  
683 - List<Object> list = new ArrayList<Object>();  
684 - this.appendSetSql(sql, pql, list, updateObj);  
685 -  
686 - StringBuffer where = new StringBuffer("");  
687 - StringBuffer pwhere = new StringBuffer("");  
688 - this.appendWhereCondition(where, pwhere, list, condition);  
689 -  
690 - String updateSql = sql.substring(0, sql.length()-1)+where.toString();  
691 - return jdbcTemplateWrite.update(updateSql, list.toArray());  
692 - }  
693 -  
694 - /**  
695 - * List<Object[]> updateObj 要修改成的值,数组长度为2,第一个值为列名,第二个值是要改成的值。  
696 - * String sqlCondition 修改的条件。  
697 - */  
698 - public int updateEntityBySql(List<Object[]> updateObj, String sqlCondition) throws Exception{  
699 - if (null == updateObj || updateObj.size() == 0) {  
700 - throw new Exception("params[updateObj] is empty");  
701 - }  
702 - if ("".equals(sqlCondition)) {  
703 - throw new Exception("params[sqlCondition] is empty");  
704 - }  
705 -  
706 - StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET");  
707 - StringBuffer pql = new StringBuffer(sql.toString());  
708 - List<Object> list = new ArrayList<Object>();  
709 - this.appendSetSql(sql, pql, list, updateObj);  
710 -  
711 - String updateSql = sql.toString().substring(0, sql.length()-1) + " WHERE "+sqlCondition;  
712 - return jdbcTemplateWrite.update(updateSql, list.toArray());  
713 - }  
714 -  
715 - public Map<String, Object> getPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize){  
716 - try {  
717 - String[] splitedSql = UtilsSql.splitCoreSql(coreSql);  
718 - return this.getPageData(splitedSql[0], splitedSql[1], orderByPartSql, page, pageSize);  
719 - }catch (Exception e) {  
720 - return UtilsSql.createPage(page, pageSize, 0, new ArrayList<Object>());  
721 - }  
722 - }  
723 -  
724 - public Map<String, Object> getPageData(String selectSql, String fromAndWhereSql, String orderByPartSql, Integer page, Integer pageSize){  
725 - //构造查询语句  
726 - String querySql = selectSql+" "+fromAndWhereSql+" "+orderByPartSql+" "+UtilsSql.getLimitCondition(page, pageSize);  
727 -  
728 - //构造统计计数语句  
729 - String countSql = "select count(*) rowsCount from ( select 1 "+fromAndWhereSql+" ) t ";  
730 -  
731 - //执行查询  
732 - List<Map<String, Object>> queryData = new ArrayList<Map<String, Object>>();  
733 - Map<String, Object> countData = new HashMap<String, Object>();  
734 - queryData = this.jdbcTemplateRead.queryForList(querySql);  
735 - countData = this.jdbcTemplateRead.queryForMap(countSql);  
736 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(countData.get("rowsCount").toString()), queryData);  
737 - }  
738 -  
739 - public <E> Map<String, Object> getBeanPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize, Class<E> beanClass){  
740 - try {  
741 - String[] splitedSql = UtilsSql.splitCoreSql(coreSql);  
742 - return this.getPageData(splitedSql[0], splitedSql[1], orderByPartSql, page, pageSize, beanClass);  
743 - }catch (Exception e) {  
744 - return UtilsSql.createPage(page, pageSize, 0, new ArrayList<Object>());  
745 - }  
746 - }  
747 -  
748 - public <E> Map<String, Object> getPageData(String selectSql, String fromAndWhereSql, String orderByPartSql, Integer page, Integer pageSize, Class<E> beanClass){  
749 - //构造查询语句  
750 - String querySql = selectSql+" "+fromAndWhereSql+" "+orderByPartSql+" "+UtilsSql.getLimitCondition(page, pageSize);  
751 -  
752 - //构造统计计数语句  
753 - String countSql = "select count(*) rowsCount from ( select 1 "+fromAndWhereSql+" ) t ";  
754 -  
755 - //执行查询  
756 - List<E> queryData = new ArrayList<E>();  
757 - Map<String, Object> countData = new HashMap<String, Object>();  
758 - queryData = this.jdbcTemplateRead.queryForList(querySql, beanClass);  
759 - countData = this.jdbcTemplateRead.queryForMap(countSql);  
760 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(countData.get("rowsCount").toString()), queryData);  
761 - }  
762 -  
763 - /**  
764 - * 按主键查询  
765 - */  
766 - public <E> E findBeanByID(ID id, Class<E> beanClass) {  
767 - return findBeanByID(id, true, false, beanClass);  
768 - }  
769 -  
770 - /**  
771 - * 按主键查询  
772 - * isLock 是否锁定, 默认不锁  
773 - * fromWriteDB 是否从写库读写,默认从读库查询  
774 - */  
775 - public <E> E findBeanByID(ID id, boolean fromWriteDB, boolean isLock, Class<E> beanClass) {  
776 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
777 - StringBuffer pql = new StringBuffer(sql.toString());  
778 - sql.append(" WHERE "+idTableFieldName+" = ?");  
779 - pql.append(" WHERE "+idTableFieldName+" = " + id);  
780 - if (isLock) {  
781 - sql.append(" FOR UPDATE");  
782 - pql.append(" FOR UPDATE");  
783 - }  
784 - return (E) (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForObject(sql.toString(), new CustomJdbcTemplateRowMapper(beanClass, this.tableToBeanField), id);  
785 - }  
786 -  
787 - /**  
788 - * 根据条件List<Object[]>查询  
789 - * Object[]数组长度是3  
790 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
791 - */  
792 - public <E> E findBeanByCondition(List<Object[]> condition, Class<E> beanClass) throws Exception {  
793 - List<E> tempList = findBeanListByCondition(condition, null, false, beanClass);  
794 - if(tempList == null || tempList.size() == 0){  
795 - return null;  
796 - }  
797 - if(tempList != null && tempList.size() == 1){  
798 - return tempList.get(0);  
799 - }else{  
800 - throw new Exception("found multi rows with condition,but this func expected one row");  
801 - }  
802 - }  
803 -  
804 - /**  
805 - * 根据条件sql查询  
806 - * sqlCondition 为where 后面的条件。  
807 - */  
808 - public <E> E findBeanBySql(String sqlCondition, Class<E> beanClass) throws Exception{  
809 - List<E> tempList = findBeanListBySql(sqlCondition, false, beanClass);  
810 - if(tempList == null || tempList.size() == 0){  
811 - return null;  
812 - }  
813 - if(tempList != null && tempList.size() == 1){  
814 - return tempList.get(0);  
815 - }else{  
816 - throw new Exception("found multi rows with condition,but this func expected one row");  
817 - }  
818 - }  
819 -  
820 - /**  
821 - * 根据条件List<Object[]>查询  
822 - * Object[]数组长度是3  
823 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
824 - */  
825 - public <E> List<E> findBeanListByCondition(List<Object[]> condition, Class<E> beanClass) {  
826 - return findBeanListByCondition(condition, null, false, beanClass);  
827 - }  
828 -  
829 - /**  
830 - * 根据条件List<Object[]>查询  
831 - * Object[]数组长度是3  
832 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
833 - */  
834 - public <E> List<E> findBeanListByCondition(List<Object[]> condition, String sortCondition, boolean fromWriteDB, Class<E> beanClass) {  
835 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
836 - StringBuffer pql = new StringBuffer(sql.toString());  
837 - List<Object> list = new ArrayList<Object>();  
838 - this.appendWhereCondition(sql, pql, list, condition);  
839 - if(sortCondition != null && !sortCondition.equals("")){  
840 - sql.append(" " + sortCondition + " ");  
841 - pql.append(" " + sortCondition + " ");  
842 - }  
843 - return (List<E>)(fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(sql.toString(), new CustomJdbcTemplateRowMapper(beanClass, this.tableToBeanField), list.toArray());  
844 - }  
845 -  
846 - /**  
847 - * 根据条件sql查询  
848 - * sqlCondition 为where 后面的条件。  
849 - */  
850 - public <E> List<E> findBeanListBySql(String sqlCondition, Class<E> beanClass) {  
851 - return findBeanListBySql(sqlCondition, false, beanClass);  
852 - }  
853 -  
854 - /**  
855 - * 根据条件sql查询  
856 - * sqlCondition 为where 后面的条件。  
857 - */  
858 - public <E> List<E> findBeanListBySql(String sqlCondition, boolean fromWriteDB, Class<E> beanClass) {  
859 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
860 - return (List<E>)(fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(sql.toString(), new CustomJdbcTemplateRowMapper(beanClass, this.tableToBeanField));  
861 - }  
862 -  
863 - /**  
864 - * 按条件分页查询  
865 - * Object[]数组长度是3  
866 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
867 - */  
868 - public <E> Map<String, Object> findBeanPageByCondition(List<Object[]> condition, int page, int pageSize, Class<E> beanClass) {  
869 - return findBeanPageByCondition(condition, null , page, pageSize, false, beanClass);  
870 - }  
871 -  
872 - /**  
873 - * 按条件分页查询  
874 - * Object[]数组长度是3  
875 - * Object[]第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
876 - * boolean isUseCache, 是否用缓存,默认用。  
877 - * boolean isAddCache, 是否添加缓存,默认添加。  
878 - */  
879 - public <E> Map<String, Object> findBeanPageByCondition(List<Object[]> condition,String sortCondition, int page, int pageSize, boolean fromWriteDB, Class<E> beanClass) {  
880 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
881 - StringBuffer pql = new StringBuffer(sql.toString());  
882 - StringBuffer sqlCount = new StringBuffer("SELECT COUNT(1) rowCount FROM "+this.getTableSql());  
883 -  
884 - List<Object> count_list = new ArrayList<Object>();  
885 - List<Object> page_list = new ArrayList<Object>();  
886 - this.appendWhereConditionForCount(sqlCount, condition);  
887 - this.appendWhereCondition(sql, pql, count_list, condition);  
888 - for (int i = 0; i < count_list.size(); i++)  
889 - page_list.add(count_list.get(i));  
890 -  
891 - page_list.add((page - 1) * pageSize);  
892 - page_list.add(pageSize);  
893 -  
894 - if(sortCondition != null && !sortCondition.equals("")){  
895 - sql.append(" " + sortCondition + " ");  
896 - pql.append(" " + sortCondition + " ");  
897 - }  
898 -  
899 - String pageSql = sql.toString() + " limit ?, ?";  
900 -  
901 - Map<String, Object> totalRowsMap = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForMap(sqlCount.toString(), count_list.toArray()) ;  
902 - List<E> resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(pageSql.toString(), new CustomJdbcTemplateRowMapper(beanClass, this.tableToBeanField), page_list.toArray());  
903 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(totalRowsMap.get("rowCount").toString()), resultList);  
904 - }  
905 -  
906 - /**  
907 - * 按sql分页查询, sqlCondition为where 后条件sql  
908 - */  
909 - public <E> Map<String, Object> findBeanPageBySql(String sqlCondition, int page, int pageSize, Class<E> beanClass) {  
910 - return findBeanPageBySql(sqlCondition, page, pageSize, false, beanClass);  
911 - }  
912 -  
913 - /**  
914 - * 按sql分页查询, sqlCondition为where 后条件sql  
915 - */  
916 - public <E> Map<String, Object> findBeanPageBySql(String sqlCondition, int page, int pageSize,boolean fromWriteDB, Class<E> beanClass) {  
917 - StringBuffer sql = new StringBuffer("SELECT "+this.tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition );  
918 - StringBuffer sqlCount = new StringBuffer("SELECT count(1) rowCount FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
919 - String pageSql = sql.toString() + " limit ?, ?";  
920 - String pagePql = sql.toString() + " limit " + ((page -1) * pageSize) + ", " + (page * pageSize);  
921 - List<Object> page_list = new ArrayList<Object>();  
922 - page_list.add((page - 1) * pageSize);  
923 - page_list.add(page * pageSize);  
924 -  
925 - Map<String, Object> totalRowsMap = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).queryForMap(sqlCount.toString());  
926 - List<E> resultList = (fromWriteDB ? jdbcTemplateWrite : jdbcTemplateRead).query(pageSql.toString(), new CustomJdbcTemplateRowMapper(beanClass, this.tableToBeanField), page_list.toArray());  
927 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(totalRowsMap.get("rowCount").toString()), resultList);  
928 - }  
929 -}  
src/main/java/com/taover/repository/CustomJdbcTemplateBroadcast.java
@@ -1,602 +0,0 @@ @@ -1,602 +0,0 @@
1 -package com.taover.repository;  
2 -  
3 -import java.io.Serializable;  
4 -import java.lang.reflect.Field;  
5 -import java.lang.reflect.ParameterizedType;  
6 -import java.math.BigDecimal;  
7 -import java.sql.Connection;  
8 -import java.sql.PreparedStatement;  
9 -import java.sql.SQLException;  
10 -import java.util.ArrayList;  
11 -import java.util.Collections;  
12 -import java.util.HashMap;  
13 -import java.util.Iterator;  
14 -import java.util.List;  
15 -import java.util.Map;  
16 -  
17 -import javax.annotation.Resource;  
18 -import javax.persistence.Column;  
19 -import javax.persistence.Id;  
20 -import javax.persistence.Table;  
21 -  
22 -import org.springframework.dao.DataAccessException;  
23 -import org.springframework.dao.DataRetrievalFailureException;  
24 -import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;  
25 -import org.springframework.jdbc.core.PreparedStatementCreator;  
26 -import org.springframework.jdbc.core.PreparedStatementSetter;  
27 -import org.springframework.jdbc.support.GeneratedKeyHolder;  
28 -import org.springframework.jdbc.support.KeyHolder;  
29 -  
30 -import com.taover.repository.exception.MultiRowException;  
31 -import com.taover.repository.exception.NoContainTenantException;  
32 -import com.taover.repository.exception.NotFoundException;  
33 -import com.taover.repository.exception.ObjectReflectException;  
34 -import com.taover.repository.jdbctemplate.JdbcTemplateBroadcast;  
35 -import com.taover.repository.mapper.CustomJdbcTemplateRowMapper;  
36 -import com.taover.repository.util.UtilsSql;  
37 -  
38 -/**  
39 - *  
40 - * @author root  
41 - *  
42 - * @param <T>  
43 - * @param <ID>  
44 - */  
45 -public class CustomJdbcTemplateBroadcast<T, ID extends Serializable> implements CustomJdbcTemplateBroadcastInterface<T, ID>{  
46 - @Resource  
47 - private JdbcTemplateBroadcast _jdbcTemplateBroadcast;  
48 -  
49 - private Map<String, String> _beanToTableField;  
50 - private Map<String, String> _tableToBeanField;  
51 - private String _tableFieldNameListGapWithComma;  
52 - private String _idTableFieldName;  
53 - private String _dbName;  
54 - private String _tableName;  
55 - private Class<T> _tClassInfo;  
56 - private CustomJdbcTemplateRowMapper<T> _customJdbcTemplateRowMapper;  
57 -  
58 - public CustomJdbcTemplateRowMapper<T> getCustomJdbcTemplateRowMapper(){  
59 - return this._customJdbcTemplateRowMapper;  
60 - }  
61 -  
62 - @SuppressWarnings("unchecked")  
63 - public CustomJdbcTemplateBroadcast() throws Exception{  
64 - //获取泛型类Class  
65 - this._tClassInfo = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];  
66 -  
67 - //检查实体声明  
68 - Table annoTable = (Table) _tClassInfo.getAnnotation(Table.class);  
69 - if(annoTable == null){  
70 - throw new Exception("DAO层初始化失败,失败原因:"+_tClassInfo.getName()+"实体类,没有@Table注解指定表名");  
71 - }  
72 - this._tableName = annoTable.name();  
73 - String schema = annoTable.schema();  
74 - String catalog = annoTable.catalog();  
75 - if(schema != null && !"".equals(schema)){  
76 - this._dbName = schema;  
77 - }else if(catalog != null && !"".equals(catalog)){  
78 - this._dbName = catalog;  
79 - }  
80 -  
81 - //初始化数据  
82 - _beanToTableField = new HashMap<String, String>();  
83 - _tableToBeanField = new HashMap<String, String>();  
84 - _tableFieldNameListGapWithComma = "";  
85 - Field[] declaredFields = _tClassInfo.getDeclaredFields();  
86 - for(int i=0; i<declaredFields.length; ++i){  
87 - Field currField = declaredFields[i];  
88 - String fieldName = currField.getName();  
89 - Id annoId = (Id)currField.getAnnotation(Id.class);  
90 - Column annoColumn = (Column)currField.getAnnotation(Column.class);  
91 - if(annoId != null){  
92 - if(annoColumn == null){  
93 - _idTableFieldName = this.camelToUnderline(fieldName);  
94 - }else{  
95 - _idTableFieldName = annoColumn.name();  
96 - }  
97 - _tableFieldNameListGapWithComma += _idTableFieldName+",";  
98 - _beanToTableField.put(fieldName, _idTableFieldName);  
99 - _tableToBeanField.put(_idTableFieldName, fieldName);  
100 - }else{  
101 - if(annoColumn != null){  
102 - String tableFieldName = annoColumn.name();  
103 - _tableFieldNameListGapWithComma += tableFieldName+",";  
104 - _beanToTableField.put(fieldName, tableFieldName);  
105 - _tableToBeanField.put(tableFieldName, fieldName);  
106 - }  
107 - }  
108 - }  
109 -  
110 - //检验是否有属性  
111 - if(_beanToTableField.isEmpty()){  
112 - throw new Exception("DAO层初始化失败,失败原因:"+this._tClassInfo.getName()+"实体类,没有在实体中找到属性信息");  
113 - }  
114 -  
115 - //去除逗号  
116 - _tableFieldNameListGapWithComma = _tableFieldNameListGapWithComma.substring(0, _tableFieldNameListGapWithComma.length()-1);  
117 -  
118 - //创建rowmapper  
119 - this._customJdbcTemplateRowMapper = new CustomJdbcTemplateRowMapper<T>(this._tClassInfo, this._tableToBeanField);  
120 - }  
121 -  
122 - /**  
123 - * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。</br>  
124 - * 例如:HelloWorld->HELLO_WORLD  
125 - * @param name 转换前的驼峰式命名的字符串  
126 - * @return 转换后下划线大写方式命名的字符串  
127 - */  
128 - private String camelToUnderline(String name) {  
129 - StringBuilder result = new StringBuilder();  
130 - if (name != null && name.length() > 0) {  
131 - // 将第一个字符处理成大写  
132 - result.append(name.substring(0, 1).toUpperCase());  
133 - // 循环处理其余字符  
134 - for (int i = 1; i < name.length(); i++) {  
135 - String s = name.substring(i, i + 1);  
136 - // 在大写字母前添加下划线  
137 - if (Character.isUpperCase(s.charAt(0)) && Character.isLetter(s.charAt(0))) {  
138 - result.append("_");  
139 - }  
140 - // 其他字符直接转成大写  
141 - result.append(s.toUpperCase());  
142 - }  
143 - }  
144 - return result.toString();  
145 - }  
146 -  
147 - private void appendWhereCondition(StringBuffer sql, StringBuffer pql, List<Object> list, List<Object[]> condition) {  
148 - if (condition == null || condition.size() == 0) return;  
149 - Object[] con = condition.get(0);  
150 - int iLen = condition.size();  
151 - sql.append(" WHERE ");  
152 - pql.append(" WHERE ");  
153 - sql.append(con[0]);  
154 - pql.append(con[0]);  
155 - if (null != con[1] && con[1] != "" && con[1] != "useArg[0]") {  
156 - sql.append(" " + con[1] + " ?");  
157 - pql.append(" " + con[1] + " " + con[2]);  
158 - list.add(con[2]);  
159 - }  
160 - for (int i = 1; i < iLen; i++) {  
161 - con = condition.get(i);  
162 - sql.append(" AND ");  
163 - pql.append(" AND ");  
164 - sql.append(con[0]);  
165 - pql.append(con[0]);  
166 - if (null == con[1] || "" == con[1] || con[1] == "useArg[0]") continue;  
167 - sql.append(" " + con[1] + " ?");  
168 - pql.append(" " + con[1] + " " + con[2]);  
169 - list.add(con[2]);  
170 - }  
171 - }  
172 -  
173 - private void appendWhereConditionForCount(StringBuffer sql, List<Object[]> condition) {  
174 - if (condition == null || condition.size() == 0) return;  
175 - Object[] con = condition.get(0);  
176 - int iLen = condition.size();  
177 - sql.append(" WHERE ");  
178 - sql.append(con[0]);  
179 - if (null != con[1] && con[1] != "" && con[1] != "useArg[0]") {  
180 - sql.append(" " + con[1] + " ?");  
181 - }  
182 - for (int i = 1; i < iLen; i++) {  
183 - con = condition.get(i);  
184 - sql.append(" AND ");  
185 - sql.append(con[0]);  
186 - if (null == con[1] || "" == con[1] || con[1] == "useArg[0]") continue;  
187 - sql.append(" " + con[1] + " ?");  
188 - }  
189 - }  
190 -  
191 - private void appendSetSql(StringBuffer sql, StringBuffer pql, List<Object> list, List<Object[]> obj) {  
192 - for (Object[] arg : obj) {  
193 - if (arg.length > 2) {  
194 - sql.append(" " + arg[0] + " = " + arg[0] + arg[2] + " ?,");  
195 - pql.append(" " + arg[0] + " = " + arg[0] + arg[2] + arg[1] +",");  
196 - list.add(arg[1]);  
197 - }else if(arg.length == 2) {  
198 - sql.append(" " + arg[0] + " = ?,");  
199 - pql.append(" " + arg[0] + " = " + arg[1] + ",");  
200 - list.add(arg[1]);  
201 - }else if(arg.length == 1) {  
202 - sql.append(" " + arg[0] + ",");  
203 - pql.append(" " + arg[0] + ",");  
204 - }  
205 - }  
206 - }  
207 -  
208 - private String getTableSql(){  
209 - return (this._dbName == null || "".equals(this._dbName.trim()))?  
210 - ("`"+this._tableName+"`"):  
211 - ("`"+this._dbName+"`.`"+this._tableName+"`");  
212 - }  
213 -  
214 - private String constructUpdateSql(T entity, List<Field> beanFieldList) {  
215 - StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"(");  
216 - Iterator<String> beanFieldIter = this._beanToTableField.keySet().iterator();  
217 - while(beanFieldIter.hasNext()){  
218 - String beanFieldName = beanFieldIter.next();  
219 - String tableFieldName = this._beanToTableField.get(beanFieldName);  
220 - Field beanField = null;  
221 - try {  
222 - beanField = this._tClassInfo.getDeclaredField(beanFieldName);  
223 - beanField.setAccessible(true);  
224 - if(beanField.get(entity) == null) {  
225 - continue;  
226 - }  
227 - } catch (Exception e) {  
228 - continue;  
229 - }  
230 -  
231 - if(tableFieldName == null || beanFieldName == null){  
232 - continue;  
233 - }  
234 -  
235 - beanFieldList.add(beanField);  
236 - sqlInsertPart.append("`"+tableFieldName+"`,");  
237 - }  
238 - return sqlInsertPart.substring(0, sqlInsertPart.length()-1)+")";  
239 - }  
240 -  
241 - private Object getDefaultValueByFieldType(Field itemField) {  
242 - String simpleName = itemField.getType().getSimpleName();  
243 - if("String".equals(simpleName)) {  
244 - return "";  
245 - }else if("Date".equals(simpleName) || "Timestamp".equals(simpleName)) {  
246 - return "2000-01-01 00:00:00";  
247 - }else if("BigDecimal".equals(simpleName)){  
248 - return BigDecimal.ZERO;  
249 - }else {  
250 - return 0;  
251 - }  
252 - }  
253 -  
254 - @Override  
255 - public T findEntityByID(ID id) throws NotFoundException {  
256 - return findEntityByID(id, false);  
257 - }  
258 -  
259 - @Override  
260 - public T findEntityByID(ID id, boolean isLock) throws NotFoundException {  
261 - StringBuffer sql = new StringBuffer("SELECT "+this._tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
262 - sql.append(" WHERE "+_idTableFieldName+" = ? ");  
263 - if (isLock) {  
264 - sql.append(" FOR UPDATE");  
265 - }  
266 - try {  
267 - return (T) _jdbcTemplateBroadcast.queryForObject(sql.toString(), this._customJdbcTemplateRowMapper, new String[] {this._tableName}, id);  
268 - }catch (DataAccessException e) {  
269 - throw new NotFoundException(e);  
270 - }  
271 - }  
272 -  
273 - @Override  
274 - public T findEntityByCondition(List<Object[]> condition) throws NotFoundException, MultiRowException, NoContainTenantException {  
275 - List<T> tempList = findListByCondition(condition);  
276 - if(tempList == null || tempList.size() == 0){  
277 - throw new NotFoundException();  
278 - }  
279 - if(tempList != null && tempList.size() == 1){  
280 - return tempList.get(0);  
281 - }else{  
282 - throw new MultiRowException();  
283 - }  
284 - }  
285 -  
286 - @Override  
287 - public T findEntityBySql(String sqlCondition) throws NotFoundException, MultiRowException {  
288 - List<T> tempList = findListBySql(sqlCondition);  
289 - if(tempList == null || tempList.size() == 0){  
290 - throw new NotFoundException();  
291 - }  
292 - if(tempList != null && tempList.size() == 1){  
293 - return tempList.get(0);  
294 - }else{  
295 - throw new MultiRowException();  
296 - }  
297 - }  
298 -  
299 - @Override  
300 - public List<T> findListByCondition(List<Object[]> condition){  
301 - return findListByCondition(condition, null);  
302 - }  
303 -  
304 - @Override  
305 - public List<T> findListByCondition(List<Object[]> condition, String sortCondition){  
306 - StringBuffer sql = new StringBuffer("SELECT "+this._tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
307 - List<Object> list = new ArrayList<Object>();  
308 - this.appendWhereCondition(sql, new StringBuffer(), list, condition);  
309 - if(sortCondition != null && !sortCondition.equals("")){  
310 - sql.append(" " + sortCondition + " ");  
311 - }  
312 - return (List<T>)_jdbcTemplateBroadcast.query(sql.toString(), this._customJdbcTemplateRowMapper, new String[] {this._tableName}, list.toArray());  
313 - }  
314 -  
315 - @Override  
316 - public List<T> findListBySql(String sqlCondition){  
317 - StringBuffer sql = new StringBuffer("SELECT "+this._tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
318 - return (List<T>)_jdbcTemplateBroadcast.query(sql.toString(), this._customJdbcTemplateRowMapper, new String[] {this._tableName});  
319 - }  
320 -  
321 - @Override  
322 - public Map<String, Object> findPageByCondition(List<Object[]> condition, int page, int pageSize){  
323 - return findPageByCondition(condition, null , page, pageSize);  
324 - }  
325 -  
326 - @Override  
327 - public Map<String, Object> findPageByCondition(List<Object[]> condition, String sortCondition, int page, int pageSize){  
328 - StringBuffer sql = new StringBuffer("SELECT "+this._tableFieldNameListGapWithComma+" FROM "+this.getTableSql());  
329 - StringBuffer pql = new StringBuffer(sql.toString());  
330 - StringBuffer sqlCount = new StringBuffer("SELECT COUNT(1) rowCount FROM "+this.getTableSql());  
331 - List<Object> count_list = new ArrayList<Object>();  
332 - List<Object> page_list = new ArrayList<Object>();  
333 - this.appendWhereConditionForCount(sqlCount, condition);  
334 - this.appendWhereCondition(sql, pql, count_list, condition);  
335 - for (int i = 0; i < count_list.size(); i++)  
336 - page_list.add(count_list.get(i));  
337 -  
338 - page_list.add((page - 1) * pageSize);  
339 - page_list.add(pageSize);  
340 -  
341 - if(sortCondition != null && !sortCondition.equals("")){  
342 - sql.append(" " + sortCondition + " ");  
343 - pql.append(" " + sortCondition + " ");  
344 - }  
345 -  
346 - String pageSql = sql.toString() + " limit ?, ?";  
347 - Map<String, Object> totalRowsMap = _jdbcTemplateBroadcast.queryForMap(sqlCount.toString(), new String[] {this._tableName}, count_list.toArray()) ;  
348 - List<T> resultList = _jdbcTemplateBroadcast.query(pageSql.toString(), this._customJdbcTemplateRowMapper, new String[] {this._tableName}, page_list.toArray());  
349 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(totalRowsMap.get("rowCount").toString()), resultList);  
350 - }  
351 -  
352 - @Override  
353 - public Map<String, Object> findPageBySql(String sqlCondition, int page, int pageSize){  
354 - StringBuffer sql = new StringBuffer("SELECT "+this._tableFieldNameListGapWithComma+" FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
355 - StringBuffer sqlCount = new StringBuffer("SELECT count(1) rowCount FROM "+this.getTableSql()+" WHERE " + sqlCondition);  
356 - sql.append(" limit ?, ?");  
357 - List<Object> page_list = new ArrayList<Object>();  
358 - page_list.add((page - 1) * pageSize);  
359 - page_list.add(page * pageSize);  
360 -  
361 - Map<String, Object> totalRowsMap = _jdbcTemplateBroadcast.queryForMap(sqlCount.toString(), new String[] {this._tableName});  
362 - List<T> resultList = _jdbcTemplateBroadcast.query(sql.toString(), this._customJdbcTemplateRowMapper, new String[] {this._tableName}, page_list.toArray());  
363 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(totalRowsMap.get("rowCount").toString()), resultList);  
364 - }  
365 -  
366 - @Override  
367 - public Number addEntity(T entity) {  
368 - StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"(");  
369 - StringBuffer sqlColumnPart = new StringBuffer(") VALUES (");  
370 - List<Object> paramList = new ArrayList<Object>();  
371 -  
372 - Iterator<String> beanFieldIter = this._beanToTableField.keySet().iterator();  
373 - while(beanFieldIter.hasNext()){  
374 - String beanFieldName = beanFieldIter.next();  
375 - String tableFieldName = this._beanToTableField.get(beanFieldName);  
376 - Field beanField;  
377 - Object beanFieldValue = null;  
378 - try {  
379 - beanField = this._tClassInfo.getDeclaredField(beanFieldName);  
380 - beanField.setAccessible(true);  
381 - beanFieldValue = beanField.get(entity);  
382 - } catch (Exception e) {  
383 - e.printStackTrace();  
384 - }  
385 -  
386 - if(tableFieldName == null || beanFieldName == null || beanFieldValue == null){  
387 - continue;  
388 - }  
389 - sqlInsertPart.append("`"+tableFieldName+"`,");  
390 - sqlColumnPart.append(" ?,");  
391 - paramList.add(beanFieldValue);  
392 - }  
393 -  
394 - //执行SQL  
395 - String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")";  
396 - KeyHolder _keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(1));  
397 - _jdbcTemplateBroadcast.update(new PreparedStatementCreator() {  
398 - @Override  
399 - public PreparedStatement createPreparedStatement(Connection con) throws SQLException {  
400 - PreparedStatement stat = con.prepareStatement(exeSql, new String[] {_idTableFieldName});  
401 - PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(paramList.toArray());  
402 - setter.setValues(stat);  
403 - return stat;  
404 - }  
405 -  
406 - }, _keyHolder, new String[] {this._tableName});  
407 -  
408 - return _keyHolder.getKey();  
409 - }  
410 -  
411 - @Override  
412 - public List<Number> addEntityList(List<T> entityList) throws Exception {  
413 - if(entityList == null || entityList.isEmpty()) {  
414 - return Collections.EMPTY_LIST;  
415 - }  
416 - //构造SQL语句及Entity Field列表  
417 - List<Field> beanFieldList = new ArrayList<Field>(this._beanToTableField.size());  
418 - StringBuffer exeSql = new StringBuffer(this.constructUpdateSql(entityList.get(0), beanFieldList));  
419 -  
420 - //构造参数信息  
421 - List<Object> args = new ArrayList<Object>();  
422 - exeSql.append(" VALUES");  
423 - for(int itemIndex=0; itemIndex<entityList.size(); ++itemIndex) {  
424 - T item = entityList.get(itemIndex);  
425 - exeSql.append("(");  
426 - for(int i=0; i<beanFieldList.size(); ++i) {  
427 - Field itemField = beanFieldList.get(i);  
428 - Object itemData = null;  
429 - try {  
430 - itemData = itemField.get(item);  
431 - } catch (Exception e) {  
432 - throw new ObjectReflectException();  
433 - }  
434 - if(itemData == null) {  
435 - args.add(this.getDefaultValueByFieldType(itemField));  
436 - }else {  
437 - args.add(itemData);  
438 - }  
439 - exeSql.append("?,");  
440 - }  
441 - exeSql.setCharAt(exeSql.length()-1, ' ');  
442 - exeSql.append("),");  
443 - }  
444 - exeSql.setCharAt(exeSql.length()-1, ';');  
445 -  
446 - //调用更新接口  
447 - KeyHolder _keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(entityList.size()));  
448 - _jdbcTemplateBroadcast.update(new PreparedStatementCreator() {  
449 - @Override  
450 - public PreparedStatement createPreparedStatement(Connection con) throws SQLException {  
451 - PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {_idTableFieldName});  
452 - PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args.toArray());  
453 - setter.setValues(stat);  
454 - return stat;  
455 - }  
456 -  
457 - }, _keyHolder, new String[] {this._tableName});  
458 -  
459 - //处理结果数据  
460 - List<Map<String, Object>> data = _keyHolder.getKeyList();  
461 - if(data.size() != entityList.size()) {  
462 - throw new Exception("param entity size not equal return generate key list size");  
463 - }  
464 - List<Number> dataT = new ArrayList<Number>(data.size());  
465 - for(Map<String, Object> item: data) {  
466 - Iterator<Object> keyIter = item.values().iterator();  
467 - if (keyIter.hasNext()) {  
468 - Object key = keyIter.next();  
469 - if (!(key instanceof Number)) {  
470 - throw new DataRetrievalFailureException(  
471 - "The generated key is not of a supported numeric type. " +  
472 - "Unable to cast [" + (key != null ? key.getClass().getName() : null) +  
473 - "] to [" + Number.class.getName() + "]");  
474 - }  
475 - dataT.add((Number)key);  
476 - }else {  
477 - throw new DataRetrievalFailureException("Unable to retrieve the generated key. " +  
478 - "Check that the table has an identity column enabled.");  
479 - }  
480 - }  
481 - return dataT;  
482 - }  
483 -  
484 - @Override  
485 - public int deleteEntityByID(ID id) {  
486 - StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+" WHERE");  
487 - sql.append(" "+this._idTableFieldName+" = ? ");  
488 - return _jdbcTemplateBroadcast.update(sql.toString(), new String[] {this._tableName}, id);  
489 - }  
490 -  
491 - @Override  
492 - public int deleteEntityByCondition(List<Object[]> condition){  
493 - if (null == condition || condition.size() == 0) {  
494 - throw new RuntimeException("params[condition] is empty");  
495 - }  
496 -  
497 - List<Object> list = new ArrayList<Object>();  
498 - StringBuffer sql = new StringBuffer("DELETE FROM "+this.getTableSql()+"");  
499 - StringBuffer pql = new StringBuffer(sql.toString());  
500 - this.appendWhereCondition(sql, pql, list, condition);  
501 - return _jdbcTemplateBroadcast.update( sql.toString(), new String[] {this._tableName}, list.toArray());  
502 - }  
503 -  
504 - @Override  
505 - public int deleteEntityBySql(String sqlCondition){  
506 - if("".equals(sqlCondition.trim())) {  
507 - throw new RuntimeException("params[sqlCondition] is empty");  
508 - }  
509 - return _jdbcTemplateBroadcast.update( "DELETE FROM "+this.getTableSql()+" WHERE " + sqlCondition, new String[] {this._tableName});  
510 - }  
511 -  
512 - @Override  
513 - public int deleteEntityList(List<ID> idList){  
514 - StringBuffer idSb = new StringBuffer();  
515 - for(ID id: idList) {  
516 - idSb.append(id);  
517 - }  
518 - return this.deleteEntityBySql(this._idTableFieldName + " in ("+idSb.toString().substring(0, idSb.length()-1)+") ");  
519 - }  
520 -  
521 - @Override  
522 - public int updateEntityById(List<Object[]> changeList, ID id) {  
523 - if(null == id){  
524 - throw new RuntimeException("params[id] is null");  
525 - }  
526 - if (null == changeList || changeList.size() == 0) {  
527 - throw new RuntimeException("params[changeList] is empty");  
528 - }  
529 -  
530 - StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET");  
531 - StringBuffer pql = new StringBuffer(sql.toString());  
532 - List<Object> list = new ArrayList<Object>();  
533 - this.appendSetSql(sql, pql, list, changeList);  
534 -  
535 - String where = " WHERE "+this._idTableFieldName+"=? ";  
536 - String updateSql = sql.substring(0, sql.length()-1)+where;  
537 - list.add(id);  
538 - return _jdbcTemplateBroadcast.update(updateSql, new String[] {this._tableName}, list.toArray());  
539 - }  
540 -  
541 - @Override  
542 - public int updateEntityByCondition(List<Object[]> updateObj, List<Object[]> condition){  
543 - if (null == updateObj || updateObj.size() == 0) {  
544 - throw new RuntimeException("params[updateObj] is empty");  
545 - }  
546 - if (null == condition || condition.size() == 0) {  
547 - throw new RuntimeException("params[condition] is empty");  
548 - }  
549 -  
550 - StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET");  
551 - StringBuffer pql = new StringBuffer(sql.toString());  
552 - List<Object> list = new ArrayList<Object>();  
553 - this.appendSetSql(sql, pql, list, updateObj);  
554 -  
555 - StringBuffer where = new StringBuffer("");  
556 - StringBuffer pwhere = new StringBuffer("");  
557 - this.appendWhereCondition(where, pwhere, list, condition);  
558 -  
559 - String updateSql = sql.substring(0, sql.length()-1)+where.toString();  
560 - return _jdbcTemplateBroadcast.update(updateSql, new String[] {this._tableName}, list.toArray());  
561 - }  
562 -  
563 - @Override  
564 - public int updateEntityBySql(List<Object[]> updateObj, String sqlCondition){  
565 - if (null == updateObj || updateObj.size() == 0) {  
566 - throw new RuntimeException("params[updateObj] is empty");  
567 - }  
568 - if ("".equals(sqlCondition)) {  
569 - throw new RuntimeException("params[sqlCondition] is empty");  
570 - }  
571 -  
572 - StringBuffer sql = new StringBuffer("UPDATE "+this.getTableSql()+" SET");  
573 - StringBuffer pql = new StringBuffer(sql.toString());  
574 - List<Object> list = new ArrayList<Object>();  
575 - this.appendSetSql(sql, pql, list, updateObj);  
576 -  
577 - String updateSql = sql.toString().substring(0, sql.length()-1) + " WHERE "+sqlCondition;  
578 - return _jdbcTemplateBroadcast.update(updateSql, new String[] {this._tableName}, list.toArray());  
579 - }  
580 -  
581 - @Override  
582 - public Map<String, Object> getPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize){  
583 - String[] splitedSql = UtilsSql.splitCoreSql(coreSql);  
584 - return this.getPageData(splitedSql[0], splitedSql[1], orderByPartSql, page, pageSize);  
585 - }  
586 -  
587 - @Override  
588 - public Map<String, Object> getPageData(String selectSql, String fromAndWhereSql, String orderByPartSql, Integer page, Integer pageSize){  
589 - //构造查询语句  
590 - String querySql = selectSql+" "+fromAndWhereSql+" "+orderByPartSql+" "+UtilsSql.getLimitCondition(page, pageSize);  
591 -  
592 - //构造统计计数语句  
593 - String countSql = "select count(*) rowsCount from ( select 1 "+fromAndWhereSql+" ) t ";  
594 -  
595 - //执行查询  
596 - List<Map<String, Object>> queryData = new ArrayList<Map<String, Object>>();  
597 - Map<String, Object> countData = new HashMap<String, Object>();  
598 - queryData = this._jdbcTemplateBroadcast.queryForList(querySql, new String[] {this._tableName});  
599 - countData = this._jdbcTemplateBroadcast.queryForMap(countSql, new String[] {this._tableName});  
600 - return UtilsSql.createPage(page, pageSize, Integer.valueOf(countData.get("rowsCount").toString()), queryData);  
601 - }  
602 -}  
src/main/java/com/taover/repository/CustomJdbcTemplateBroadcastInterface.java
@@ -1,153 +0,0 @@ @@ -1,153 +0,0 @@
1 -package com.taover.repository;  
2 -  
3 -import java.io.Serializable;  
4 -import java.util.List;  
5 -import java.util.Map;  
6 -  
7 -import com.taover.repository.exception.MultiRowException;  
8 -import com.taover.repository.exception.NoContainTenantException;  
9 -import com.taover.repository.exception.NotFoundException;  
10 -  
11 -public interface CustomJdbcTemplateBroadcastInterface<T, ID extends Serializable> {  
12 -  
13 - /**  
14 - * 按主键查询  
15 - */  
16 - public T findEntityByID(ID id) throws NotFoundException;  
17 -  
18 - /**  
19 - * 按主键查询  
20 - * isLock 是否锁定, 默认不锁  
21 - * fromWriteDB 是否从写库读写,默认从读库查询  
22 - */  
23 - public T findEntityByID(ID id, boolean isLock) throws NotFoundException;  
24 -  
25 - /**  
26 - * 根据条件List<Object[]>查询  
27 - * Object[]数组长度是3  
28 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
29 - */  
30 - public T findEntityByCondition(List<Object[]> condition) throws NotFoundException,MultiRowException,NoContainTenantException;  
31 -  
32 - /**  
33 - * 根据条件sql查询  
34 - * sqlCondition 为where 后面的条件。  
35 - */  
36 - public T findEntityBySql(String sqlCondition) throws NotFoundException,MultiRowException,NoContainTenantException;  
37 -  
38 - /**  
39 - * 根据条件List<Object[]>查询  
40 - * Object[]数组长度是3  
41 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
42 - */  
43 - public List<T> findListByCondition(List<Object[]> condition);  
44 -  
45 - /**  
46 - * 根据条件List<Object[]>查询  
47 - * Object[]数组长度是3  
48 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
49 - */  
50 - public List<T> findListByCondition(List<Object[]> condition, String sortCondition);  
51 -  
52 - /**  
53 - * 根据条件sql查询  
54 - * sqlCondition 为where 后面的条件。  
55 - */  
56 - public List<T> findListBySql(String sqlCondition);  
57 -  
58 - /**  
59 - * 按条件分页查询  
60 - * Object[]数组长度是3  
61 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
62 - */  
63 - public Map<String, Object> findPageByCondition(List<Object[]> condition, int page, int pageSize);  
64 -  
65 - /**  
66 - * 按条件分页查询  
67 - * Object[]数组长度是3  
68 - * Object[]第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
69 - * boolean isUseCache, 是否用缓存,默认用。  
70 - * boolean isAddCache, 是否添加缓存,默认添加。  
71 - */  
72 - public Map<String, Object> findPageByCondition(List<Object[]> condition, String sortCondition, int page, int pageSize);  
73 -  
74 - /**  
75 - * 按sql分页查询, sqlCondition为where 后条件sql  
76 - */  
77 - public Map<String, Object> findPageBySql(String sqlCondition, int page, int pageSize);  
78 -  
79 - /**  
80 - * 添加  
81 - */  
82 - public Number addEntity(T entity);  
83 -  
84 - /**  
85 - * 批量添加  
86 - * @throws Exception  
87 - */  
88 - public List<Number> addEntityList(List<T> entityList) throws Exception;  
89 -  
90 - /**  
91 - * 按ID删除  
92 - */  
93 - public int deleteEntityByID(ID id);  
94 -  
95 - /**  
96 - * 删除按List<Object[]>条件  
97 - * Object[]数组长度是3  
98 - * Object[], 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
99 - */  
100 - public int deleteEntityByCondition(List<Object[]> condition);  
101 -  
102 - /**  
103 - * 删除按condition条件  
104 - * 建议使用deleteTByCondition(List<Object[]> condition), 如果removeTByCondition(List<Object[]> condition)满足不了where条件可以使用此方法。  
105 - * condition为where后面的条件,condition不能为空。  
106 - */  
107 - public int deleteEntityBySql(String sqlCondition);  
108 -  
109 - /**  
110 - * 根据list对象逐个删除。  
111 - * @throws NoContainTenantException  
112 - */  
113 - public int deleteEntityList(List<ID> idList);  
114 -  
115 - /**  
116 - * 根据ID修改指定的值  
117 - */  
118 - public int updateEntityById(List<Object[]> changeList, ID id);  
119 -  
120 - /**  
121 - * List<Object[]> updateObj 要修改成的值,数组长度为2,第一个值为列名,第二个值是要改成的值。  
122 - * List<Object[]> condition 修改的条件, 数组长度是3, 第一个参数是列名,第二个参数是操作符,第三个参数是查询条件的值。  
123 - */  
124 - public int updateEntityByCondition(List<Object[]> updateObj, List<Object[]> condition);  
125 -  
126 - /**  
127 - * List<Object[]> updateObj 要修改成的值,数组长度为2,第一个值为列名,第二个值是要改成的值。  
128 - * String sqlCondition 修改的条件。  
129 - */  
130 - public int updateEntityBySql(List<Object[]> updateObj, String sqlCondition);  
131 -  
132 - /**  
133 - * 获取分页数据  
134 - * @param coreSql  
135 - * @param orderByPartSql  
136 - * @param page  
137 - * @param pageSize  
138 - * @return  
139 - */  
140 - public Map<String, Object> getPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize);  
141 -  
142 - /**  
143 - * 获取分页数据  
144 - * @param selectSql  
145 - * @param fromAndWhereSql  
146 - * @param orderByPartSql  
147 - * @param page  
148 - * @param pageSize  
149 - * @return  
150 - */  
151 - public Map<String, Object> getPageData(String selectSql, String fromAndWhereSql, String orderByPartSql, Integer page, Integer pageSize);  
152 -  
153 -}  
src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java
@@ -58,6 +58,10 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme @@ -58,6 +58,10 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme
58 public CustomJdbcTemplateRowMapper<T> getCustomJdbcTemplateRowMapper(){ 58 public CustomJdbcTemplateRowMapper<T> getCustomJdbcTemplateRowMapper(){
59 return this._customJdbcTemplateRowMapper; 59 return this._customJdbcTemplateRowMapper;
60 } 60 }
  61 + public CustomJdbcTemplateWrapperTenant(JdbcTemplateWrapperTenant jdbcTemplate) throws Exception{
  62 + this();
  63 + this._jdbcTemplateWrapperTenant = jdbcTemplate;
  64 + }
61 65
62 @SuppressWarnings("unchecked") 66 @SuppressWarnings("unchecked")
63 public CustomJdbcTemplateWrapperTenant() throws Exception{ 67 public CustomJdbcTemplateWrapperTenant() throws Exception{
@@ -396,7 +400,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme @@ -396,7 +400,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme
396 //执行SQL 400 //执行SQL
397 String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")"; 401 String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")";
398 KeyHolder _keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(1)); 402 KeyHolder _keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(1));
399 - _jdbcTemplateWrapperTenant.update(new PreparedStatementCreator() { 403 + _jdbcTemplateWrapperTenant.getJdbcTemplate().update(new PreparedStatementCreator() {
400 @Override 404 @Override
401 public PreparedStatement createPreparedStatement(Connection con) throws SQLException { 405 public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
402 PreparedStatement stat = con.prepareStatement(exeSql, new String[] {_idTableFieldName}); 406 PreparedStatement stat = con.prepareStatement(exeSql, new String[] {_idTableFieldName});
@@ -405,7 +409,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme @@ -405,7 +409,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme
405 return stat; 409 return stat;
406 } 410 }
407 411
408 - }, _keyHolder, tenantId); 412 + }, _keyHolder);
409 413
410 return _keyHolder.getKey(); 414 return _keyHolder.getKey();
411 } 415 }
@@ -447,7 +451,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme @@ -447,7 +451,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme
447 451
448 //调用更新接口 452 //调用更新接口
449 KeyHolder _keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(entityList.size())); 453 KeyHolder _keyHolder = new GeneratedKeyHolder(new ArrayList<Map<String,Object>>(entityList.size()));
450 - _jdbcTemplateWrapperTenant.update(new PreparedStatementCreator() { 454 + _jdbcTemplateWrapperTenant.getJdbcTemplate().update(new PreparedStatementCreator() {
451 @Override 455 @Override
452 public PreparedStatement createPreparedStatement(Connection con) throws SQLException { 456 public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
453 PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {_idTableFieldName}); 457 PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {_idTableFieldName});
@@ -456,7 +460,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme @@ -456,7 +460,7 @@ public class CustomJdbcTemplateWrapperTenant&lt;T, ID extends Serializable&gt; impleme
456 return stat; 460 return stat;
457 } 461 }
458 462
459 - }, _keyHolder, tenantId); 463 + }, _keyHolder);
460 464
461 //处理结果数据 465 //处理结果数据
462 List<Map<String, Object>> data = _keyHolder.getKeyList(); 466 List<Map<String, Object>> data = _keyHolder.getKeyList();
src/main/java/com/taover/repository/advice/EntityPointCut.java
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -package com.taover.repository.advice;  
2 -  
3 -public interface EntityPointCut {  
4 -  
5 - public void before();  
6 -  
7 - public void after();  
8 -}  
src/main/java/com/taover/repository/autoconfigure/ShardingSphereKeyGeneratorConfiguration.java
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 -package com.taover.repository.autoconfigure;  
2 -  
3 -import org.springframework.boot.context.properties.ConfigurationProperties;  
4 -import org.springframework.context.annotation.Configuration;  
5 -  
6 -@Configuration  
7 -@ConfigurationProperties(prefix = "taover.sharding")  
8 -public class ShardingSphereKeyGeneratorConfiguration {  
9 - private String workerId;  
10 - private String maxTolerateTimeDifferenceMilliseconds;  
11 - private String maxVibrationOffset;  
12 -  
13 - public String getWorkerId() {  
14 - return workerId;  
15 - }  
16 - public void setWorkerId(String workerId) {  
17 - this.workerId = workerId;  
18 - }  
19 - public String getMaxTolerateTimeDifferenceMilliseconds() {  
20 - return maxTolerateTimeDifferenceMilliseconds;  
21 - }  
22 - public void setMaxTolerateTimeDifferenceMilliseconds(String maxTolerateTimeDifferenceMilliseconds) {  
23 - this.maxTolerateTimeDifferenceMilliseconds = maxTolerateTimeDifferenceMilliseconds;  
24 - }  
25 - public String getMaxVibrationOffset() {  
26 - return maxVibrationOffset;  
27 - }  
28 - public void setMaxVibrationOffset(String maxVibrationOffset) {  
29 - this.maxVibrationOffset = maxVibrationOffset;  
30 - }  
31 -}  
src/main/java/com/taover/repository/autoconfigure/TaoverRepositoryAutoConfiguration.java
@@ -1,55 +0,0 @@ @@ -1,55 +0,0 @@
1 -package com.taover.repository.autoconfigure;  
2 -  
3 -import javax.annotation.Resource;  
4 -  
5 -import org.springframework.boot.autoconfigure.AutoConfigureAfter;  
6 -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;  
7 -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;  
8 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
9 -import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;  
10 -import org.springframework.boot.context.properties.EnableConfigurationProperties;  
11 -import org.springframework.context.annotation.Bean;  
12 -import org.springframework.context.annotation.Configuration;  
13 -import org.springframework.jdbc.core.JdbcTemplate;  
14 -  
15 -import com.taover.repository.jdbctemplate.JdbcTemplateBroadcast;  
16 -import com.taover.repository.jdbctemplate.JdbcTemplateBroadcastImpl;  
17 -import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant;  
18 -import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenantImpl;  
19 -import com.taover.repository.shardingsphere.ShardingInfoRepository;  
20 -import com.taover.repository.shardingsphere.ShardingSphereService;  
21 -  
22 -@Configuration  
23 -@EnableConfigurationProperties({ShardingSphereKeyGeneratorConfiguration.class})  
24 -@AutoConfigureAfter(JdbcTemplateAutoConfiguration.class)  
25 -@ConditionalOnProperty(prefix = "spring.shardingsphere", name = "enabled", havingValue = "true", matchIfMissing = true)  
26 -@ConditionalOnClass({ShardingSphereService.class})  
27 -@ConditionalOnMissingBean(ShardingSphereService.class)  
28 -public class TaoverRepositoryAutoConfiguration {  
29 - @Resource  
30 - private JdbcTemplate jdbcTemplate;  
31 - @Resource  
32 - private ShardingSphereKeyGeneratorConfiguration config;  
33 - @Resource  
34 - private ShardingSphereService shardingSphereService;  
35 -  
36 - @Bean  
37 - public ShardingSphereService shardingSphereService() {  
38 - return new ShardingSphereService(config);  
39 - }  
40 -  
41 - @Bean  
42 - public ShardingInfoRepository shardingInfoRepository() throws Exception {  
43 - return new ShardingInfoRepository();  
44 - }  
45 -  
46 - @Bean  
47 - public JdbcTemplateWrapperTenant jdbcTemplateWrapperTenant() {  
48 - return new JdbcTemplateWrapperTenantImpl(this.jdbcTemplate, this.shardingSphereService);  
49 - }  
50 -  
51 - @Bean  
52 - public JdbcTemplateBroadcast jdbcTemplateWrapperBroadcast() {  
53 - return new JdbcTemplateBroadcastImpl(this.jdbcTemplate, this.shardingSphereService);  
54 - }  
55 -}  
src/main/java/com/taover/repository/bean/TenantIdentity.java
@@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
1 -package com.taover.repository.bean;  
2 -  
3 -public abstract class TenantIdentity {  
4 - public abstract Long getTenantId();  
5 -}  
6 -  
src/main/java/com/taover/repository/exception/NoContainTenantException.java
1 package com.taover.repository.exception; 1 package com.taover.repository.exception;
2 2
3 -public class NoContainTenantException extends Exception { 3 +public class NoContainTenantException extends RuntimeException {
  4 + private static final long serialVersionUID = 1L;
  5 + private String sql;
4 6
  7 + public NoContainTenantException(String sql) {
  8 + super("sql : "+sql);
  9 + this.sql = sql;
  10 + }
  11 +
  12 + public String getSql() {
  13 + return sql;
  14 + }
  15 +
  16 + public void setSql(String sql) {
  17 + this.sql = sql;
  18 + }
5 } 19 }
src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateBroadcast.java
@@ -1,976 +0,0 @@ @@ -1,976 +0,0 @@
1 -package com.taover.repository.jdbctemplate;  
2 -  
3 -import java.util.Collection;  
4 -import java.util.List;  
5 -import java.util.Map;  
6 -  
7 -import org.springframework.dao.DataAccessException;  
8 -import org.springframework.dao.IncorrectResultSizeDataAccessException;  
9 -import org.springframework.jdbc.core.BatchPreparedStatementSetter;  
10 -import org.springframework.jdbc.core.CallableStatementCallback;  
11 -import org.springframework.jdbc.core.CallableStatementCreator;  
12 -import org.springframework.jdbc.core.ColumnMapRowMapper;  
13 -import org.springframework.jdbc.core.ConnectionCallback;  
14 -import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;  
15 -import org.springframework.jdbc.core.PreparedStatementCallback;  
16 -import org.springframework.jdbc.core.PreparedStatementCreator;  
17 -import org.springframework.jdbc.core.PreparedStatementCreatorFactory;  
18 -import org.springframework.jdbc.core.PreparedStatementSetter;  
19 -import org.springframework.jdbc.core.ResultSetExtractor;  
20 -import org.springframework.jdbc.core.RowCallbackHandler;  
21 -import org.springframework.jdbc.core.RowMapper;  
22 -import org.springframework.jdbc.core.SingleColumnRowMapper;  
23 -import org.springframework.jdbc.core.SqlParameter;  
24 -import org.springframework.jdbc.core.SqlParameterValue;  
25 -import org.springframework.jdbc.core.SqlRowSetResultSetExtractor;  
26 -import org.springframework.jdbc.core.StatementCallback;  
27 -import org.springframework.jdbc.support.KeyHolder;  
28 -import org.springframework.jdbc.support.rowset.SqlRowSet;  
29 -import org.springframework.lang.Nullable;  
30 -  
31 -public interface JdbcTemplateBroadcast {  
32 - /**  
33 - * 加载分片信息  
34 - * @param tenantId  
35 - */  
36 - public void loadShardingInfo(String[] broadcastTableNames);  
37 -  
38 - /**  
39 - * 清空分片信息  
40 - */  
41 - public void clearShardingInfo();  
42 -  
43 - //-------------------------------------------------------------------------  
44 - // Methods dealing with a plain java.sql.Connection  
45 - //-------------------------------------------------------------------------  
46 -  
47 - /**  
48 - * Execute a JDBC data access operation, implemented as callback action  
49 - * working on a JDBC Connection. This allows for implementing arbitrary  
50 - * data access operations, within Spring's managed JDBC environment:  
51 - * that is, participating in Spring-managed transactions and converting  
52 - * JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
53 - * <p>The callback action can return a result object, for example a domain  
54 - * object or a collection of domain objects.  
55 - * @param action a callback object that specifies the action  
56 - * @return a result object returned by the action, or {@code null} if none  
57 - * @throws DataAccessException if there is any problem  
58 - */  
59 - @Nullable  
60 - <T> T execute(ConnectionCallback<T> action, String[] broadcastTableNames) throws DataAccessException;  
61 -  
62 -  
63 - //-------------------------------------------------------------------------  
64 - // Methods dealing with static SQL (java.sql.Statement)  
65 - //-------------------------------------------------------------------------  
66 -  
67 - /**  
68 - * Execute a JDBC data access operation, implemented as callback action  
69 - * working on a JDBC Statement. This allows for implementing arbitrary data  
70 - * access operations on a single Statement, within Spring's managed JDBC  
71 - * environment: that is, participating in Spring-managed transactions and  
72 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
73 - * <p>The callback action can return a result object, for example a domain  
74 - * object or a collection of domain objects.  
75 - * @param action a callback that specifies the action  
76 - * @return a result object returned by the action, or {@code null} if none  
77 - * @throws DataAccessException if there is any problem  
78 - */  
79 - @Nullable  
80 - <T> T execute(StatementCallback<T> action, String[] broadcastTableNames) throws DataAccessException;  
81 -  
82 - /**  
83 - * Issue a single SQL execute, typically a DDL statement.  
84 - * @param sql static SQL to execute  
85 - * @throws DataAccessException if there is any problem  
86 - */  
87 - void execute(String sql, String[] broadcastTableNames) throws DataAccessException;  
88 -  
89 - /**  
90 - * Execute a query given static SQL, reading the ResultSet with a  
91 - * ResultSetExtractor.  
92 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
93 - * execute a static query with a PreparedStatement, use the overloaded  
94 - * {@code query} method with {@code null} as argument array.  
95 - * @param sql the SQL query to execute  
96 - * @param rse a callback that will extract all rows of results  
97 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
98 - * @throws DataAccessException if there is any problem executing the query  
99 - * @see #query(String, Object[], ResultSetExtractor)  
100 - */  
101 - @Nullable  
102 - <T> T query(String sql, ResultSetExtractor<T> rse, String[] broadcastTableNames) throws DataAccessException;  
103 -  
104 - /**  
105 - * Execute a query given static SQL, reading the ResultSet on a per-row  
106 - * basis with a RowCallbackHandler.  
107 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
108 - * execute a static query with a PreparedStatement, use the overloaded  
109 - * {@code query} method with {@code null} as argument array.  
110 - * @param sql the SQL query to execute  
111 - * @param rch a callback that will extract results, one row at a time  
112 - * @throws DataAccessException if there is any problem executing the query  
113 - * @see #query(String, Object[], RowCallbackHandler)  
114 - */  
115 - void query(String sql, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException;  
116 -  
117 - /**  
118 - * Execute a query given static SQL, mapping each row to a result object  
119 - * via a RowMapper.  
120 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
121 - * execute a static query with a PreparedStatement, use the overloaded  
122 - * {@code query} method with {@code null} as argument array.  
123 - * @param sql the SQL query to execute  
124 - * @param rowMapper a callback that will map one object per row  
125 - * @return the result List, containing mapped objects  
126 - * @throws DataAccessException if there is any problem executing the query  
127 - * @see #query(String, Object[], RowMapper)  
128 - */  
129 - <T> List<T> query(String sql, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
130 -  
131 - /**  
132 - * Execute a query given static SQL, mapping a single result row to a  
133 - * result object via a RowMapper.  
134 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
135 - * execute a static query with a PreparedStatement, use the overloaded  
136 - * {@link #queryForObject(String, RowMapper, Object...)} method with  
137 - * {@code null} as argument array.  
138 - * @param sql the SQL query to execute  
139 - * @param rowMapper a callback that will map one object per row  
140 - * @return the single mapped object (may be {@code null} if the given  
141 - * {@link RowMapper} returned {@code} null)  
142 - * @throws IncorrectResultSizeDataAccessException if the query does not  
143 - * return exactly one row  
144 - * @throws DataAccessException if there is any problem executing the query  
145 - * @see #queryForObject(String, Object[], RowMapper)  
146 - */  
147 - @Nullable  
148 - <T> T queryForObject(String sql, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
149 -  
150 - /**  
151 - * Execute a query for a result object, given static SQL.  
152 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
153 - * execute a static query with a PreparedStatement, use the overloaded  
154 - * {@link #queryForObject(String, Class, Object...)} method with  
155 - * {@code null} as argument array.  
156 - * <p>This method is useful for running static SQL with a known outcome.  
157 - * The query is expected to be a single row/single column query; the returned  
158 - * result will be directly mapped to the corresponding object type.  
159 - * @param sql the SQL query to execute  
160 - * @param requiredType the type that the result object is expected to match  
161 - * @return the result object of the required type, or {@code null} in case of SQL NULL  
162 - * @throws IncorrectResultSizeDataAccessException if the query does not return  
163 - * exactly one row, or does not return exactly one column in that row  
164 - * @throws DataAccessException if there is any problem executing the query  
165 - * @see #queryForObject(String, Object[], Class)  
166 - */  
167 - @Nullable  
168 - <T> T queryForObject(String sql, Class<T> requiredType, String[] broadcastTableNames) throws DataAccessException;  
169 -  
170 - /**  
171 - * Execute a query for a result map, given static SQL.  
172 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
173 - * execute a static query with a PreparedStatement, use the overloaded  
174 - * {@link #queryForMap(String, Object...)} method with {@code null}  
175 - * as argument array.  
176 - * <p>The query is expected to be a single row query; the result row will be  
177 - * mapped to a Map (one entry for each column, using the column name as the key).  
178 - * @param sql the SQL query to execute  
179 - * @return the result Map (one entry per column, with column name as key)  
180 - * @throws IncorrectResultSizeDataAccessException if the query does not  
181 - * return exactly one row  
182 - * @throws DataAccessException if there is any problem executing the query  
183 - * @see #queryForMap(String, Object[])  
184 - * @see ColumnMapRowMapper  
185 - */  
186 - Map<String, Object> queryForMap(String sql, String[] broadcastTableNames) throws DataAccessException;  
187 -  
188 - /**  
189 - * Execute a query for a result list, given static SQL.  
190 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
191 - * execute a static query with a PreparedStatement, use the overloaded  
192 - * {@code queryForList} method with {@code null} as argument array.  
193 - * <p>The results will be mapped to a List (one entry for each row) of  
194 - * result objects, each of them matching the specified element type.  
195 - * @param sql the SQL query to execute  
196 - * @param elementType the required type of element in the result list  
197 - * (for example, {@code Integer.class})  
198 - * @return a List of objects that match the specified element type  
199 - * @throws DataAccessException if there is any problem executing the query  
200 - * @see #queryForList(String, Object[], Class)  
201 - * @see SingleColumnRowMapper  
202 - */  
203 - <T> List<T> queryForList(String sql, Class<T> elementType, String[] broadcastTableNames) throws DataAccessException;  
204 -  
205 - /**  
206 - * Execute a query for a result list, given static SQL.  
207 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
208 - * execute a static query with a PreparedStatement, use the overloaded  
209 - * {@code queryForList} method with {@code null} as argument array.  
210 - * <p>The results will be mapped to a List (one entry for each row) of  
211 - * Maps (one entry for each column using the column name as the key).  
212 - * Each element in the list will be of the form returned by this interface's  
213 - * {@code queryForMap} methods.  
214 - * @param sql the SQL query to execute  
215 - * @return an List that contains a Map per row  
216 - * @throws DataAccessException if there is any problem executing the query  
217 - * @see #queryForList(String, Object[])  
218 - */  
219 - List<Map<String, Object>> queryForList(String sql, String[] broadcastTableNames) throws DataAccessException;  
220 -  
221 - /**  
222 - * Execute a query for a SqlRowSet, given static SQL.  
223 - * <p>Uses a JDBC Statement, not a PreparedStatement. If you want to  
224 - * execute a static query with a PreparedStatement, use the overloaded  
225 - * {@code queryForRowSet} method with {@code null} as argument array.  
226 - * <p>The results will be mapped to an SqlRowSet which holds the data in a  
227 - * disconnected fashion. This wrapper will translate any SQLExceptions thrown.  
228 - * <p>Note that, for the default implementation, JDBC RowSet support needs to  
229 - * be available at runtime: by default, Sun's {@code com.sun.rowset.CachedRowSetImpl}  
230 - * class is used, which is part of JDK 1.5+ and also available separately as part of  
231 - * Sun's JDBC RowSet Implementations download (rowset.jar).  
232 - * @param sql the SQL query to execute  
233 - * @return a SqlRowSet representation (possibly a wrapper around a  
234 - * {@code javax.sql.rowset.CachedRowSet})  
235 - * @throws DataAccessException if there is any problem executing the query  
236 - * @see #queryForRowSet(String, Object[])  
237 - * @see SqlRowSetResultSetExtractor  
238 - * @see javax.sql.rowset.CachedRowSet  
239 - */  
240 - SqlRowSet queryForRowSet(String sql, String[] broadcastTableNames) throws DataAccessException;  
241 -  
242 - /**  
243 - * Issue a single SQL update operation (such as an insert, update or delete statement).  
244 - * @param sql static SQL to execute  
245 - * @return the number of rows affected  
246 - * @throws DataAccessException if there is any problem.  
247 - */  
248 - int update(String sql, String[] broadcastTableNames) throws DataAccessException;  
249 -  
250 - /**  
251 - * Issue multiple SQL updates on a single JDBC Statement using batching.  
252 - * <p>Will fall back to separate updates on a single Statement if the JDBC  
253 - * driver does not support batch updates.  
254 - * @param sql defining an array of SQL statements that will be executed.  
255 - * @return an array of the number of rows affected by each statement  
256 - * @throws DataAccessException if there is any problem executing the batch  
257 - */  
258 - int[] batchUpdate(String[] broadcastTableNames, String... sql) throws DataAccessException;  
259 -  
260 -  
261 - //-------------------------------------------------------------------------  
262 - // Methods dealing with prepared statements  
263 - //-------------------------------------------------------------------------  
264 -  
265 - /**  
266 - * Execute a JDBC data access operation, implemented as callback action  
267 - * working on a JDBC PreparedStatement. This allows for implementing arbitrary  
268 - * data access operations on a single Statement, within Spring's managed JDBC  
269 - * environment: that is, participating in Spring-managed transactions and  
270 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
271 - * <p>The callback action can return a result object, for example a domain  
272 - * object or a collection of domain objects.  
273 - * @param psc a callback that creates a PreparedStatement given a Connection  
274 - * @param action a callback that specifies the action  
275 - * @return a result object returned by the action, or {@code null} if none  
276 - * @throws DataAccessException if there is any problem  
277 - */  
278 - @Nullable  
279 - <T> T execute(PreparedStatementCreator psc, PreparedStatementCallback<T> action, String[] broadcastTableNames) throws DataAccessException;  
280 -  
281 - /**  
282 - * Execute a JDBC data access operation, implemented as callback action  
283 - * working on a JDBC PreparedStatement. This allows for implementing arbitrary  
284 - * data access operations on a single Statement, within Spring's managed JDBC  
285 - * environment: that is, participating in Spring-managed transactions and  
286 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
287 - * <p>The callback action can return a result object, for example a domain  
288 - * object or a collection of domain objects.  
289 - * @param sql the SQL to execute  
290 - * @param action a callback that specifies the action  
291 - * @return a result object returned by the action, or {@code null} if none  
292 - * @throws DataAccessException if there is any problem  
293 - */  
294 - @Nullable  
295 - <T> T execute(String sql, PreparedStatementCallback<T> action, String[] broadcastTableNames) throws DataAccessException;  
296 -  
297 - /**  
298 - * Query using a prepared statement, reading the ResultSet with a ResultSetExtractor.  
299 - * <p>A PreparedStatementCreator can either be implemented directly or  
300 - * configured through a PreparedStatementCreatorFactory.  
301 - * @param psc a callback that creates a PreparedStatement given a Connection  
302 - * @param rse a callback that will extract results  
303 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
304 - * @throws DataAccessException if there is any problem  
305 - * @see PreparedStatementCreatorFactory  
306 - */  
307 - @Nullable  
308 - <T> T query(PreparedStatementCreator psc, ResultSetExtractor<T> rse, String[] broadcastTableNames) throws DataAccessException;  
309 -  
310 - /**  
311 - * Query using a prepared statement, reading the ResultSet with a ResultSetExtractor.  
312 - * @param sql the SQL query to execute  
313 - * @param pss a callback that knows how to set values on the prepared statement.  
314 - * If this is {@code null}, the SQL will be assumed to contain no bind parameters.  
315 - * Even if there are no bind parameters, this callback may be used to set the  
316 - * fetch size and other performance options.  
317 - * @param rse a callback that will extract results  
318 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
319 - * @throws DataAccessException if there is any problem  
320 - */  
321 - @Nullable  
322 - <T> T query(String sql, @Nullable PreparedStatementSetter pss, ResultSetExtractor<T> rse, String[] broadcastTableNames) throws DataAccessException;  
323 -  
324 - /**  
325 - * Query given SQL to create a prepared statement from SQL and a list of arguments  
326 - * to bind to the query, reading the ResultSet with a ResultSetExtractor.  
327 - * @param sql the SQL query to execute  
328 - * @param args arguments to bind to the query  
329 - * @param argTypes the SQL types of the arguments  
330 - * (constants from {@code java.sql.Types})  
331 - * @param rse a callback that will extract results  
332 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
333 - * @throws DataAccessException if the query fails  
334 - * @see java.sql.Types  
335 - */  
336 - @Nullable  
337 - <T> T query(String sql, Object[] args, int[] argTypes, ResultSetExtractor<T> rse, String[] broadcastTableNames) throws DataAccessException;  
338 -  
339 - /**  
340 - * Query given SQL to create a prepared statement from SQL and a list of arguments  
341 - * to bind to the query, reading the ResultSet with a ResultSetExtractor.  
342 - * @param sql the SQL query to execute  
343 - * @param args arguments to bind to the query  
344 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
345 - * may also contain {@link SqlParameterValue} objects which indicate not  
346 - * only the argument value but also the SQL type and optionally the scale  
347 - * @param rse a callback that will extract results  
348 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
349 - * @throws DataAccessException if the query fails  
350 - */  
351 - @Nullable  
352 - <T> T query(String sql, Object[] args, ResultSetExtractor<T> rse, String[] broadcastTableNames) throws DataAccessException;  
353 -  
354 - /**  
355 - * Query given SQL to create a prepared statement from SQL and a list of arguments  
356 - * to bind to the query, reading the ResultSet with a ResultSetExtractor.  
357 - * @param sql the SQL query to execute  
358 - * @param rse a callback that will extract results  
359 - * @param args arguments to bind to the query  
360 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
361 - * may also contain {@link SqlParameterValue} objects which indicate not  
362 - * only the argument value but also the SQL type and optionally the scale  
363 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
364 - * @throws DataAccessException if the query fails  
365 - * @since 3.0.1  
366 - */  
367 - @Nullable  
368 - <T> T query(String sql, ResultSetExtractor<T> rse, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
369 -  
370 - /**  
371 - * Query using a prepared statement, reading the ResultSet on a per-row basis  
372 - * with a RowCallbackHandler.  
373 - * <p>A PreparedStatementCreator can either be implemented directly or  
374 - * configured through a PreparedStatementCreatorFactory.  
375 - * @param psc a callback that creates a PreparedStatement given a Connection  
376 - * @param rch a callback that will extract results, one row at a time  
377 - * @throws DataAccessException if there is any problem  
378 - * @see PreparedStatementCreatorFactory  
379 - */  
380 - void query(PreparedStatementCreator psc, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException;  
381 -  
382 - /**  
383 - * Query given SQL to create a prepared statement from SQL and a  
384 - * PreparedStatementSetter implementation that knows how to bind values to the  
385 - * query, reading the ResultSet on a per-row basis with a RowCallbackHandler.  
386 - * @param sql the SQL query to execute  
387 - * @param pss a callback that knows how to set values on the prepared statement.  
388 - * If this is {@code null}, the SQL will be assumed to contain no bind parameters.  
389 - * Even if there are no bind parameters, this callback may be used to set the  
390 - * fetch size and other performance options.  
391 - * @param rch a callback that will extract results, one row at a time  
392 - * @throws DataAccessException if the query fails  
393 - */  
394 - void query(String sql, @Nullable PreparedStatementSetter pss, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException;  
395 -  
396 - /**  
397 - * Query given SQL to create a prepared statement from SQL and a list of  
398 - * arguments to bind to the query, reading the ResultSet on a per-row basis  
399 - * with a RowCallbackHandler.  
400 - * @param sql the SQL query to execute  
401 - * @param args arguments to bind to the query  
402 - * @param argTypes the SQL types of the arguments  
403 - * (constants from {@code java.sql.Types})  
404 - * @param rch a callback that will extract results, one row at a time  
405 - * @throws DataAccessException if the query fails  
406 - * @see java.sql.Types  
407 - */  
408 - void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException;  
409 -  
410 - /**  
411 - * Query given SQL to create a prepared statement from SQL and a list of  
412 - * arguments to bind to the query, reading the ResultSet on a per-row basis  
413 - * with a RowCallbackHandler.  
414 - * @param sql the SQL query to execute  
415 - * @param args arguments to bind to the query  
416 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
417 - * may also contain {@link SqlParameterValue} objects which indicate not  
418 - * only the argument value but also the SQL type and optionally the scale  
419 - * @param rch a callback that will extract results, one row at a time  
420 - * @throws DataAccessException if the query fails  
421 - */  
422 - void query(String sql, Object[] args, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException;  
423 -  
424 - /**  
425 - * Query given SQL to create a prepared statement from SQL and a list of  
426 - * arguments to bind to the query, reading the ResultSet on a per-row basis  
427 - * with a RowCallbackHandler.  
428 - * @param sql the SQL query to execute  
429 - * @param rch a callback that will extract results, one row at a time  
430 - * @param args arguments to bind to the query  
431 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
432 - * may also contain {@link SqlParameterValue} objects which indicate not  
433 - * only the argument value but also the SQL type and optionally the scale  
434 - * @throws DataAccessException if the query fails  
435 - * @since 3.0.1  
436 - */  
437 - void query(String sql, RowCallbackHandler rch, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
438 -  
439 - /**  
440 - * Query using a prepared statement, mapping each row to a result object  
441 - * via a RowMapper.  
442 - * <p>A PreparedStatementCreator can either be implemented directly or  
443 - * configured through a PreparedStatementCreatorFactory.  
444 - * @param psc a callback that creates a PreparedStatement given a Connection  
445 - * @param rowMapper a callback that will map one object per row  
446 - * @return the result List, containing mapped objects  
447 - * @throws DataAccessException if there is any problem  
448 - * @see PreparedStatementCreatorFactory  
449 - */  
450 - <T> List<T> query(PreparedStatementCreator psc, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
451 -  
452 - /**  
453 - * Query given SQL to create a prepared statement from SQL and a  
454 - * PreparedStatementSetter implementation that knows how to bind values  
455 - * to the query, mapping each row to a result object via a RowMapper.  
456 - * @param sql the SQL query to execute  
457 - * @param pss a callback that knows how to set values on the prepared statement.  
458 - * If this is {@code null}, the SQL will be assumed to contain no bind parameters.  
459 - * Even if there are no bind parameters, this callback may be used to set the  
460 - * fetch size and other performance options.  
461 - * @param rowMapper a callback that will map one object per row  
462 - * @return the result List, containing mapped objects  
463 - * @throws DataAccessException if the query fails  
464 - */  
465 - <T> List<T> query(String sql, @Nullable PreparedStatementSetter pss, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
466 -  
467 - /**  
468 - * Query given SQL to create a prepared statement from SQL and a list of  
469 - * arguments to bind to the query, mapping each row to a result object  
470 - * via a RowMapper.  
471 - * @param sql the SQL query to execute  
472 - * @param args arguments to bind to the query  
473 - * @param argTypes the SQL types of the arguments  
474 - * (constants from {@code java.sql.Types})  
475 - * @param rowMapper a callback that will map one object per row  
476 - * @return the result List, containing mapped objects  
477 - * @throws DataAccessException if the query fails  
478 - * @see java.sql.Types  
479 - */  
480 - <T> List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
481 -  
482 - /**  
483 - * Query given SQL to create a prepared statement from SQL and a list of  
484 - * arguments to bind to the query, mapping each row to a result object  
485 - * via a RowMapper.  
486 - * @param sql the SQL query to execute  
487 - * @param args arguments to bind to the query  
488 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
489 - * may also contain {@link SqlParameterValue} objects which indicate not  
490 - * only the argument value but also the SQL type and optionally the scale  
491 - * @param rowMapper a callback that will map one object per row  
492 - * @return the result List, containing mapped objects  
493 - * @throws DataAccessException if the query fails  
494 - */  
495 - <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
496 -  
497 - /**  
498 - * Query given SQL to create a prepared statement from SQL and a list of  
499 - * arguments to bind to the query, mapping each row to a result object  
500 - * via a RowMapper.  
501 - * @param sql the SQL query to execute  
502 - * @param rowMapper a callback that will map one object per row  
503 - * @param args arguments to bind to the query  
504 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
505 - * may also contain {@link SqlParameterValue} objects which indicate not  
506 - * only the argument value but also the SQL type and optionally the scale  
507 - * @return the result List, containing mapped objects  
508 - * @throws DataAccessException if the query fails  
509 - * @since 3.0.1  
510 - */  
511 - <T> List<T> query(String sql, RowMapper<T> rowMapper, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
512 -  
513 - /**  
514 - * Query given SQL to create a prepared statement from SQL and a list  
515 - * of arguments to bind to the query, mapping a single result row to a  
516 - * result object via a RowMapper.  
517 - * @param sql the SQL query to execute  
518 - * @param args arguments to bind to the query  
519 - * (leaving it to the PreparedStatement to guess the corresponding SQL type)  
520 - * @param argTypes the SQL types of the arguments  
521 - * (constants from {@code java.sql.Types})  
522 - * @param rowMapper a callback that will map one object per row  
523 - * @return the single mapped object (may be {@code null} if the given  
524 - * {@link RowMapper} returned {@code} null)  
525 - * @throws IncorrectResultSizeDataAccessException if the query does not  
526 - * return exactly one row  
527 - * @throws DataAccessException if the query fails  
528 - */  
529 - @Nullable  
530 - <T> T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper, String[] broadcastTableNames)  
531 - throws DataAccessException;  
532 -  
533 - /**  
534 - * Query given SQL to create a prepared statement from SQL and a list  
535 - * of arguments to bind to the query, mapping a single result row to a  
536 - * result object via a RowMapper.  
537 - * @param sql the SQL query to execute  
538 - * @param args arguments to bind to the query  
539 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
540 - * may also contain {@link SqlParameterValue} objects which indicate not  
541 - * only the argument value but also the SQL type and optionally the scale  
542 - * @param rowMapper a callback that will map one object per row  
543 - * @return the single mapped object (may be {@code null} if the given  
544 - * {@link RowMapper} returned {@code} null)  
545 - * @throws IncorrectResultSizeDataAccessException if the query does not  
546 - * return exactly one row  
547 - * @throws DataAccessException if the query fails  
548 - */  
549 - @Nullable  
550 - <T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper, String[] broadcastTableNames) throws DataAccessException;  
551 -  
552 - /**  
553 - * Query given SQL to create a prepared statement from SQL and a list  
554 - * of arguments to bind to the query, mapping a single result row to a  
555 - * result object via a RowMapper.  
556 - * @param sql the SQL query to execute  
557 - * @param rowMapper a callback that will map one object per row  
558 - * @param args arguments to bind to the query  
559 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
560 - * may also contain {@link SqlParameterValue} objects which indicate not  
561 - * only the argument value but also the SQL type and optionally the scale  
562 - * @return the single mapped object (may be {@code null} if the given  
563 - * {@link RowMapper} returned {@code} null)  
564 - * @throws IncorrectResultSizeDataAccessException if the query does not  
565 - * return exactly one row  
566 - * @throws DataAccessException if the query fails  
567 - * @since 3.0.1  
568 - */  
569 - @Nullable  
570 - <T> T queryForObject(String sql, RowMapper<T> rowMapper, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
571 -  
572 - /**  
573 - * Query given SQL to create a prepared statement from SQL and a list of  
574 - * arguments to bind to the query, expecting a result object.  
575 - * <p>The query is expected to be a single row/single column query; the returned  
576 - * result will be directly mapped to the corresponding object type.  
577 - * @param sql the SQL query to execute  
578 - * @param args arguments to bind to the query  
579 - * @param argTypes the SQL types of the arguments  
580 - * (constants from {@code java.sql.Types})  
581 - * @param requiredType the type that the result object is expected to match  
582 - * @return the result object of the required type, or {@code null} in case of SQL NULL  
583 - * @throws IncorrectResultSizeDataAccessException if the query does not return  
584 - * exactly one row, or does not return exactly one column in that row  
585 - * @throws DataAccessException if the query fails  
586 - * @see #queryForObject(String, Class)  
587 - * @see java.sql.Types  
588 - */  
589 - @Nullable  
590 - <T> T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType, String[] broadcastTableNames)  
591 - throws DataAccessException;  
592 -  
593 - /**  
594 - * Query given SQL to create a prepared statement from SQL and a list of  
595 - * arguments to bind to the query, expecting a result object.  
596 - * <p>The query is expected to be a single row/single column query; the returned  
597 - * result will be directly mapped to the corresponding object type.  
598 - * @param sql the SQL query to execute  
599 - * @param args arguments to bind to the query  
600 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
601 - * may also contain {@link SqlParameterValue} objects which indicate not  
602 - * only the argument value but also the SQL type and optionally the scale  
603 - * @param requiredType the type that the result object is expected to match  
604 - * @return the result object of the required type, or {@code null} in case of SQL NULL  
605 - * @throws IncorrectResultSizeDataAccessException if the query does not return  
606 - * exactly one row, or does not return exactly one column in that row  
607 - * @throws DataAccessException if the query fails  
608 - * @see #queryForObject(String, Class)  
609 - */  
610 - @Nullable  
611 - <T> T queryForObject(String sql, Object[] args, Class<T> requiredType, String[] broadcastTableNames) throws DataAccessException;  
612 -  
613 - /**  
614 - * Query given SQL to create a prepared statement from SQL and a list of  
615 - * arguments to bind to the query, expecting a result object.  
616 - * <p>The query is expected to be a single row/single column query; the returned  
617 - * result will be directly mapped to the corresponding object type.  
618 - * @param sql the SQL query to execute  
619 - * @param requiredType the type that the result object is expected to match  
620 - * @param args arguments to bind to the query  
621 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
622 - * may also contain {@link SqlParameterValue} objects which indicate not  
623 - * only the argument value but also the SQL type and optionally the scale  
624 - * @return the result object of the required type, or {@code null} in case of SQL NULL  
625 - * @throws IncorrectResultSizeDataAccessException if the query does not return  
626 - * exactly one row, or does not return exactly one column in that row  
627 - * @throws DataAccessException if the query fails  
628 - * @since 3.0.1  
629 - * @see #queryForObject(String, Class)  
630 - */  
631 - @Nullable  
632 - <T> T queryForObject(String sql, Class<T> requiredType, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
633 -  
634 - /**  
635 - * Query given SQL to create a prepared statement from SQL and a list of  
636 - * arguments to bind to the query, expecting a result map.  
637 - * <p>The query is expected to be a single row query; the result row will be  
638 - * mapped to a Map (one entry for each column, using the column name as the key).  
639 - * @param sql the SQL query to execute  
640 - * @param args arguments to bind to the query  
641 - * @param argTypes the SQL types of the arguments  
642 - * (constants from {@code java.sql.Types})  
643 - * @return the result Map (one entry per column, with column name as key)  
644 - * @throws IncorrectResultSizeDataAccessException if the query does not  
645 - * return exactly one row  
646 - * @throws DataAccessException if the query fails  
647 - * @see #queryForMap(String)  
648 - * @see ColumnMapRowMapper  
649 - * @see java.sql.Types  
650 - */  
651 - Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException;  
652 -  
653 - /**  
654 - * Query given SQL to create a prepared statement from SQL and a list of  
655 - * arguments to bind to the query, expecting a result map.  
656 - * <p>The {@code queryForMap} methods defined by this interface are appropriate  
657 - * when you don't have a domain model. Otherwise, consider using one of the  
658 - * {@code queryForObject} methods.  
659 - * <p>The query is expected to be a single row query; the result row will be  
660 - * mapped to a Map (one entry for each column, using the column name as the key).  
661 - * @param sql the SQL query to execute  
662 - * @param args arguments to bind to the query  
663 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
664 - * may also contain {@link SqlParameterValue} objects which indicate not  
665 - * only the argument value but also the SQL type and optionally the scale  
666 - * @return the result Map (one entry for each column, using the  
667 - * column name as the key)  
668 - * @throws IncorrectResultSizeDataAccessException if the query does not  
669 - * return exactly one row  
670 - * @throws DataAccessException if the query fails  
671 - * @see #queryForMap(String)  
672 - * @see ColumnMapRowMapper  
673 - */  
674 - Map<String, Object> queryForMap(String sql, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
675 -  
676 - /**  
677 - * Query given SQL to create a prepared statement from SQL and a list of  
678 - * arguments to bind to the query, expecting a result list.  
679 - * <p>The results will be mapped to a List (one entry for each row) of  
680 - * result objects, each of them matching the specified element type.  
681 - * @param sql the SQL query to execute  
682 - * @param args arguments to bind to the query  
683 - * @param argTypes the SQL types of the arguments  
684 - * (constants from {@code java.sql.Types})  
685 - * @param elementType the required type of element in the result list  
686 - * (for example, {@code Integer.class})  
687 - * @return a List of objects that match the specified element type  
688 - * @throws DataAccessException if the query fails  
689 - * @see #queryForList(String, Class)  
690 - * @see SingleColumnRowMapper  
691 - */  
692 - <T> List<T> queryForList(String sql, Object[] args, int[] argTypes, Class<T> elementType, String[] broadcastTableNames)  
693 - throws DataAccessException;  
694 -  
695 - /**  
696 - * Query given SQL to create a prepared statement from SQL and a list of  
697 - * arguments to bind to the query, expecting a result list.  
698 - * <p>The results will be mapped to a List (one entry for each row) of  
699 - * result objects, each of them matching the specified element type.  
700 - * @param sql the SQL query to execute  
701 - * @param args arguments to bind to the query  
702 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
703 - * may also contain {@link SqlParameterValue} objects which indicate not  
704 - * only the argument value but also the SQL type and optionally the scale  
705 - * @param elementType the required type of element in the result list  
706 - * (for example, {@code Integer.class})  
707 - * @return a List of objects that match the specified element type  
708 - * @throws DataAccessException if the query fails  
709 - * @see #queryForList(String, Class)  
710 - * @see SingleColumnRowMapper  
711 - */  
712 - <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType, String[] broadcastTableNames) throws DataAccessException;  
713 -  
714 - /**  
715 - * Query given SQL to create a prepared statement from SQL and a list of  
716 - * arguments to bind to the query, expecting a result list.  
717 - * <p>The results will be mapped to a List (one entry for each row) of  
718 - * result objects, each of them matching the specified element type.  
719 - * @param sql the SQL query to execute  
720 - * @param elementType the required type of element in the result list  
721 - * (for example, {@code Integer.class})  
722 - * @param args arguments to bind to the query  
723 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
724 - * may also contain {@link SqlParameterValue} objects which indicate not  
725 - * only the argument value but also the SQL type and optionally the scale  
726 - * @return a List of objects that match the specified element type  
727 - * @throws DataAccessException if the query fails  
728 - * @since 3.0.1  
729 - * @see #queryForList(String, Class)  
730 - * @see SingleColumnRowMapper  
731 - */  
732 - <T> List<T> queryForList(String sql, Class<T> elementType, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
733 -  
734 - /**  
735 - * Query given SQL to create a prepared statement from SQL and a list of  
736 - * arguments to bind to the query, expecting a result list.  
737 - * <p>The results will be mapped to a List (one entry for each row) of  
738 - * Maps (one entry for each column, using the column name as the key).  
739 - * Each element in the list will be of the form returned by this interface's  
740 - * {@code queryForMap} methods.  
741 - * @param sql the SQL query to execute  
742 - * @param args arguments to bind to the query  
743 - * @param argTypes the SQL types of the arguments  
744 - * (constants from {@code java.sql.Types})  
745 - * @return a List that contains a Map per row  
746 - * @throws DataAccessException if the query fails  
747 - * @see #queryForList(String)  
748 - * @see java.sql.Types  
749 - */  
750 - List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException;  
751 -  
752 - /**  
753 - * Query given SQL to create a prepared statement from SQL and a list of  
754 - * arguments to bind to the query, expecting a result list.  
755 - * <p>The results will be mapped to a List (one entry for each row) of  
756 - * Maps (one entry for each column, using the column name as the key).  
757 - * Each element in the list will be of the form returned by this interface's  
758 - * {@code queryForMap} methods.  
759 - * @param sql the SQL query to execute  
760 - * @param args arguments to bind to the query  
761 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
762 - * may also contain {@link SqlParameterValue} objects which indicate not  
763 - * only the argument value but also the SQL type and optionally the scale  
764 - * @return a List that contains a Map per row  
765 - * @throws DataAccessException if the query fails  
766 - * @see #queryForList(String)  
767 - */  
768 - List<Map<String, Object>> queryForList(String sql, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
769 -  
770 - /**  
771 - * Query given SQL to create a prepared statement from SQL and a list of  
772 - * arguments to bind to the query, expecting a SqlRowSet.  
773 - * <p>The results will be mapped to an SqlRowSet which holds the data in a  
774 - * disconnected fashion. This wrapper will translate any SQLExceptions thrown.  
775 - * <p>Note that, for the default implementation, JDBC RowSet support needs to  
776 - * be available at runtime: by default, Sun's {@code com.sun.rowset.CachedRowSetImpl}  
777 - * class is used, which is part of JDK 1.5+ and also available separately as part of  
778 - * Sun's JDBC RowSet Implementations download (rowset.jar).  
779 - * @param sql the SQL query to execute  
780 - * @param args arguments to bind to the query  
781 - * @param argTypes the SQL types of the arguments  
782 - * (constants from {@code java.sql.Types})  
783 - * @return a SqlRowSet representation (possibly a wrapper around a  
784 - * {@code javax.sql.rowset.CachedRowSet})  
785 - * @throws DataAccessException if there is any problem executing the query  
786 - * @see #queryForRowSet(String)  
787 - * @see SqlRowSetResultSetExtractor  
788 - * @see javax.sql.rowset.CachedRowSet  
789 - * @see java.sql.Types  
790 - */  
791 - SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException;  
792 -  
793 - /**  
794 - * Query given SQL to create a prepared statement from SQL and a list of  
795 - * arguments to bind to the query, expecting a SqlRowSet.  
796 - * <p>The results will be mapped to an SqlRowSet which holds the data in a  
797 - * disconnected fashion. This wrapper will translate any SQLExceptions thrown.  
798 - * <p>Note that, for the default implementation, JDBC RowSet support needs to  
799 - * be available at runtime: by default, Sun's {@code com.sun.rowset.CachedRowSetImpl}  
800 - * class is used, which is part of JDK 1.5+ and also available separately as part of  
801 - * Sun's JDBC RowSet Implementations download (rowset.jar).  
802 - * @param sql the SQL query to execute  
803 - * @param args arguments to bind to the query  
804 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
805 - * may also contain {@link SqlParameterValue} objects which indicate not  
806 - * only the argument value but also the SQL type and optionally the scale  
807 - * @return a SqlRowSet representation (possibly a wrapper around a  
808 - * {@code javax.sql.rowset.CachedRowSet})  
809 - * @throws DataAccessException if there is any problem executing the query  
810 - * @see #queryForRowSet(String)  
811 - * @see SqlRowSetResultSetExtractor  
812 - * @see javax.sql.rowset.CachedRowSet  
813 - */  
814 - SqlRowSet queryForRowSet(String sql, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
815 -  
816 - /**  
817 - * Issue a single SQL update operation (such as an insert, update or delete  
818 - * statement) using a PreparedStatementCreator to provide SQL and any  
819 - * required parameters.  
820 - * <p>A PreparedStatementCreator can either be implemented directly or  
821 - * configured through a PreparedStatementCreatorFactory.  
822 - * @param psc a callback that provides SQL and any necessary parameters  
823 - * @return the number of rows affected  
824 - * @throws DataAccessException if there is any problem issuing the update  
825 - * @see PreparedStatementCreatorFactory  
826 - */  
827 - int update(PreparedStatementCreator psc, String[] broadcastTableNames) throws DataAccessException;  
828 -  
829 - /**  
830 - * Issue an update statement using a PreparedStatementCreator to provide SQL and  
831 - * any required parameters. Generated keys will be put into the given KeyHolder.  
832 - * <p>Note that the given PreparedStatementCreator has to create a statement  
833 - * with activated extraction of generated keys (a JDBC 3.0 feature). This can  
834 - * either be done directly or through using a PreparedStatementCreatorFactory.  
835 - * @param psc a callback that provides SQL and any necessary parameters  
836 - * @param generatedKeyHolder a KeyHolder that will hold the generated keys  
837 - * @return the number of rows affected  
838 - * @throws DataAccessException if there is any problem issuing the update  
839 - * @see PreparedStatementCreatorFactory  
840 - * @see org.springframework.jdbc.support.GeneratedKeyHolder  
841 - */  
842 - int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder, String[] broadcastTableNames) throws DataAccessException;  
843 -  
844 - /**  
845 - * Issue an update statement using a PreparedStatementSetter to set bind parameters,  
846 - * with given SQL. Simpler than using a PreparedStatementCreator as this method  
847 - * will create the PreparedStatement: The PreparedStatementSetter just needs to  
848 - * set parameters.  
849 - * @param sql the SQL containing bind parameters  
850 - * @param pss helper that sets bind parameters. If this is {@code null}  
851 - * we run an update with static SQL.  
852 - * @return the number of rows affected  
853 - * @throws DataAccessException if there is any problem issuing the update  
854 - */  
855 - int update(String sql, @Nullable PreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException;  
856 -  
857 - /**  
858 - * Issue a single SQL update operation (such as an insert, update or delete statement)  
859 - * via a prepared statement, binding the given arguments.  
860 - * @param sql the SQL containing bind parameters  
861 - * @param args arguments to bind to the query  
862 - * @param argTypes the SQL types of the arguments  
863 - * (constants from {@code java.sql.Types})  
864 - * @return the number of rows affected  
865 - * @throws DataAccessException if there is any problem issuing the update  
866 - * @see java.sql.Types  
867 - */  
868 - int update(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException;  
869 -  
870 - /**  
871 - * Issue a single SQL update operation (such as an insert, update or delete statement)  
872 - * via a prepared statement, binding the given arguments.  
873 - * @param sql the SQL containing bind parameters  
874 - * @param args arguments to bind to the query  
875 - * (leaving it to the PreparedStatement to guess the corresponding SQL type);  
876 - * may also contain {@link SqlParameterValue} objects which indicate not  
877 - * only the argument value but also the SQL type and optionally the scale  
878 - * @return the number of rows affected  
879 - * @throws DataAccessException if there is any problem issuing the update  
880 - */  
881 - int update(String sql, String[] broadcastTableNames, @Nullable Object... args) throws DataAccessException;  
882 -  
883 - /**  
884 - * Issue multiple update statements on a single PreparedStatement,  
885 - * using batch updates and a BatchPreparedStatementSetter to set values.  
886 - * <p>Will fall back to separate updates on a single PreparedStatement  
887 - * if the JDBC driver does not support batch updates.  
888 - * @param sql defining PreparedStatement that will be reused.  
889 - * All statements in the batch will use the same SQL.  
890 - * @param pss object to set parameters on the PreparedStatement  
891 - * created by this method  
892 - * @return an array of the number of rows affected by each statement  
893 - * @throws DataAccessException if there is any problem issuing the update  
894 - */  
895 - int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException;  
896 -  
897 - /**  
898 - * Execute a batch using the supplied SQL statement with the batch of supplied arguments.  
899 - * @param sql the SQL statement to execute  
900 - * @param batchArgs the List of Object arrays containing the batch of arguments for the query  
901 - * @return an array containing the numbers of rows affected by each update in the batch  
902 - */  
903 - int[] batchUpdate(String sql, List<Object[]> batchArgs, String[] broadcastTableNames) throws DataAccessException;  
904 -  
905 - /**  
906 - * Execute a batch using the supplied SQL statement with the batch of supplied arguments.  
907 - * @param sql the SQL statement to execute.  
908 - * @param batchArgs the List of Object arrays containing the batch of arguments for the query  
909 - * @param argTypes the SQL types of the arguments  
910 - * (constants from {@code java.sql.Types})  
911 - * @return an array containing the numbers of rows affected by each update in the batch  
912 - */  
913 - int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes, String[] broadcastTableNames) throws DataAccessException;  
914 -  
915 - /**  
916 - * Execute multiple batches using the supplied SQL statement with the collect of supplied arguments.  
917 - * The arguments' values will be set using the ParameterizedPreparedStatementSetter.  
918 - * Each batch should be of size indicated in 'batchSize'.  
919 - * @param sql the SQL statement to execute.  
920 - * @param batchArgs the List of Object arrays containing the batch of arguments for the query  
921 - * @param batchSize batch size  
922 - * @param pss the ParameterizedPreparedStatementSetter to use  
923 - * @return an array containing for each batch another array containing the numbers of rows affected  
924 - * by each update in the batch  
925 - * @since 3.1  
926 - */  
927 - <T> int[][] batchUpdate(String sql, Collection<T> batchArgs, int batchSize,  
928 - ParameterizedPreparedStatementSetter<T> pss, String[] broadcastTableNames) throws DataAccessException;  
929 -  
930 -  
931 - //-------------------------------------------------------------------------  
932 - // Methods dealing with callable statements  
933 - //-------------------------------------------------------------------------  
934 -  
935 - /**  
936 - * Execute a JDBC data access operation, implemented as callback action  
937 - * working on a JDBC CallableStatement. This allows for implementing arbitrary  
938 - * data access operations on a single Statement, within Spring's managed JDBC  
939 - * environment: that is, participating in Spring-managed transactions and  
940 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
941 - * <p>The callback action can return a result object, for example a domain  
942 - * object or a collection of domain objects.  
943 - * @param csc a callback that creates a CallableStatement given a Connection  
944 - * @param action a callback that specifies the action  
945 - * @return a result object returned by the action, or {@code null} if none  
946 - * @throws DataAccessException if there is any problem  
947 - */  
948 - @Nullable  
949 - <T> T execute(CallableStatementCreator csc, CallableStatementCallback<T> action, String[] broadcastTableNames) throws DataAccessException;  
950 -  
951 - /**  
952 - * Execute a JDBC data access operation, implemented as callback action  
953 - * working on a JDBC CallableStatement. This allows for implementing arbitrary  
954 - * data access operations on a single Statement, within Spring's managed JDBC  
955 - * environment: that is, participating in Spring-managed transactions and  
956 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
957 - * <p>The callback action can return a result object, for example a domain  
958 - * object or a collection of domain objects.  
959 - * @param callString the SQL call string to execute  
960 - * @param action a callback that specifies the action  
961 - * @return a result object returned by the action, or {@code null} if none  
962 - * @throws DataAccessException if there is any problem  
963 - */  
964 - @Nullable  
965 - <T> T execute(String callString, CallableStatementCallback<T> action, String[] broadcastTableNames) throws DataAccessException;  
966 -  
967 - /**  
968 - * Execute a SQL call using a CallableStatementCreator to provide SQL and  
969 - * any required parameters.  
970 - * @param csc a callback that provides SQL and any necessary parameters  
971 - * @param declaredParameters list of declared SqlParameter objects  
972 - * @return a Map of extracted out parameters  
973 - * @throws DataAccessException if there is any problem issuing the update  
974 - */  
975 - Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters, String[] broadcastTableNames) throws DataAccessException;  
976 -}  
src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateBroadcastImpl.java
@@ -1,667 +0,0 @@ @@ -1,667 +0,0 @@
1 -package com.taover.repository.jdbctemplate;  
2 -  
3 -import java.util.Collection;  
4 -import java.util.List;  
5 -import java.util.Map;  
6 -  
7 -import org.apache.shardingsphere.infra.hint.HintManager;  
8 -import org.springframework.dao.DataAccessException;  
9 -import org.springframework.jdbc.core.BatchPreparedStatementSetter;  
10 -import org.springframework.jdbc.core.CallableStatementCallback;  
11 -import org.springframework.jdbc.core.CallableStatementCreator;  
12 -import org.springframework.jdbc.core.ConnectionCallback;  
13 -import org.springframework.jdbc.core.JdbcTemplate;  
14 -import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;  
15 -import org.springframework.jdbc.core.PreparedStatementCallback;  
16 -import org.springframework.jdbc.core.PreparedStatementCreator;  
17 -import org.springframework.jdbc.core.PreparedStatementSetter;  
18 -import org.springframework.jdbc.core.ResultSetExtractor;  
19 -import org.springframework.jdbc.core.RowCallbackHandler;  
20 -import org.springframework.jdbc.core.RowMapper;  
21 -import org.springframework.jdbc.core.SqlParameter;  
22 -import org.springframework.jdbc.core.StatementCallback;  
23 -import org.springframework.jdbc.support.KeyHolder;  
24 -import org.springframework.jdbc.support.rowset.SqlRowSet;  
25 -  
26 -import com.taover.repository.shardingsphere.ShardingInfoEntity;  
27 -import com.taover.repository.shardingsphere.ShardingSphereService;  
28 -  
29 -public class JdbcTemplateBroadcastImpl implements JdbcTemplateBroadcast {  
30 - private JdbcTemplate jdbcTemplate;  
31 - private ShardingSphereService shardingSphereService;  
32 -  
33 - public JdbcTemplateBroadcastImpl(JdbcTemplate jdbcTemplate, ShardingSphereService shardingSphereService) {  
34 - this.jdbcTemplate = jdbcTemplate;  
35 - this.shardingSphereService = shardingSphereService;  
36 - }  
37 -  
38 - @Override  
39 - public void loadShardingInfo(String[] broadcastTableNames) {  
40 - List<ShardingInfoEntity> shardingInfo = this.shardingSphereService.getShardingInfoByTableNames(broadcastTableNames);  
41 - if(shardingInfo == null || shardingInfo.isEmpty()) {  
42 - return;  
43 - }  
44 - HintManager.clear();  
45 - HintManager instance = HintManager.getInstance();  
46 - for(ShardingInfoEntity item: shardingInfo) {  
47 - instance.addTableShardingValue(item.getTableName(), item.getTableSuffix());  
48 - instance.addDatabaseShardingValue(item.getTableName(), item.getDsName());  
49 - }  
50 - }  
51 -  
52 - @Override  
53 - public void clearShardingInfo() {  
54 - HintManager.clear();  
55 - }  
56 -  
57 - @Override  
58 - public <E> E execute(ConnectionCallback<E> action, String[] broadcastTableNames) throws DataAccessException {  
59 - try {  
60 - this.loadShardingInfo(broadcastTableNames);  
61 - return this.jdbcTemplate.execute(action);  
62 - }finally {  
63 - this.clearShardingInfo();  
64 - }  
65 - }  
66 -  
67 - @Override  
68 - public <E> E execute(StatementCallback<E> action, String[] broadcastTableNames) throws DataAccessException {  
69 - try {  
70 - this.loadShardingInfo(broadcastTableNames);  
71 - return this.jdbcTemplate.execute(action);  
72 - }finally {  
73 - this.clearShardingInfo();  
74 - }  
75 - }  
76 -  
77 - @Override  
78 - public void execute(String sql, String[] broadcastTableNames) throws DataAccessException {  
79 - try {  
80 - this.loadShardingInfo(broadcastTableNames);  
81 - this.jdbcTemplate.execute(sql);  
82 - }finally {  
83 - this.clearShardingInfo();  
84 - }  
85 - }  
86 -  
87 - @Override  
88 - public <E> E query(String sql, ResultSetExtractor<E> rse, String[] broadcastTableNames) throws DataAccessException {  
89 - try {  
90 - this.loadShardingInfo(broadcastTableNames);  
91 - return this.jdbcTemplate.query(sql, rse);  
92 - }finally {  
93 - this.clearShardingInfo();  
94 - }  
95 - }  
96 -  
97 - @Override  
98 - public void query(String sql, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException {  
99 - try {  
100 - this.loadShardingInfo(broadcastTableNames);  
101 - this.jdbcTemplate.query(sql, rch);  
102 - }finally {  
103 - this.clearShardingInfo();  
104 - }  
105 - }  
106 -  
107 - @Override  
108 - public <E> List<E> query(String sql, RowMapper<E> rowMapper, String[] broadcastTableNames) throws DataAccessException {  
109 - try {  
110 - this.loadShardingInfo(broadcastTableNames);  
111 - return this.jdbcTemplate.query(sql, rowMapper);  
112 - }finally {  
113 - this.clearShardingInfo();  
114 - }  
115 - }  
116 -  
117 - @Override  
118 - public <E> E queryForObject(String sql, RowMapper<E> rowMapper, String[] broadcastTableNames) throws DataAccessException {  
119 - try {  
120 - this.loadShardingInfo(broadcastTableNames);  
121 - return this.jdbcTemplate.queryForObject(sql, rowMapper);  
122 - }finally {  
123 - this.clearShardingInfo();  
124 - }  
125 - }  
126 -  
127 - @Override  
128 - public <E> E queryForObject(String sql, Class<E> requiredType, String[] broadcastTableNames) throws DataAccessException {  
129 - try {  
130 - this.loadShardingInfo(broadcastTableNames);  
131 - return this.jdbcTemplate.queryForObject(sql, requiredType);  
132 - }finally {  
133 - this.clearShardingInfo();  
134 - }  
135 - }  
136 -  
137 - @Override  
138 - public Map<String, Object> queryForMap(String sql, String[] broadcastTableNames) throws DataAccessException {  
139 - try {  
140 - this.loadShardingInfo(broadcastTableNames);  
141 - return this.jdbcTemplate.queryForMap(sql);  
142 - }finally {  
143 - this.clearShardingInfo();  
144 - }  
145 - }  
146 -  
147 - @Override  
148 - public <E> List<E> queryForList(String sql, Class<E> elementType, String[] broadcastTableNames) throws DataAccessException {  
149 - try {  
150 - this.loadShardingInfo(broadcastTableNames);  
151 - return this.jdbcTemplate.queryForList(sql, elementType);  
152 - }finally {  
153 - this.clearShardingInfo();  
154 - }  
155 - }  
156 -  
157 - @Override  
158 - public List<Map<String, Object>> queryForList(String sql, String[] broadcastTableNames) throws DataAccessException {  
159 - try {  
160 - this.loadShardingInfo(broadcastTableNames);  
161 - return this.jdbcTemplate.queryForList(sql);  
162 - }finally {  
163 - this.clearShardingInfo();  
164 - }  
165 - }  
166 -  
167 - @Override  
168 - public SqlRowSet queryForRowSet(String sql, String[] broadcastTableNames) throws DataAccessException {  
169 - try {  
170 - this.loadShardingInfo(broadcastTableNames);  
171 - return this.jdbcTemplate.queryForRowSet(sql);  
172 - }finally {  
173 - this.clearShardingInfo();  
174 - }  
175 - }  
176 -  
177 - @Override  
178 - public int update(String sql, String[] broadcastTableNames) throws DataAccessException {  
179 - try {  
180 - this.loadShardingInfo(broadcastTableNames);  
181 - return this.jdbcTemplate.update(sql);  
182 - }finally {  
183 - this.clearShardingInfo();  
184 - }  
185 - }  
186 -  
187 - @Override  
188 - public int[] batchUpdate(String[] broadcastTableNames, String... sql) throws DataAccessException {  
189 - try {  
190 - this.loadShardingInfo(broadcastTableNames);  
191 - return this.jdbcTemplate.batchUpdate(sql);  
192 - }finally {  
193 - this.clearShardingInfo();  
194 - }  
195 - }  
196 -  
197 - @Override  
198 - public <E> E execute(PreparedStatementCreator psc, PreparedStatementCallback<E> action, String[] broadcastTableNames)  
199 - throws DataAccessException {  
200 - try {  
201 - this.loadShardingInfo(broadcastTableNames);  
202 - return this.jdbcTemplate.execute(psc, action);  
203 - }finally {  
204 - this.clearShardingInfo();  
205 - }  
206 - }  
207 -  
208 - @Override  
209 - public <E> E execute(String sql, PreparedStatementCallback<E> action, String[] broadcastTableNames) throws DataAccessException {  
210 - try {  
211 - this.loadShardingInfo(broadcastTableNames);  
212 - return this.jdbcTemplate.execute(sql, action);  
213 - }finally {  
214 - this.clearShardingInfo();  
215 - }  
216 - }  
217 -  
218 - @Override  
219 - public <E> E query(PreparedStatementCreator psc, ResultSetExtractor<E> rse, String[] broadcastTableNames)  
220 - throws DataAccessException {  
221 - try {  
222 - this.loadShardingInfo(broadcastTableNames);  
223 - return this.jdbcTemplate.query(psc, rse);  
224 - }finally {  
225 - this.clearShardingInfo();  
226 - }  
227 - }  
228 -  
229 - @Override  
230 - public <E> E query(String sql, PreparedStatementSetter pss, ResultSetExtractor<E> rse, String[] broadcastTableNames)  
231 - throws DataAccessException {  
232 - try {  
233 - this.loadShardingInfo(broadcastTableNames);  
234 - return this.jdbcTemplate.query(sql, pss, rse);  
235 - }finally {  
236 - this.clearShardingInfo();  
237 - }  
238 - }  
239 -  
240 - @Override  
241 - public <E> E query(String sql, Object[] args, int[] argTypes, ResultSetExtractor<E> rse, String[] broadcastTableNames)  
242 - throws DataAccessException {  
243 - try {  
244 - this.loadShardingInfo(broadcastTableNames);  
245 - return this.jdbcTemplate.query(sql, args, argTypes, rse);  
246 - }finally {  
247 - this.clearShardingInfo();  
248 - }  
249 - }  
250 -  
251 - @Override  
252 - public <E> E query(String sql, Object[] args, ResultSetExtractor<E> rse, String[] broadcastTableNames) throws DataAccessException {  
253 - try {  
254 - this.loadShardingInfo(broadcastTableNames);  
255 - return this.jdbcTemplate.query(sql, args, rse);  
256 - }finally {  
257 - this.clearShardingInfo();  
258 - }  
259 - }  
260 -  
261 - @Override  
262 - public <E> E query(String sql, ResultSetExtractor<E> rse, String[] broadcastTableNames, Object... args)  
263 - throws DataAccessException {  
264 - try {  
265 - this.loadShardingInfo(broadcastTableNames);  
266 - return this.jdbcTemplate.query(sql, rse, args);  
267 - }finally {  
268 - this.clearShardingInfo();  
269 - }  
270 - }  
271 -  
272 - @Override  
273 - public void query(PreparedStatementCreator psc, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException {  
274 - try {  
275 - this.loadShardingInfo(broadcastTableNames);  
276 - this.jdbcTemplate.query(psc, rch);  
277 - }finally {  
278 - this.clearShardingInfo();  
279 - }  
280 - }  
281 -  
282 - @Override  
283 - public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch, String[] broadcastTableNames)  
284 - throws DataAccessException {  
285 - try {  
286 - this.loadShardingInfo(broadcastTableNames);  
287 - this.jdbcTemplate.query(sql, pss, rch);  
288 - }finally {  
289 - this.clearShardingInfo();  
290 - }  
291 - }  
292 -  
293 - @Override  
294 - public void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, String[] broadcastTableNames)  
295 - throws DataAccessException {  
296 - try {  
297 - this.loadShardingInfo(broadcastTableNames);  
298 - this.jdbcTemplate.query(sql, args, argTypes, rch);  
299 - }finally {  
300 - this.clearShardingInfo();  
301 - }  
302 - }  
303 -  
304 - @Override  
305 - public void query(String sql, Object[] args, RowCallbackHandler rch, String[] broadcastTableNames) throws DataAccessException {  
306 - try {  
307 - this.loadShardingInfo(broadcastTableNames);  
308 - this.jdbcTemplate.query(sql, args, rch);  
309 - }finally {  
310 - this.clearShardingInfo();  
311 - }  
312 - }  
313 -  
314 - @Override  
315 - public void query(String sql, RowCallbackHandler rch, String[] broadcastTableNames, Object... args) throws DataAccessException {  
316 - try {  
317 - this.loadShardingInfo(broadcastTableNames);  
318 - this.jdbcTemplate.query(sql, rch, args);  
319 - }finally {  
320 - this.clearShardingInfo();  
321 - }  
322 - }  
323 -  
324 - @Override  
325 - public <E> List<E> query(PreparedStatementCreator psc, RowMapper<E> rowMapper, String[] broadcastTableNames)  
326 - throws DataAccessException {  
327 - try {  
328 - this.loadShardingInfo(broadcastTableNames);  
329 - return this.jdbcTemplate.query(psc, rowMapper);  
330 - }finally {  
331 - this.clearShardingInfo();  
332 - }  
333 - }  
334 -  
335 - @Override  
336 - public <E> List<E> query(String sql, PreparedStatementSetter pss, RowMapper<E> rowMapper, String[] broadcastTableNames)  
337 - throws DataAccessException {  
338 - try {  
339 - this.loadShardingInfo(broadcastTableNames);  
340 - return this.jdbcTemplate.query(sql, pss, rowMapper);  
341 - }finally {  
342 - this.clearShardingInfo();  
343 - }  
344 - }  
345 -  
346 - @Override  
347 - public <E> List<E> query(String sql, Object[] args, int[] argTypes, RowMapper<E> rowMapper, String[] broadcastTableNames)  
348 - throws DataAccessException {  
349 - try {  
350 - this.loadShardingInfo(broadcastTableNames);  
351 - return this.jdbcTemplate.query(sql, args, argTypes, rowMapper);  
352 - }finally {  
353 - this.clearShardingInfo();  
354 - }  
355 - }  
356 -  
357 - @Override  
358 - public <E> List<E> query(String sql, Object[] args, RowMapper<E> rowMapper, String[] broadcastTableNames)  
359 - throws DataAccessException {  
360 - try {  
361 - this.loadShardingInfo(broadcastTableNames);  
362 - return this.jdbcTemplate.query(sql, args, rowMapper);  
363 - }finally {  
364 - this.clearShardingInfo();  
365 - }  
366 - }  
367 -  
368 - @Override  
369 - public <E> List<E> query(String sql, RowMapper<E> rowMapper, String[] broadcastTableNames, Object... args)  
370 - throws DataAccessException {  
371 - try {  
372 - this.loadShardingInfo(broadcastTableNames);  
373 - return this.jdbcTemplate.query(sql, rowMapper, args);  
374 - }finally {  
375 - this.clearShardingInfo();  
376 - }  
377 - }  
378 -  
379 - @Override  
380 - public <E> E queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<E> rowMapper, String[] broadcastTableNames)  
381 - throws DataAccessException {  
382 - try {  
383 - this.loadShardingInfo(broadcastTableNames);  
384 - return this.jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper);  
385 - }finally {  
386 - this.clearShardingInfo();  
387 - }  
388 - }  
389 -  
390 - @Override  
391 - public <E> E queryForObject(String sql, Object[] args, RowMapper<E> rowMapper, String[] broadcastTableNames)  
392 - throws DataAccessException {  
393 - try {  
394 - this.loadShardingInfo(broadcastTableNames);  
395 - return this.jdbcTemplate.queryForObject(sql, args, rowMapper);  
396 - }finally {  
397 - this.clearShardingInfo();  
398 - }  
399 - }  
400 -  
401 - @Override  
402 - public <E> E queryForObject(String sql, RowMapper<E> rowMapper, String[] broadcastTableNames, Object... args)  
403 - throws DataAccessException {  
404 - try {  
405 - this.loadShardingInfo(broadcastTableNames);  
406 - return this.jdbcTemplate.queryForObject(sql, rowMapper, args);  
407 - }finally {  
408 - this.clearShardingInfo();  
409 - }  
410 - }  
411 -  
412 - @Override  
413 - public <E> E queryForObject(String sql, Object[] args, int[] argTypes, Class<E> requiredType, String[] broadcastTableNames)  
414 - throws DataAccessException {  
415 - try {  
416 - this.loadShardingInfo(broadcastTableNames);  
417 - return this.jdbcTemplate.queryForObject(sql, args, argTypes, requiredType);  
418 - }finally {  
419 - this.clearShardingInfo();  
420 - }  
421 - }  
422 -  
423 - @Override  
424 - public <E> E queryForObject(String sql, Object[] args, Class<E> requiredType, String[] broadcastTableNames)  
425 - throws DataAccessException {  
426 - try {  
427 - this.loadShardingInfo(broadcastTableNames);  
428 - return this.jdbcTemplate.queryForObject(sql, args, requiredType);  
429 - }finally {  
430 - this.clearShardingInfo();  
431 - }  
432 - }  
433 -  
434 - @Override  
435 - public <E> E queryForObject(String sql, Class<E> requiredType, String[] broadcastTableNames, Object... args)  
436 - throws DataAccessException {  
437 - try {  
438 - this.loadShardingInfo(broadcastTableNames);  
439 - return this.jdbcTemplate.queryForObject(sql, requiredType, args);  
440 - }finally {  
441 - this.clearShardingInfo();  
442 - }  
443 - }  
444 -  
445 - @Override  
446 - public Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames)  
447 - throws DataAccessException {  
448 - try {  
449 - this.loadShardingInfo(broadcastTableNames);  
450 - return this.jdbcTemplate.queryForMap(sql, args, argTypes);  
451 - }finally {  
452 - this.clearShardingInfo();  
453 - }  
454 - }  
455 -  
456 - @Override  
457 - public Map<String, Object> queryForMap(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException {  
458 - try {  
459 - this.loadShardingInfo(broadcastTableNames);  
460 - return this.jdbcTemplate.queryForMap(sql, args);  
461 - }finally {  
462 - this.clearShardingInfo();  
463 - }  
464 - }  
465 -  
466 - @Override  
467 - public <E> List<E> queryForList(String sql, Object[] args, int[] argTypes, Class<E> elementType, String[] broadcastTableNames)  
468 - throws DataAccessException {  
469 - try {  
470 - this.loadShardingInfo(broadcastTableNames);  
471 - return this.jdbcTemplate.queryForList(sql, args, argTypes, elementType);  
472 - }finally {  
473 - this.clearShardingInfo();  
474 - }  
475 - }  
476 -  
477 - @Override  
478 - public <E> List<E> queryForList(String sql, Object[] args, Class<E> elementType, String[] broadcastTableNames)  
479 - throws DataAccessException {  
480 - try {  
481 - this.loadShardingInfo(broadcastTableNames);  
482 - return this.jdbcTemplate.queryForList(sql, args, elementType);  
483 - }finally {  
484 - this.clearShardingInfo();  
485 - }  
486 - }  
487 -  
488 - @Override  
489 - public <E> List<E> queryForList(String sql, Class<E> elementType, String[] broadcastTableNames, Object... args)  
490 - throws DataAccessException {  
491 - try {  
492 - this.loadShardingInfo(broadcastTableNames);  
493 - return this.jdbcTemplate.queryForList(sql, elementType, args);  
494 - }finally {  
495 - this.clearShardingInfo();  
496 - }  
497 - }  
498 -  
499 - @Override  
500 - public List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames)  
501 - throws DataAccessException {  
502 - try {  
503 - this.loadShardingInfo(broadcastTableNames);  
504 - return this.jdbcTemplate.queryForList(sql, args, argTypes);  
505 - }finally {  
506 - this.clearShardingInfo();  
507 - }  
508 - }  
509 -  
510 - @Override  
511 - public List<Map<String, Object>> queryForList(String sql, String[] broadcastTableNames, Object... args)  
512 - throws DataAccessException {  
513 - try {  
514 - this.loadShardingInfo(broadcastTableNames);  
515 - return this.jdbcTemplate.queryForList(sql, args);  
516 - }finally {  
517 - this.clearShardingInfo();  
518 - }  
519 - }  
520 -  
521 - @Override  
522 - public SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames)  
523 - throws DataAccessException {  
524 - try {  
525 - this.loadShardingInfo(broadcastTableNames);  
526 - return this.jdbcTemplate.queryForRowSet(sql, args, argTypes);  
527 - }finally {  
528 - this.clearShardingInfo();  
529 - }  
530 - }  
531 -  
532 - @Override  
533 - public SqlRowSet queryForRowSet(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException {  
534 - try {  
535 - this.loadShardingInfo(broadcastTableNames);  
536 - return this.jdbcTemplate.queryForRowSet(sql, args);  
537 - }finally {  
538 - this.clearShardingInfo();  
539 - }  
540 - }  
541 -  
542 - @Override  
543 - public int update(PreparedStatementCreator psc, String[] broadcastTableNames) throws DataAccessException {  
544 - try {  
545 - this.loadShardingInfo(broadcastTableNames);  
546 - return this.jdbcTemplate.update(psc);  
547 - }finally {  
548 - this.clearShardingInfo();  
549 - }  
550 - }  
551 -  
552 - @Override  
553 - public int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder, String[] broadcastTableNames)  
554 - throws DataAccessException {  
555 - try {  
556 - this.loadShardingInfo(broadcastTableNames);  
557 - return this.jdbcTemplate.update(psc, generatedKeyHolder);  
558 - }finally {  
559 - this.clearShardingInfo();  
560 - }  
561 - }  
562 -  
563 - @Override  
564 - public int update(String sql, PreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException {  
565 - try {  
566 - this.loadShardingInfo(broadcastTableNames);  
567 - return this.jdbcTemplate.update(sql, pss);  
568 - }finally {  
569 - this.clearShardingInfo();  
570 - }  
571 - }  
572 -  
573 - @Override  
574 - public int update(String sql, Object[] args, int[] argTypes, String[] broadcastTableNames) throws DataAccessException {  
575 - try {  
576 - this.loadShardingInfo(broadcastTableNames);  
577 - return this.jdbcTemplate.update(sql, args, argTypes);  
578 - }finally {  
579 - this.clearShardingInfo();  
580 - }  
581 - }  
582 -  
583 - @Override  
584 - public int update(String sql, String[] broadcastTableNames, Object... args) throws DataAccessException {  
585 - try {  
586 - this.loadShardingInfo(broadcastTableNames);  
587 - return this.jdbcTemplate.update(sql, args);  
588 - }finally {  
589 - this.clearShardingInfo();  
590 - }  
591 - }  
592 -  
593 - @Override  
594 - public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, String[] broadcastTableNames) throws DataAccessException {  
595 - try {  
596 - this.loadShardingInfo(broadcastTableNames);  
597 - return this.jdbcTemplate.batchUpdate(sql, pss);  
598 - }finally {  
599 - this.clearShardingInfo();  
600 - }  
601 - }  
602 -  
603 - @Override  
604 - public int[] batchUpdate(String sql, List<Object[]> batchArgs, String[] broadcastTableNames) throws DataAccessException {  
605 - try {  
606 - this.loadShardingInfo(broadcastTableNames);  
607 - return this.jdbcTemplate.batchUpdate(sql, batchArgs);  
608 - }finally {  
609 - this.clearShardingInfo();  
610 - }  
611 - }  
612 -  
613 - @Override  
614 - public int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes, String[] broadcastTableNames)  
615 - throws DataAccessException {  
616 - try {  
617 - this.loadShardingInfo(broadcastTableNames);  
618 - return this.jdbcTemplate.batchUpdate(sql, batchArgs);  
619 - }finally {  
620 - this.clearShardingInfo();  
621 - }  
622 - }  
623 -  
624 - @Override  
625 - public <E> int[][] batchUpdate(String sql, Collection<E> batchArgs, int batchSize,  
626 - ParameterizedPreparedStatementSetter<E> pss, String[] broadcastTableNames) throws DataAccessException {  
627 - try {  
628 - this.loadShardingInfo(broadcastTableNames);  
629 - return this.jdbcTemplate.batchUpdate(sql, batchArgs, batchSize, pss);  
630 - }finally {  
631 - this.clearShardingInfo();  
632 - }  
633 - }  
634 -  
635 - @Override  
636 - public <E> E execute(CallableStatementCreator csc, CallableStatementCallback<E> action, String[] broadcastTableNames)  
637 - throws DataAccessException {  
638 - try {  
639 - this.loadShardingInfo(broadcastTableNames);  
640 - return this.jdbcTemplate.execute(csc, action);  
641 - }finally {  
642 - this.clearShardingInfo();  
643 - }  
644 - }  
645 -  
646 - @Override  
647 - public <E> E execute(String callString, CallableStatementCallback<E> action, String[] broadcastTableNames)  
648 - throws DataAccessException {  
649 - try {  
650 - this.loadShardingInfo(broadcastTableNames);  
651 - return this.jdbcTemplate.execute(callString, action);  
652 - }finally {  
653 - this.clearShardingInfo();  
654 - }  
655 - }  
656 -  
657 - @Override  
658 - public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters, String[] broadcastTableNames)  
659 - throws DataAccessException {  
660 - try {  
661 - this.loadShardingInfo(broadcastTableNames);  
662 - return this.jdbcTemplate.call(csc, declaredParameters);  
663 - }finally {  
664 - this.clearShardingInfo();  
665 - }  
666 - }  
667 -}  
src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateWrapperTenant.java
1 package com.taover.repository.jdbctemplate; 1 package com.taover.repository.jdbctemplate;
2 2
  3 +import java.io.Serializable;
3 import java.util.Collection; 4 import java.util.Collection;
4 import java.util.List; 5 import java.util.List;
5 import java.util.Map; 6 import java.util.Map;
@@ -7,84 +8,43 @@ import java.util.Map; @@ -7,84 +8,43 @@ import java.util.Map;
7 import org.springframework.dao.DataAccessException; 8 import org.springframework.dao.DataAccessException;
8 import org.springframework.dao.IncorrectResultSizeDataAccessException; 9 import org.springframework.dao.IncorrectResultSizeDataAccessException;
9 import org.springframework.jdbc.core.BatchPreparedStatementSetter; 10 import org.springframework.jdbc.core.BatchPreparedStatementSetter;
10 -import org.springframework.jdbc.core.CallableStatementCallback;  
11 -import org.springframework.jdbc.core.CallableStatementCreator;  
12 import org.springframework.jdbc.core.ColumnMapRowMapper; 11 import org.springframework.jdbc.core.ColumnMapRowMapper;
13 -import org.springframework.jdbc.core.ConnectionCallback; 12 +import org.springframework.jdbc.core.JdbcTemplate;
14 import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter; 13 import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
15 import org.springframework.jdbc.core.PreparedStatementCallback; 14 import org.springframework.jdbc.core.PreparedStatementCallback;
16 -import org.springframework.jdbc.core.PreparedStatementCreator;  
17 -import org.springframework.jdbc.core.PreparedStatementCreatorFactory;  
18 import org.springframework.jdbc.core.PreparedStatementSetter; 15 import org.springframework.jdbc.core.PreparedStatementSetter;
19 import org.springframework.jdbc.core.ResultSetExtractor; 16 import org.springframework.jdbc.core.ResultSetExtractor;
20 import org.springframework.jdbc.core.RowCallbackHandler; 17 import org.springframework.jdbc.core.RowCallbackHandler;
21 import org.springframework.jdbc.core.RowMapper; 18 import org.springframework.jdbc.core.RowMapper;
22 import org.springframework.jdbc.core.SingleColumnRowMapper; 19 import org.springframework.jdbc.core.SingleColumnRowMapper;
23 -import org.springframework.jdbc.core.SqlParameter;  
24 import org.springframework.jdbc.core.SqlParameterValue; 20 import org.springframework.jdbc.core.SqlParameterValue;
25 import org.springframework.jdbc.core.SqlRowSetResultSetExtractor; 21 import org.springframework.jdbc.core.SqlRowSetResultSetExtractor;
26 -import org.springframework.jdbc.core.StatementCallback;  
27 -import org.springframework.jdbc.support.KeyHolder;  
28 import org.springframework.jdbc.support.rowset.SqlRowSet; 22 import org.springframework.jdbc.support.rowset.SqlRowSet;
29 import org.springframework.lang.Nullable; 23 import org.springframework.lang.Nullable;
30 24
31 -public interface JdbcTemplateWrapperTenant { 25 +import com.taover.repository.exception.NoContainTenantException;
  26 +
  27 +public interface JdbcTemplateWrapperTenant<ID extends Serializable> {
32 /** 28 /**
33 - * 加载分片信息  
34 - * @param tenantId 29 + * 获取JdbcTemplate
  30 + * @return
35 */ 31 */
36 - public void loadShardingInfo(Long tenantId); 32 + JdbcTemplate getJdbcTemplate();
37 33
38 /** 34 /**
39 - * 清空分片信息 35 + * 检查租户ID
  36 + * @param sql
  37 + * @param tenantId
  38 + * @throws NoContainTenantException
40 */ 39 */
41 - public void clearShardingInfo(); 40 + void doCheckTenantId(String sql, ID tenantId) throws NoContainTenantException;
42 41
43 - //-------------------------------------------------------------------------  
44 - // Methods dealing with a plain java.sql.Connection  
45 - //-------------------------------------------------------------------------  
46 -  
47 - /**  
48 - * Execute a JDBC data access operation, implemented as callback action  
49 - * working on a JDBC Connection. This allows for implementing arbitrary  
50 - * data access operations, within Spring's managed JDBC environment:  
51 - * that is, participating in Spring-managed transactions and converting  
52 - * JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
53 - * <p>The callback action can return a result object, for example a domain  
54 - * object or a collection of domain objects.  
55 - * @param action a callback object that specifies the action  
56 - * @return a result object returned by the action, or {@code null} if none  
57 - * @throws DataAccessException if there is any problem  
58 - */  
59 - @Nullable  
60 - <T> T execute(ConnectionCallback<T> action, Long tenantId) throws DataAccessException;  
61 -  
62 -  
63 - //-------------------------------------------------------------------------  
64 - // Methods dealing with static SQL (java.sql.Statement)  
65 - //-------------------------------------------------------------------------  
66 -  
67 - /**  
68 - * Execute a JDBC data access operation, implemented as callback action  
69 - * working on a JDBC Statement. This allows for implementing arbitrary data  
70 - * access operations on a single Statement, within Spring's managed JDBC  
71 - * environment: that is, participating in Spring-managed transactions and  
72 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
73 - * <p>The callback action can return a result object, for example a domain  
74 - * object or a collection of domain objects.  
75 - * @param action a callback that specifies the action  
76 - * @return a result object returned by the action, or {@code null} if none  
77 - * @throws DataAccessException if there is any problem  
78 - */  
79 - @Nullable  
80 - <T> T execute(StatementCallback<T> action, Long tenantId) throws DataAccessException;  
81 -  
82 /** 42 /**
83 * Issue a single SQL execute, typically a DDL statement. 43 * Issue a single SQL execute, typically a DDL statement.
84 * @param sql static SQL to execute 44 * @param sql static SQL to execute
85 * @throws DataAccessException if there is any problem 45 * @throws DataAccessException if there is any problem
86 */ 46 */
87 - void execute(String sql, Long tenantId) throws DataAccessException; 47 + void execute(String sql, ID tenantId) throws DataAccessException;
88 48
89 /** 49 /**
90 * Execute a query given static SQL, reading the ResultSet with a 50 * Execute a query given static SQL, reading the ResultSet with a
@@ -99,7 +59,7 @@ public interface JdbcTemplateWrapperTenant { @@ -99,7 +59,7 @@ public interface JdbcTemplateWrapperTenant {
99 * @see #query(String, Object[], ResultSetExtractor) 59 * @see #query(String, Object[], ResultSetExtractor)
100 */ 60 */
101 @Nullable 61 @Nullable
102 - <T> T query(String sql, ResultSetExtractor<T> rse, Long tenantId) throws DataAccessException; 62 + <T> T query(String sql, ResultSetExtractor<T> rse, ID tenantId) throws DataAccessException;
103 63
104 /** 64 /**
105 * Execute a query given static SQL, reading the ResultSet on a per-row 65 * Execute a query given static SQL, reading the ResultSet on a per-row
@@ -112,7 +72,7 @@ public interface JdbcTemplateWrapperTenant { @@ -112,7 +72,7 @@ public interface JdbcTemplateWrapperTenant {
112 * @throws DataAccessException if there is any problem executing the query 72 * @throws DataAccessException if there is any problem executing the query
113 * @see #query(String, Object[], RowCallbackHandler) 73 * @see #query(String, Object[], RowCallbackHandler)
114 */ 74 */
115 - void query(String sql, RowCallbackHandler rch, Long tenantId) throws DataAccessException; 75 + void query(String sql, RowCallbackHandler rch, ID tenantId) throws DataAccessException;
116 76
117 /** 77 /**
118 * Execute a query given static SQL, mapping each row to a result object 78 * Execute a query given static SQL, mapping each row to a result object
@@ -126,7 +86,7 @@ public interface JdbcTemplateWrapperTenant { @@ -126,7 +86,7 @@ public interface JdbcTemplateWrapperTenant {
126 * @throws DataAccessException if there is any problem executing the query 86 * @throws DataAccessException if there is any problem executing the query
127 * @see #query(String, Object[], RowMapper) 87 * @see #query(String, Object[], RowMapper)
128 */ 88 */
129 - <T> List<T> query(String sql, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 89 + <T> List<T> query(String sql, RowMapper<T> rowMapper, ID tenantId) throws DataAccessException;
130 90
131 /** 91 /**
132 * Execute a query given static SQL, mapping a single result row to a 92 * Execute a query given static SQL, mapping a single result row to a
@@ -145,7 +105,7 @@ public interface JdbcTemplateWrapperTenant { @@ -145,7 +105,7 @@ public interface JdbcTemplateWrapperTenant {
145 * @see #queryForObject(String, Object[], RowMapper) 105 * @see #queryForObject(String, Object[], RowMapper)
146 */ 106 */
147 @Nullable 107 @Nullable
148 - <T> T queryForObject(String sql, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 108 + <T> T queryForObject(String sql, RowMapper<T> rowMapper, ID tenantId) throws DataAccessException;
149 109
150 /** 110 /**
151 * Execute a query for a result object, given static SQL. 111 * Execute a query for a result object, given static SQL.
@@ -165,7 +125,7 @@ public interface JdbcTemplateWrapperTenant { @@ -165,7 +125,7 @@ public interface JdbcTemplateWrapperTenant {
165 * @see #queryForObject(String, Object[], Class) 125 * @see #queryForObject(String, Object[], Class)
166 */ 126 */
167 @Nullable 127 @Nullable
168 - <T> T queryForObject(String sql, Class<T> requiredType, Long tenantId) throws DataAccessException; 128 + <T> T queryForObject(String sql, Class<T> requiredType, ID tenantId) throws DataAccessException;
169 129
170 /** 130 /**
171 * Execute a query for a result map, given static SQL. 131 * Execute a query for a result map, given static SQL.
@@ -183,7 +143,7 @@ public interface JdbcTemplateWrapperTenant { @@ -183,7 +143,7 @@ public interface JdbcTemplateWrapperTenant {
183 * @see #queryForMap(String, Object[]) 143 * @see #queryForMap(String, Object[])
184 * @see ColumnMapRowMapper 144 * @see ColumnMapRowMapper
185 */ 145 */
186 - Map<String, Object> queryForMap(String sql, Long tenantId) throws DataAccessException; 146 + Map<String, Object> queryForMap(String sql, ID tenantId) throws DataAccessException;
187 147
188 /** 148 /**
189 * Execute a query for a result list, given static SQL. 149 * Execute a query for a result list, given static SQL.
@@ -200,7 +160,7 @@ public interface JdbcTemplateWrapperTenant { @@ -200,7 +160,7 @@ public interface JdbcTemplateWrapperTenant {
200 * @see #queryForList(String, Object[], Class) 160 * @see #queryForList(String, Object[], Class)
201 * @see SingleColumnRowMapper 161 * @see SingleColumnRowMapper
202 */ 162 */
203 - <T> List<T> queryForList(String sql, Class<T> elementType, Long tenantId) throws DataAccessException; 163 + <T> List<T> queryForList(String sql, Class<T> elementType, ID tenantId) throws DataAccessException;
204 164
205 /** 165 /**
206 * Execute a query for a result list, given static SQL. 166 * Execute a query for a result list, given static SQL.
@@ -216,7 +176,7 @@ public interface JdbcTemplateWrapperTenant { @@ -216,7 +176,7 @@ public interface JdbcTemplateWrapperTenant {
216 * @throws DataAccessException if there is any problem executing the query 176 * @throws DataAccessException if there is any problem executing the query
217 * @see #queryForList(String, Object[]) 177 * @see #queryForList(String, Object[])
218 */ 178 */
219 - List<Map<String, Object>> queryForList(String sql, Long tenantId) throws DataAccessException; 179 + List<Map<String, Object>> queryForList(String sql, ID tenantId) throws DataAccessException;
220 180
221 /** 181 /**
222 * Execute a query for a SqlRowSet, given static SQL. 182 * Execute a query for a SqlRowSet, given static SQL.
@@ -237,7 +197,7 @@ public interface JdbcTemplateWrapperTenant { @@ -237,7 +197,7 @@ public interface JdbcTemplateWrapperTenant {
237 * @see SqlRowSetResultSetExtractor 197 * @see SqlRowSetResultSetExtractor
238 * @see javax.sql.rowset.CachedRowSet 198 * @see javax.sql.rowset.CachedRowSet
239 */ 199 */
240 - SqlRowSet queryForRowSet(String sql, Long tenantId) throws DataAccessException; 200 + SqlRowSet queryForRowSet(String sql, ID tenantId) throws DataAccessException;
241 201
242 /** 202 /**
243 * Issue a single SQL update operation (such as an insert, update or delete statement). 203 * Issue a single SQL update operation (such as an insert, update or delete statement).
@@ -245,7 +205,7 @@ public interface JdbcTemplateWrapperTenant { @@ -245,7 +205,7 @@ public interface JdbcTemplateWrapperTenant {
245 * @return the number of rows affected 205 * @return the number of rows affected
246 * @throws DataAccessException if there is any problem. 206 * @throws DataAccessException if there is any problem.
247 */ 207 */
248 - int update(String sql, Long tenantId) throws DataAccessException; 208 + int update(String sql, ID tenantId) throws DataAccessException;
249 209
250 /** 210 /**
251 * Issue multiple SQL updates on a single JDBC Statement using batching. 211 * Issue multiple SQL updates on a single JDBC Statement using batching.
@@ -255,28 +215,7 @@ public interface JdbcTemplateWrapperTenant { @@ -255,28 +215,7 @@ public interface JdbcTemplateWrapperTenant {
255 * @return an array of the number of rows affected by each statement 215 * @return an array of the number of rows affected by each statement
256 * @throws DataAccessException if there is any problem executing the batch 216 * @throws DataAccessException if there is any problem executing the batch
257 */ 217 */
258 - int[] batchUpdate(Long tenantId, String... sql) throws DataAccessException;  
259 -  
260 -  
261 - //-------------------------------------------------------------------------  
262 - // Methods dealing with prepared statements  
263 - //-------------------------------------------------------------------------  
264 -  
265 - /**  
266 - * Execute a JDBC data access operation, implemented as callback action  
267 - * working on a JDBC PreparedStatement. This allows for implementing arbitrary  
268 - * data access operations on a single Statement, within Spring's managed JDBC  
269 - * environment: that is, participating in Spring-managed transactions and  
270 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
271 - * <p>The callback action can return a result object, for example a domain  
272 - * object or a collection of domain objects.  
273 - * @param psc a callback that creates a PreparedStatement given a Connection  
274 - * @param action a callback that specifies the action  
275 - * @return a result object returned by the action, or {@code null} if none  
276 - * @throws DataAccessException if there is any problem  
277 - */  
278 - @Nullable  
279 - <T> T execute(PreparedStatementCreator psc, PreparedStatementCallback<T> action, Long tenantId) throws DataAccessException; 218 + int[] batchUpdate(ID tenantId, String... sql) throws DataAccessException;
280 219
281 /** 220 /**
282 * Execute a JDBC data access operation, implemented as callback action 221 * Execute a JDBC data access operation, implemented as callback action
@@ -292,20 +231,7 @@ public interface JdbcTemplateWrapperTenant { @@ -292,20 +231,7 @@ public interface JdbcTemplateWrapperTenant {
292 * @throws DataAccessException if there is any problem 231 * @throws DataAccessException if there is any problem
293 */ 232 */
294 @Nullable 233 @Nullable
295 - <T> T execute(String sql, PreparedStatementCallback<T> action, Long tenantId) throws DataAccessException;  
296 -  
297 - /**  
298 - * Query using a prepared statement, reading the ResultSet with a ResultSetExtractor.  
299 - * <p>A PreparedStatementCreator can either be implemented directly or  
300 - * configured through a PreparedStatementCreatorFactory.  
301 - * @param psc a callback that creates a PreparedStatement given a Connection  
302 - * @param rse a callback that will extract results  
303 - * @return an arbitrary result object, as returned by the ResultSetExtractor  
304 - * @throws DataAccessException if there is any problem  
305 - * @see PreparedStatementCreatorFactory  
306 - */  
307 - @Nullable  
308 - <T> T query(PreparedStatementCreator psc, ResultSetExtractor<T> rse, Long tenantId) throws DataAccessException; 234 + <T> T execute(String sql, PreparedStatementCallback<T> action, ID tenantId) throws DataAccessException;
309 235
310 /** 236 /**
311 * Query using a prepared statement, reading the ResultSet with a ResultSetExtractor. 237 * Query using a prepared statement, reading the ResultSet with a ResultSetExtractor.
@@ -319,7 +245,7 @@ public interface JdbcTemplateWrapperTenant { @@ -319,7 +245,7 @@ public interface JdbcTemplateWrapperTenant {
319 * @throws DataAccessException if there is any problem 245 * @throws DataAccessException if there is any problem
320 */ 246 */
321 @Nullable 247 @Nullable
322 - <T> T query(String sql, @Nullable PreparedStatementSetter pss, ResultSetExtractor<T> rse, Long tenantId) throws DataAccessException; 248 + <T> T query(String sql, @Nullable PreparedStatementSetter pss, ResultSetExtractor<T> rse, ID tenantId) throws DataAccessException;
323 249
324 /** 250 /**
325 * Query given SQL to create a prepared statement from SQL and a list of arguments 251 * Query given SQL to create a prepared statement from SQL and a list of arguments
@@ -334,7 +260,7 @@ public interface JdbcTemplateWrapperTenant { @@ -334,7 +260,7 @@ public interface JdbcTemplateWrapperTenant {
334 * @see java.sql.Types 260 * @see java.sql.Types
335 */ 261 */
336 @Nullable 262 @Nullable
337 - <T> T query(String sql, Object[] args, int[] argTypes, ResultSetExtractor<T> rse, Long tenantId) throws DataAccessException; 263 + <T> T query(String sql, Object[] args, int[] argTypes, ResultSetExtractor<T> rse, ID tenantId) throws DataAccessException;
338 264
339 /** 265 /**
340 * Query given SQL to create a prepared statement from SQL and a list of arguments 266 * Query given SQL to create a prepared statement from SQL and a list of arguments
@@ -349,7 +275,7 @@ public interface JdbcTemplateWrapperTenant { @@ -349,7 +275,7 @@ public interface JdbcTemplateWrapperTenant {
349 * @throws DataAccessException if the query fails 275 * @throws DataAccessException if the query fails
350 */ 276 */
351 @Nullable 277 @Nullable
352 - <T> T query(String sql, Object[] args, ResultSetExtractor<T> rse, Long tenantId) throws DataAccessException; 278 + <T> T query(String sql, Object[] args, ResultSetExtractor<T> rse, ID tenantId) throws DataAccessException;
353 279
354 /** 280 /**
355 * Query given SQL to create a prepared statement from SQL and a list of arguments 281 * Query given SQL to create a prepared statement from SQL and a list of arguments
@@ -365,19 +291,7 @@ public interface JdbcTemplateWrapperTenant { @@ -365,19 +291,7 @@ public interface JdbcTemplateWrapperTenant {
365 * @since 3.0.1 291 * @since 3.0.1
366 */ 292 */
367 @Nullable 293 @Nullable
368 - <T> T query(String sql, ResultSetExtractor<T> rse, Long tenantId, @Nullable Object... args) throws DataAccessException;  
369 -  
370 - /**  
371 - * Query using a prepared statement, reading the ResultSet on a per-row basis  
372 - * with a RowCallbackHandler.  
373 - * <p>A PreparedStatementCreator can either be implemented directly or  
374 - * configured through a PreparedStatementCreatorFactory.  
375 - * @param psc a callback that creates a PreparedStatement given a Connection  
376 - * @param rch a callback that will extract results, one row at a time  
377 - * @throws DataAccessException if there is any problem  
378 - * @see PreparedStatementCreatorFactory  
379 - */  
380 - void query(PreparedStatementCreator psc, RowCallbackHandler rch, Long tenantId) throws DataAccessException; 294 + <T> T query(String sql, ResultSetExtractor<T> rse, ID tenantId, @Nullable Object... args) throws DataAccessException;
381 295
382 /** 296 /**
383 * Query given SQL to create a prepared statement from SQL and a 297 * Query given SQL to create a prepared statement from SQL and a
@@ -391,7 +305,7 @@ public interface JdbcTemplateWrapperTenant { @@ -391,7 +305,7 @@ public interface JdbcTemplateWrapperTenant {
391 * @param rch a callback that will extract results, one row at a time 305 * @param rch a callback that will extract results, one row at a time
392 * @throws DataAccessException if the query fails 306 * @throws DataAccessException if the query fails
393 */ 307 */
394 - void query(String sql, @Nullable PreparedStatementSetter pss, RowCallbackHandler rch, Long tenantId) throws DataAccessException; 308 + void query(String sql, @Nullable PreparedStatementSetter pss, RowCallbackHandler rch, ID tenantId) throws DataAccessException;
395 309
396 /** 310 /**
397 * Query given SQL to create a prepared statement from SQL and a list of 311 * Query given SQL to create a prepared statement from SQL and a list of
@@ -405,7 +319,7 @@ public interface JdbcTemplateWrapperTenant { @@ -405,7 +319,7 @@ public interface JdbcTemplateWrapperTenant {
405 * @throws DataAccessException if the query fails 319 * @throws DataAccessException if the query fails
406 * @see java.sql.Types 320 * @see java.sql.Types
407 */ 321 */
408 - void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, Long tenantId) throws DataAccessException; 322 + void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, ID tenantId) throws DataAccessException;
409 323
410 /** 324 /**
411 * Query given SQL to create a prepared statement from SQL and a list of 325 * Query given SQL to create a prepared statement from SQL and a list of
@@ -419,7 +333,7 @@ public interface JdbcTemplateWrapperTenant { @@ -419,7 +333,7 @@ public interface JdbcTemplateWrapperTenant {
419 * @param rch a callback that will extract results, one row at a time 333 * @param rch a callback that will extract results, one row at a time
420 * @throws DataAccessException if the query fails 334 * @throws DataAccessException if the query fails
421 */ 335 */
422 - void query(String sql, Object[] args, RowCallbackHandler rch, Long tenantId) throws DataAccessException; 336 + void query(String sql, Object[] args, RowCallbackHandler rch, ID tenantId) throws DataAccessException;
423 337
424 /** 338 /**
425 * Query given SQL to create a prepared statement from SQL and a list of 339 * Query given SQL to create a prepared statement from SQL and a list of
@@ -434,20 +348,7 @@ public interface JdbcTemplateWrapperTenant { @@ -434,20 +348,7 @@ public interface JdbcTemplateWrapperTenant {
434 * @throws DataAccessException if the query fails 348 * @throws DataAccessException if the query fails
435 * @since 3.0.1 349 * @since 3.0.1
436 */ 350 */
437 - void query(String sql, RowCallbackHandler rch, Long tenantId, @Nullable Object... args) throws DataAccessException;  
438 -  
439 - /**  
440 - * Query using a prepared statement, mapping each row to a result object  
441 - * via a RowMapper.  
442 - * <p>A PreparedStatementCreator can either be implemented directly or  
443 - * configured through a PreparedStatementCreatorFactory.  
444 - * @param psc a callback that creates a PreparedStatement given a Connection  
445 - * @param rowMapper a callback that will map one object per row  
446 - * @return the result List, containing mapped objects  
447 - * @throws DataAccessException if there is any problem  
448 - * @see PreparedStatementCreatorFactory  
449 - */  
450 - <T> List<T> query(PreparedStatementCreator psc, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 351 + void query(String sql, RowCallbackHandler rch, ID tenantId, @Nullable Object... args) throws DataAccessException;
451 352
452 /** 353 /**
453 * Query given SQL to create a prepared statement from SQL and a 354 * Query given SQL to create a prepared statement from SQL and a
@@ -462,7 +363,7 @@ public interface JdbcTemplateWrapperTenant { @@ -462,7 +363,7 @@ public interface JdbcTemplateWrapperTenant {
462 * @return the result List, containing mapped objects 363 * @return the result List, containing mapped objects
463 * @throws DataAccessException if the query fails 364 * @throws DataAccessException if the query fails
464 */ 365 */
465 - <T> List<T> query(String sql, @Nullable PreparedStatementSetter pss, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 366 + <T> List<T> query(String sql, @Nullable PreparedStatementSetter pss, RowMapper<T> rowMapper, ID tenantId) throws DataAccessException;
466 367
467 /** 368 /**
468 * Query given SQL to create a prepared statement from SQL and a list of 369 * Query given SQL to create a prepared statement from SQL and a list of
@@ -477,7 +378,7 @@ public interface JdbcTemplateWrapperTenant { @@ -477,7 +378,7 @@ public interface JdbcTemplateWrapperTenant {
477 * @throws DataAccessException if the query fails 378 * @throws DataAccessException if the query fails
478 * @see java.sql.Types 379 * @see java.sql.Types
479 */ 380 */
480 - <T> List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 381 + <T> List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper, ID tenantId) throws DataAccessException;
481 382
482 /** 383 /**
483 * Query given SQL to create a prepared statement from SQL and a list of 384 * Query given SQL to create a prepared statement from SQL and a list of
@@ -492,7 +393,7 @@ public interface JdbcTemplateWrapperTenant { @@ -492,7 +393,7 @@ public interface JdbcTemplateWrapperTenant {
492 * @return the result List, containing mapped objects 393 * @return the result List, containing mapped objects
493 * @throws DataAccessException if the query fails 394 * @throws DataAccessException if the query fails
494 */ 395 */
495 - <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 396 + <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper, ID tenantId) throws DataAccessException;
496 397
497 /** 398 /**
498 * Query given SQL to create a prepared statement from SQL and a list of 399 * Query given SQL to create a prepared statement from SQL and a list of
@@ -508,7 +409,7 @@ public interface JdbcTemplateWrapperTenant { @@ -508,7 +409,7 @@ public interface JdbcTemplateWrapperTenant {
508 * @throws DataAccessException if the query fails 409 * @throws DataAccessException if the query fails
509 * @since 3.0.1 410 * @since 3.0.1
510 */ 411 */
511 - <T> List<T> query(String sql, RowMapper<T> rowMapper, Long tenantId, @Nullable Object... args) throws DataAccessException; 412 + <T> List<T> query(String sql, RowMapper<T> rowMapper, ID tenantId, @Nullable Object... args) throws DataAccessException;
512 413
513 /** 414 /**
514 * Query given SQL to create a prepared statement from SQL and a list 415 * Query given SQL to create a prepared statement from SQL and a list
@@ -527,7 +428,7 @@ public interface JdbcTemplateWrapperTenant { @@ -527,7 +428,7 @@ public interface JdbcTemplateWrapperTenant {
527 * @throws DataAccessException if the query fails 428 * @throws DataAccessException if the query fails
528 */ 429 */
529 @Nullable 430 @Nullable
530 - <T> T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper, Long tenantId) 431 + <T> T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper, ID tenantId)
531 throws DataAccessException; 432 throws DataAccessException;
532 433
533 /** 434 /**
@@ -547,7 +448,7 @@ public interface JdbcTemplateWrapperTenant { @@ -547,7 +448,7 @@ public interface JdbcTemplateWrapperTenant {
547 * @throws DataAccessException if the query fails 448 * @throws DataAccessException if the query fails
548 */ 449 */
549 @Nullable 450 @Nullable
550 - <T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper, Long tenantId) throws DataAccessException; 451 + <T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper, ID tenantId) throws DataAccessException;
551 452
552 /** 453 /**
553 * Query given SQL to create a prepared statement from SQL and a list 454 * Query given SQL to create a prepared statement from SQL and a list
@@ -567,7 +468,7 @@ public interface JdbcTemplateWrapperTenant { @@ -567,7 +468,7 @@ public interface JdbcTemplateWrapperTenant {
567 * @since 3.0.1 468 * @since 3.0.1
568 */ 469 */
569 @Nullable 470 @Nullable
570 - <T> T queryForObject(String sql, RowMapper<T> rowMapper, Long tenantId, @Nullable Object... args) throws DataAccessException; 471 + <T> T queryForObject(String sql, RowMapper<T> rowMapper, ID tenantId, @Nullable Object... args) throws DataAccessException;
571 472
572 /** 473 /**
573 * Query given SQL to create a prepared statement from SQL and a list of 474 * Query given SQL to create a prepared statement from SQL and a list of
@@ -587,7 +488,7 @@ public interface JdbcTemplateWrapperTenant { @@ -587,7 +488,7 @@ public interface JdbcTemplateWrapperTenant {
587 * @see java.sql.Types 488 * @see java.sql.Types
588 */ 489 */
589 @Nullable 490 @Nullable
590 - <T> T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType, Long tenantId) 491 + <T> T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType, ID tenantId)
591 throws DataAccessException; 492 throws DataAccessException;
592 493
593 /** 494 /**
@@ -608,7 +509,7 @@ public interface JdbcTemplateWrapperTenant { @@ -608,7 +509,7 @@ public interface JdbcTemplateWrapperTenant {
608 * @see #queryForObject(String, Class) 509 * @see #queryForObject(String, Class)
609 */ 510 */
610 @Nullable 511 @Nullable
611 - <T> T queryForObject(String sql, Object[] args, Class<T> requiredType, Long tenantId) throws DataAccessException; 512 + <T> T queryForObject(String sql, Object[] args, Class<T> requiredType, ID tenantId) throws DataAccessException;
612 513
613 /** 514 /**
614 * Query given SQL to create a prepared statement from SQL and a list of 515 * Query given SQL to create a prepared statement from SQL and a list of
@@ -629,7 +530,7 @@ public interface JdbcTemplateWrapperTenant { @@ -629,7 +530,7 @@ public interface JdbcTemplateWrapperTenant {
629 * @see #queryForObject(String, Class) 530 * @see #queryForObject(String, Class)
630 */ 531 */
631 @Nullable 532 @Nullable
632 - <T> T queryForObject(String sql, Class<T> requiredType, Long tenantId, @Nullable Object... args) throws DataAccessException; 533 + <T> T queryForObject(String sql, Class<T> requiredType, ID tenantId, @Nullable Object... args) throws DataAccessException;
633 534
634 /** 535 /**
635 * Query given SQL to create a prepared statement from SQL and a list of 536 * Query given SQL to create a prepared statement from SQL and a list of
@@ -648,7 +549,7 @@ public interface JdbcTemplateWrapperTenant { @@ -648,7 +549,7 @@ public interface JdbcTemplateWrapperTenant {
648 * @see ColumnMapRowMapper 549 * @see ColumnMapRowMapper
649 * @see java.sql.Types 550 * @see java.sql.Types
650 */ 551 */
651 - Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes, Long tenantId) throws DataAccessException; 552 + Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes, ID tenantId) throws DataAccessException;
652 553
653 /** 554 /**
654 * Query given SQL to create a prepared statement from SQL and a list of 555 * Query given SQL to create a prepared statement from SQL and a list of
@@ -671,7 +572,7 @@ public interface JdbcTemplateWrapperTenant { @@ -671,7 +572,7 @@ public interface JdbcTemplateWrapperTenant {
671 * @see #queryForMap(String) 572 * @see #queryForMap(String)
672 * @see ColumnMapRowMapper 573 * @see ColumnMapRowMapper
673 */ 574 */
674 - Map<String, Object> queryForMap(String sql, Long tenantId, @Nullable Object... args) throws DataAccessException; 575 + Map<String, Object> queryForMap(String sql, ID tenantId, @Nullable Object... args) throws DataAccessException;
675 576
676 /** 577 /**
677 * Query given SQL to create a prepared statement from SQL and a list of 578 * Query given SQL to create a prepared statement from SQL and a list of
@@ -689,7 +590,7 @@ public interface JdbcTemplateWrapperTenant { @@ -689,7 +590,7 @@ public interface JdbcTemplateWrapperTenant {
689 * @see #queryForList(String, Class) 590 * @see #queryForList(String, Class)
690 * @see SingleColumnRowMapper 591 * @see SingleColumnRowMapper
691 */ 592 */
692 - <T> List<T> queryForList(String sql, Object[] args, int[] argTypes, Class<T> elementType, Long tenantId) 593 + <T> List<T> queryForList(String sql, Object[] args, int[] argTypes, Class<T> elementType, ID tenantId)
693 throws DataAccessException; 594 throws DataAccessException;
694 595
695 /** 596 /**
@@ -709,7 +610,7 @@ public interface JdbcTemplateWrapperTenant { @@ -709,7 +610,7 @@ public interface JdbcTemplateWrapperTenant {
709 * @see #queryForList(String, Class) 610 * @see #queryForList(String, Class)
710 * @see SingleColumnRowMapper 611 * @see SingleColumnRowMapper
711 */ 612 */
712 - <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType, Long tenantId) throws DataAccessException; 613 + <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType, ID tenantId) throws DataAccessException;
713 614
714 /** 615 /**
715 * Query given SQL to create a prepared statement from SQL and a list of 616 * Query given SQL to create a prepared statement from SQL and a list of
@@ -729,7 +630,7 @@ public interface JdbcTemplateWrapperTenant { @@ -729,7 +630,7 @@ public interface JdbcTemplateWrapperTenant {
729 * @see #queryForList(String, Class) 630 * @see #queryForList(String, Class)
730 * @see SingleColumnRowMapper 631 * @see SingleColumnRowMapper
731 */ 632 */
732 - <T> List<T> queryForList(String sql, Class<T> elementType, Long tenantId, @Nullable Object... args) throws DataAccessException; 633 + <T> List<T> queryForList(String sql, Class<T> elementType, ID tenantId, @Nullable Object... args) throws DataAccessException;
733 634
734 /** 635 /**
735 * Query given SQL to create a prepared statement from SQL and a list of 636 * Query given SQL to create a prepared statement from SQL and a list of
@@ -747,7 +648,7 @@ public interface JdbcTemplateWrapperTenant { @@ -747,7 +648,7 @@ public interface JdbcTemplateWrapperTenant {
747 * @see #queryForList(String) 648 * @see #queryForList(String)
748 * @see java.sql.Types 649 * @see java.sql.Types
749 */ 650 */
750 - List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes, Long tenantId) throws DataAccessException; 651 + List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes, ID tenantId) throws DataAccessException;
751 652
752 /** 653 /**
753 * Query given SQL to create a prepared statement from SQL and a list of 654 * Query given SQL to create a prepared statement from SQL and a list of
@@ -765,7 +666,7 @@ public interface JdbcTemplateWrapperTenant { @@ -765,7 +666,7 @@ public interface JdbcTemplateWrapperTenant {
765 * @throws DataAccessException if the query fails 666 * @throws DataAccessException if the query fails
766 * @see #queryForList(String) 667 * @see #queryForList(String)
767 */ 668 */
768 - List<Map<String, Object>> queryForList(String sql, Long tenantId, @Nullable Object... args) throws DataAccessException; 669 + List<Map<String, Object>> queryForList(String sql, ID tenantId, @Nullable Object... args) throws DataAccessException;
769 670
770 /** 671 /**
771 * Query given SQL to create a prepared statement from SQL and a list of 672 * Query given SQL to create a prepared statement from SQL and a list of
@@ -788,7 +689,7 @@ public interface JdbcTemplateWrapperTenant { @@ -788,7 +689,7 @@ public interface JdbcTemplateWrapperTenant {
788 * @see javax.sql.rowset.CachedRowSet 689 * @see javax.sql.rowset.CachedRowSet
789 * @see java.sql.Types 690 * @see java.sql.Types
790 */ 691 */
791 - SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, Long tenantId) throws DataAccessException; 692 + SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, ID tenantId) throws DataAccessException;
792 693
793 /** 694 /**
794 * Query given SQL to create a prepared statement from SQL and a list of 695 * Query given SQL to create a prepared statement from SQL and a list of
@@ -811,35 +712,7 @@ public interface JdbcTemplateWrapperTenant { @@ -811,35 +712,7 @@ public interface JdbcTemplateWrapperTenant {
811 * @see SqlRowSetResultSetExtractor 712 * @see SqlRowSetResultSetExtractor
812 * @see javax.sql.rowset.CachedRowSet 713 * @see javax.sql.rowset.CachedRowSet
813 */ 714 */
814 - SqlRowSet queryForRowSet(String sql, Long tenantId, @Nullable Object... args) throws DataAccessException;  
815 -  
816 - /**  
817 - * Issue a single SQL update operation (such as an insert, update or delete  
818 - * statement) using a PreparedStatementCreator to provide SQL and any  
819 - * required parameters.  
820 - * <p>A PreparedStatementCreator can either be implemented directly or  
821 - * configured through a PreparedStatementCreatorFactory.  
822 - * @param psc a callback that provides SQL and any necessary parameters  
823 - * @return the number of rows affected  
824 - * @throws DataAccessException if there is any problem issuing the update  
825 - * @see PreparedStatementCreatorFactory  
826 - */  
827 - int update(PreparedStatementCreator psc, Long tenantId) throws DataAccessException;  
828 -  
829 - /**  
830 - * Issue an update statement using a PreparedStatementCreator to provide SQL and  
831 - * any required parameters. Generated keys will be put into the given KeyHolder.  
832 - * <p>Note that the given PreparedStatementCreator has to create a statement  
833 - * with activated extraction of generated keys (a JDBC 3.0 feature). This can  
834 - * either be done directly or through using a PreparedStatementCreatorFactory.  
835 - * @param psc a callback that provides SQL and any necessary parameters  
836 - * @param generatedKeyHolder a KeyHolder that will hold the generated keys  
837 - * @return the number of rows affected  
838 - * @throws DataAccessException if there is any problem issuing the update  
839 - * @see PreparedStatementCreatorFactory  
840 - * @see org.springframework.jdbc.support.GeneratedKeyHolder  
841 - */  
842 - int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder, Long tenantId) throws DataAccessException; 715 + SqlRowSet queryForRowSet(String sql, ID tenantId, @Nullable Object... args) throws DataAccessException;
843 716
844 /** 717 /**
845 * Issue an update statement using a PreparedStatementSetter to set bind parameters, 718 * Issue an update statement using a PreparedStatementSetter to set bind parameters,
@@ -852,7 +725,7 @@ public interface JdbcTemplateWrapperTenant { @@ -852,7 +725,7 @@ public interface JdbcTemplateWrapperTenant {
852 * @return the number of rows affected 725 * @return the number of rows affected
853 * @throws DataAccessException if there is any problem issuing the update 726 * @throws DataAccessException if there is any problem issuing the update
854 */ 727 */
855 - int update(String sql, @Nullable PreparedStatementSetter pss, Long tenantId) throws DataAccessException; 728 + int update(String sql, @Nullable PreparedStatementSetter pss, ID tenantId) throws DataAccessException;
856 729
857 /** 730 /**
858 * Issue a single SQL update operation (such as an insert, update or delete statement) 731 * Issue a single SQL update operation (such as an insert, update or delete statement)
@@ -865,7 +738,7 @@ public interface JdbcTemplateWrapperTenant { @@ -865,7 +738,7 @@ public interface JdbcTemplateWrapperTenant {
865 * @throws DataAccessException if there is any problem issuing the update 738 * @throws DataAccessException if there is any problem issuing the update
866 * @see java.sql.Types 739 * @see java.sql.Types
867 */ 740 */
868 - int update(String sql, Object[] args, int[] argTypes, Long tenantId) throws DataAccessException; 741 + int update(String sql, Object[] args, int[] argTypes, ID tenantId) throws DataAccessException;
869 742
870 /** 743 /**
871 * Issue a single SQL update operation (such as an insert, update or delete statement) 744 * Issue a single SQL update operation (such as an insert, update or delete statement)
@@ -878,7 +751,7 @@ public interface JdbcTemplateWrapperTenant { @@ -878,7 +751,7 @@ public interface JdbcTemplateWrapperTenant {
878 * @return the number of rows affected 751 * @return the number of rows affected
879 * @throws DataAccessException if there is any problem issuing the update 752 * @throws DataAccessException if there is any problem issuing the update
880 */ 753 */
881 - int update(String sql, Long tenantId, @Nullable Object... args) throws DataAccessException; 754 + int update(String sql, ID tenantId, @Nullable Object... args) throws DataAccessException;
882 755
883 /** 756 /**
884 * Issue multiple update statements on a single PreparedStatement, 757 * Issue multiple update statements on a single PreparedStatement,
@@ -892,7 +765,7 @@ public interface JdbcTemplateWrapperTenant { @@ -892,7 +765,7 @@ public interface JdbcTemplateWrapperTenant {
892 * @return an array of the number of rows affected by each statement 765 * @return an array of the number of rows affected by each statement
893 * @throws DataAccessException if there is any problem issuing the update 766 * @throws DataAccessException if there is any problem issuing the update
894 */ 767 */
895 - int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, Long tenantId) throws DataAccessException; 768 + int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, ID tenantId) throws DataAccessException;
896 769
897 /** 770 /**
898 * Execute a batch using the supplied SQL statement with the batch of supplied arguments. 771 * Execute a batch using the supplied SQL statement with the batch of supplied arguments.
@@ -900,7 +773,7 @@ public interface JdbcTemplateWrapperTenant { @@ -900,7 +773,7 @@ public interface JdbcTemplateWrapperTenant {
900 * @param batchArgs the List of Object arrays containing the batch of arguments for the query 773 * @param batchArgs the List of Object arrays containing the batch of arguments for the query
901 * @return an array containing the numbers of rows affected by each update in the batch 774 * @return an array containing the numbers of rows affected by each update in the batch
902 */ 775 */
903 - int[] batchUpdate(String sql, List<Object[]> batchArgs, Long tenantId) throws DataAccessException; 776 + int[] batchUpdate(String sql, List<Object[]> batchArgs, ID tenantId) throws DataAccessException;
904 777
905 /** 778 /**
906 * Execute a batch using the supplied SQL statement with the batch of supplied arguments. 779 * Execute a batch using the supplied SQL statement with the batch of supplied arguments.
@@ -910,7 +783,7 @@ public interface JdbcTemplateWrapperTenant { @@ -910,7 +783,7 @@ public interface JdbcTemplateWrapperTenant {
910 * (constants from {@code java.sql.Types}) 783 * (constants from {@code java.sql.Types})
911 * @return an array containing the numbers of rows affected by each update in the batch 784 * @return an array containing the numbers of rows affected by each update in the batch
912 */ 785 */
913 - int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes, Long tenantId) throws DataAccessException; 786 + int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes, ID tenantId) throws DataAccessException;
914 787
915 /** 788 /**
916 * Execute multiple batches using the supplied SQL statement with the collect of supplied arguments. 789 * Execute multiple batches using the supplied SQL statement with the collect of supplied arguments.
@@ -925,52 +798,6 @@ public interface JdbcTemplateWrapperTenant { @@ -925,52 +798,6 @@ public interface JdbcTemplateWrapperTenant {
925 * @since 3.1 798 * @since 3.1
926 */ 799 */
927 <T> int[][] batchUpdate(String sql, Collection<T> batchArgs, int batchSize, 800 <T> int[][] batchUpdate(String sql, Collection<T> batchArgs, int batchSize,
928 - ParameterizedPreparedStatementSetter<T> pss, Long tenantId) throws DataAccessException;  
929 -  
930 -  
931 - //-------------------------------------------------------------------------  
932 - // Methods dealing with callable statements  
933 - //-------------------------------------------------------------------------  
934 -  
935 - /**  
936 - * Execute a JDBC data access operation, implemented as callback action  
937 - * working on a JDBC CallableStatement. This allows for implementing arbitrary  
938 - * data access operations on a single Statement, within Spring's managed JDBC  
939 - * environment: that is, participating in Spring-managed transactions and  
940 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
941 - * <p>The callback action can return a result object, for example a domain  
942 - * object or a collection of domain objects.  
943 - * @param csc a callback that creates a CallableStatement given a Connection  
944 - * @param action a callback that specifies the action  
945 - * @return a result object returned by the action, or {@code null} if none  
946 - * @throws DataAccessException if there is any problem  
947 - */  
948 - @Nullable  
949 - <T> T execute(CallableStatementCreator csc, CallableStatementCallback<T> action, Long tenantId) throws DataAccessException;  
950 -  
951 - /**  
952 - * Execute a JDBC data access operation, implemented as callback action  
953 - * working on a JDBC CallableStatement. This allows for implementing arbitrary  
954 - * data access operations on a single Statement, within Spring's managed JDBC  
955 - * environment: that is, participating in Spring-managed transactions and  
956 - * converting JDBC SQLExceptions into Spring's DataAccessException hierarchy.  
957 - * <p>The callback action can return a result object, for example a domain  
958 - * object or a collection of domain objects.  
959 - * @param callString the SQL call string to execute  
960 - * @param action a callback that specifies the action  
961 - * @return a result object returned by the action, or {@code null} if none  
962 - * @throws DataAccessException if there is any problem  
963 - */  
964 - @Nullable  
965 - <T> T execute(String callString, CallableStatementCallback<T> action, Long tenantId) throws DataAccessException; 801 + ParameterizedPreparedStatementSetter<T> pss, ID tenantId) throws DataAccessException;
966 802
967 - /**  
968 - * Execute a SQL call using a CallableStatementCreator to provide SQL and  
969 - * any required parameters.  
970 - * @param csc a callback that provides SQL and any necessary parameters  
971 - * @param declaredParameters list of declared SqlParameter objects  
972 - * @return a Map of extracted out parameters  
973 - * @throws DataAccessException if there is any problem issuing the update  
974 - */  
975 - Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters, Long tenantId) throws DataAccessException;  
976 } 803 }
src/main/java/com/taover/repository/jdbctemplate/JdbcTemplateWrapperTenantImpl.java
1 package com.taover.repository.jdbctemplate; 1 package com.taover.repository.jdbctemplate;
2 2
  3 +import java.io.Serializable;
3 import java.util.Collection; 4 import java.util.Collection;
4 import java.util.List; 5 import java.util.List;
5 import java.util.Map; 6 import java.util.Map;
6 7
7 -import org.apache.shardingsphere.infra.hint.HintManager;  
8 import org.springframework.dao.DataAccessException; 8 import org.springframework.dao.DataAccessException;
9 import org.springframework.jdbc.core.BatchPreparedStatementSetter; 9 import org.springframework.jdbc.core.BatchPreparedStatementSetter;
10 -import org.springframework.jdbc.core.CallableStatementCallback;  
11 -import org.springframework.jdbc.core.CallableStatementCreator;  
12 -import org.springframework.jdbc.core.ConnectionCallback;  
13 import org.springframework.jdbc.core.JdbcTemplate; 10 import org.springframework.jdbc.core.JdbcTemplate;
14 import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter; 11 import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
15 import org.springframework.jdbc.core.PreparedStatementCallback; 12 import org.springframework.jdbc.core.PreparedStatementCallback;
16 -import org.springframework.jdbc.core.PreparedStatementCreator;  
17 import org.springframework.jdbc.core.PreparedStatementSetter; 13 import org.springframework.jdbc.core.PreparedStatementSetter;
18 import org.springframework.jdbc.core.ResultSetExtractor; 14 import org.springframework.jdbc.core.ResultSetExtractor;
19 import org.springframework.jdbc.core.RowCallbackHandler; 15 import org.springframework.jdbc.core.RowCallbackHandler;
20 import org.springframework.jdbc.core.RowMapper; 16 import org.springframework.jdbc.core.RowMapper;
21 -import org.springframework.jdbc.core.SqlParameter;  
22 -import org.springframework.jdbc.core.StatementCallback;  
23 -import org.springframework.jdbc.support.KeyHolder;  
24 import org.springframework.jdbc.support.rowset.SqlRowSet; 17 import org.springframework.jdbc.support.rowset.SqlRowSet;
25 18
26 -import com.taover.repository.shardingsphere.ShardingInfoEntity;  
27 -import com.taover.repository.shardingsphere.ShardingSphereService; 19 +import com.taover.repository.exception.NoContainTenantException;
28 20
29 -public class JdbcTemplateWrapperTenantImpl implements JdbcTemplateWrapperTenant { 21 +public class JdbcTemplateWrapperTenantImpl<ID extends Serializable> implements JdbcTemplateWrapperTenant<ID> {
30 private JdbcTemplate jdbcTemplate; 22 private JdbcTemplate jdbcTemplate;
31 - private ShardingSphereService shardingSphereService;  
32 -  
33 - public JdbcTemplateWrapperTenantImpl(JdbcTemplate jdbcTemplate, ShardingSphereService shardingSphereService) { 23 + public JdbcTemplateWrapperTenantImpl(JdbcTemplate jdbcTemplate) {
34 this.jdbcTemplate = jdbcTemplate; 24 this.jdbcTemplate = jdbcTemplate;
35 - this.shardingSphereService = shardingSphereService;  
36 } 25 }
37 - 26 +
38 @Override 27 @Override
39 - public void loadShardingInfo(Long tenantId) {  
40 - List<ShardingInfoEntity> shardingInfo = this.shardingSphereService.getShardingInfoByTenantId(tenantId);  
41 - if(shardingInfo == null || shardingInfo.isEmpty()) {  
42 - return;  
43 - }  
44 - HintManager.clear();  
45 - HintManager instance = HintManager.getInstance();  
46 - for(ShardingInfoEntity item: shardingInfo) {  
47 - instance.addTableShardingValue(item.getTableName(), item.getTableSuffix());  
48 - instance.addDatabaseShardingValue(item.getTableName(), item.getDsName());  
49 - } 28 + public void doCheckTenantId(String sql, ID tenantId) throws NoContainTenantException {
  29 +
50 } 30 }
51 31
52 @Override 32 @Override
53 - public void clearShardingInfo() {  
54 - HintManager.clear(); 33 + public JdbcTemplate getJdbcTemplate() {
  34 + return this.jdbcTemplate;
55 } 35 }
56 36
57 @Override 37 @Override
58 - public <E> E execute(ConnectionCallback<E> action, Long tenantId) throws DataAccessException {  
59 - try {  
60 - this.loadShardingInfo(tenantId);  
61 - return this.jdbcTemplate.execute(action);  
62 - }finally {  
63 - this.clearShardingInfo();  
64 - } 38 + public void execute(String sql, ID tenantId) throws DataAccessException {
  39 + this.doCheckTenantId(sql, tenantId);
  40 + this.jdbcTemplate.execute(sql);
65 } 41 }
66 42
67 @Override 43 @Override
68 - public <E> E execute(StatementCallback<E> action, Long tenantId) throws DataAccessException {  
69 - try {  
70 - this.loadShardingInfo(tenantId);  
71 - return this.jdbcTemplate.execute(action);  
72 - }finally {  
73 - this.clearShardingInfo();  
74 - } 44 + public <E> E query(String sql, ResultSetExtractor<E> rse, ID tenantId) throws DataAccessException {
  45 + this.doCheckTenantId(sql, tenantId);
  46 + return this.jdbcTemplate.query(sql, rse);
75 } 47 }
76 48
77 @Override 49 @Override
78 - public void execute(String sql, Long tenantId) throws DataAccessException {  
79 - try {  
80 - this.loadShardingInfo(tenantId);  
81 - this.jdbcTemplate.execute(sql);  
82 - }finally {  
83 - this.clearShardingInfo();  
84 - } 50 + public void query(String sql, RowCallbackHandler rch, ID tenantId) throws DataAccessException {
  51 + this.doCheckTenantId(sql, tenantId);
  52 + this.jdbcTemplate.query(sql, rch);
85 } 53 }
86 54
87 @Override 55 @Override
88 - public <E> E query(String sql, ResultSetExtractor<E> rse, Long tenantId) throws DataAccessException {  
89 - try {  
90 - this.loadShardingInfo(tenantId);  
91 - return this.jdbcTemplate.query(sql, rse);  
92 - }finally {  
93 - this.clearShardingInfo();  
94 - } 56 + public <E> List<E> query(String sql, RowMapper<E> rowMapper, ID tenantId) throws DataAccessException {
  57 + this.doCheckTenantId(sql, tenantId);
  58 + return this.jdbcTemplate.query(sql, rowMapper);
95 } 59 }
96 60
97 @Override 61 @Override
98 - public void query(String sql, RowCallbackHandler rch, Long tenantId) throws DataAccessException {  
99 - try {  
100 - this.loadShardingInfo(tenantId);  
101 - this.jdbcTemplate.query(sql, rch);  
102 - }finally {  
103 - this.clearShardingInfo();  
104 - } 62 + public <E> E queryForObject(String sql, RowMapper<E> rowMapper, ID tenantId) throws DataAccessException {
  63 + this.doCheckTenantId(sql, tenantId);
  64 + return this.jdbcTemplate.queryForObject(sql, rowMapper);
105 } 65 }
106 66
107 @Override 67 @Override
108 - public <E> List<E> query(String sql, RowMapper<E> rowMapper, Long tenantId) throws DataAccessException {  
109 - try {  
110 - this.loadShardingInfo(tenantId);  
111 - return this.jdbcTemplate.query(sql, rowMapper);  
112 - }finally {  
113 - this.clearShardingInfo();  
114 - } 68 + public <E> E queryForObject(String sql, Class<E> requiredType, ID tenantId) throws DataAccessException {
  69 + this.doCheckTenantId(sql, tenantId);
  70 + return this.jdbcTemplate.queryForObject(sql, requiredType);
115 } 71 }
116 72
117 @Override 73 @Override
118 - public <E> E queryForObject(String sql, RowMapper<E> rowMapper, Long tenantId) throws DataAccessException {  
119 - try {  
120 - this.loadShardingInfo(tenantId);  
121 - return this.jdbcTemplate.queryForObject(sql, rowMapper);  
122 - }finally {  
123 - this.clearShardingInfo();  
124 - } 74 + public Map<String, Object> queryForMap(String sql, ID tenantId) throws DataAccessException {
  75 + this.doCheckTenantId(sql, tenantId);
  76 + return this.jdbcTemplate.queryForMap(sql);
125 } 77 }
126 78
127 @Override 79 @Override
128 - public <E> E queryForObject(String sql, Class<E> requiredType, Long tenantId) throws DataAccessException {  
129 - try {  
130 - this.loadShardingInfo(tenantId);  
131 - return this.jdbcTemplate.queryForObject(sql, requiredType);  
132 - }finally {  
133 - this.clearShardingInfo();  
134 - } 80 + public <E> List<E> queryForList(String sql, Class<E> elementType, ID tenantId) throws DataAccessException {
  81 + this.doCheckTenantId(sql, tenantId);
  82 + return this.jdbcTemplate.queryForList(sql, elementType);
135 } 83 }
136 84
137 @Override 85 @Override
138 - public Map<String, Object> queryForMap(String sql, Long tenantId) throws DataAccessException {  
139 - try {  
140 - this.loadShardingInfo(tenantId);  
141 - return this.jdbcTemplate.queryForMap(sql);  
142 - }finally {  
143 - this.clearShardingInfo();  
144 - } 86 + public List<Map<String, Object>> queryForList(String sql, ID tenantId) throws DataAccessException {
  87 + return this.jdbcTemplate.queryForList(sql);
145 } 88 }
146 89
147 @Override 90 @Override
148 - public <E> List<E> queryForList(String sql, Class<E> elementType, Long tenantId) throws DataAccessException {  
149 - try {  
150 - this.loadShardingInfo(tenantId);  
151 - return this.jdbcTemplate.queryForList(sql, elementType);  
152 - }finally {  
153 - this.clearShardingInfo();  
154 - } 91 + public SqlRowSet queryForRowSet(String sql, ID tenantId) throws DataAccessException {
  92 + this.doCheckTenantId(sql, tenantId);
  93 + return this.jdbcTemplate.queryForRowSet(sql);
155 } 94 }
156 95
157 @Override 96 @Override
158 - public List<Map<String, Object>> queryForList(String sql, Long tenantId) throws DataAccessException {  
159 - try {  
160 - this.loadShardingInfo(tenantId);  
161 - return this.jdbcTemplate.queryForList(sql);  
162 - }finally {  
163 - this.clearShardingInfo();  
164 - } 97 + public int update(String sql, ID tenantId) throws DataAccessException {
  98 + return this.jdbcTemplate.update(sql);
165 } 99 }
166 100
167 @Override 101 @Override
168 - public SqlRowSet queryForRowSet(String sql, Long tenantId) throws DataAccessException {  
169 - try {  
170 - this.loadShardingInfo(tenantId);  
171 - return this.jdbcTemplate.queryForRowSet(sql);  
172 - }finally {  
173 - this.clearShardingInfo(); 102 + public int[] batchUpdate(ID tenantId, String... sql) throws DataAccessException {
  103 + for(String item: sql) {
  104 + this.doCheckTenantId(item, tenantId);
174 } 105 }
  106 + return this.jdbcTemplate.batchUpdate(sql);
175 } 107 }
176 108
177 @Override 109 @Override
178 - public int update(String sql, Long tenantId) throws DataAccessException {  
179 - try {  
180 - this.loadShardingInfo(tenantId);  
181 - return this.jdbcTemplate.update(sql);  
182 - }finally {  
183 - this.clearShardingInfo();  
184 - } 110 + public <E> E execute(String sql, PreparedStatementCallback<E> action, ID tenantId) throws DataAccessException {
  111 + this.doCheckTenantId(sql, tenantId);
  112 + return this.jdbcTemplate.execute(sql, action);
185 } 113 }
186 114
187 @Override 115 @Override
188 - public int[] batchUpdate(Long tenantId, String... sql) throws DataAccessException {  
189 - try {  
190 - this.loadShardingInfo(tenantId);  
191 - return this.jdbcTemplate.batchUpdate(sql);  
192 - }finally {  
193 - this.clearShardingInfo();  
194 - }  
195 - }  
196 -  
197 - @Override  
198 - public <E> E execute(PreparedStatementCreator psc, PreparedStatementCallback<E> action, Long tenantId) 116 + public <E> E query(String sql, PreparedStatementSetter pss, ResultSetExtractor<E> rse, ID tenantId)
199 throws DataAccessException { 117 throws DataAccessException {
200 - try {  
201 - this.loadShardingInfo(tenantId);  
202 - return this.jdbcTemplate.execute(psc, action);  
203 - }finally {  
204 - this.clearShardingInfo();  
205 - } 118 + this.doCheckTenantId(sql, tenantId);
  119 + return this.jdbcTemplate.query(sql, pss, rse);
206 } 120 }
207 121
208 @Override 122 @Override
209 - public <E> E execute(String sql, PreparedStatementCallback<E> action, Long tenantId) throws DataAccessException {  
210 - try {  
211 - this.loadShardingInfo(tenantId);  
212 - return this.jdbcTemplate.execute(sql, action);  
213 - }finally {  
214 - this.clearShardingInfo();  
215 - }  
216 - }  
217 -  
218 - @Override  
219 - public <E> E query(PreparedStatementCreator psc, ResultSetExtractor<E> rse, Long tenantId) 123 + public <E> E query(String sql, Object[] args, int[] argTypes, ResultSetExtractor<E> rse, ID tenantId)
220 throws DataAccessException { 124 throws DataAccessException {
221 - try {  
222 - this.loadShardingInfo(tenantId);  
223 - return this.jdbcTemplate.query(psc, rse);  
224 - }finally {  
225 - this.clearShardingInfo();  
226 - } 125 + this.doCheckTenantId(sql, tenantId);
  126 + return this.jdbcTemplate.query(sql, args, argTypes, rse);
227 } 127 }
228 128
229 @Override 129 @Override
230 - public <E> E query(String sql, PreparedStatementSetter pss, ResultSetExtractor<E> rse, Long tenantId)  
231 - throws DataAccessException {  
232 - try {  
233 - this.loadShardingInfo(tenantId);  
234 - return this.jdbcTemplate.query(sql, pss, rse);  
235 - }finally {  
236 - this.clearShardingInfo();  
237 - } 130 + public <E> E query(String sql, Object[] args, ResultSetExtractor<E> rse, ID tenantId) throws DataAccessException {
  131 + this.doCheckTenantId(sql, tenantId);
  132 + return this.jdbcTemplate.query(sql, args, rse);
238 } 133 }
239 134
240 @Override 135 @Override
241 - public <E> E query(String sql, Object[] args, int[] argTypes, ResultSetExtractor<E> rse, Long tenantId) 136 + public <E> E query(String sql, ResultSetExtractor<E> rse, ID tenantId, Object... args)
242 throws DataAccessException { 137 throws DataAccessException {
243 - try {  
244 - this.loadShardingInfo(tenantId);  
245 - return this.jdbcTemplate.query(sql, args, argTypes, rse);  
246 - }finally {  
247 - this.clearShardingInfo();  
248 - }  
249 - }  
250 -  
251 - @Override  
252 - public <E> E query(String sql, Object[] args, ResultSetExtractor<E> rse, Long tenantId) throws DataAccessException {  
253 - try {  
254 - this.loadShardingInfo(tenantId);  
255 - return this.jdbcTemplate.query(sql, args, rse);  
256 - }finally {  
257 - this.clearShardingInfo();  
258 - }  
259 - }  
260 -  
261 - @Override  
262 - public <E> E query(String sql, ResultSetExtractor<E> rse, Long tenantId, Object... args)  
263 - throws DataAccessException {  
264 - try {  
265 - this.loadShardingInfo(tenantId); 138 +
  139 + this.doCheckTenantId(sql, tenantId);
266 return this.jdbcTemplate.query(sql, rse, args); 140 return this.jdbcTemplate.query(sql, rse, args);
267 - }finally {  
268 - this.clearShardingInfo();  
269 - }  
270 - }  
271 -  
272 - @Override  
273 - public void query(PreparedStatementCreator psc, RowCallbackHandler rch, Long tenantId) throws DataAccessException {  
274 - try {  
275 - this.loadShardingInfo(tenantId);  
276 - this.jdbcTemplate.query(psc, rch);  
277 - }finally {  
278 - this.clearShardingInfo();  
279 - }  
280 } 141 }
281 142
282 @Override 143 @Override
283 - public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch, Long tenantId) 144 + public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch, ID tenantId)
284 throws DataAccessException { 145 throws DataAccessException {
285 - try {  
286 - this.loadShardingInfo(tenantId);  
287 - this.jdbcTemplate.query(sql, pss, rch);  
288 - }finally {  
289 - this.clearShardingInfo();  
290 - } 146 + this.doCheckTenantId(sql, tenantId);
  147 + this.jdbcTemplate.query(sql, pss, rch);
291 } 148 }
292 149
293 @Override 150 @Override
294 - public void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, Long tenantId)  
295 - throws DataAccessException {  
296 - try {  
297 - this.loadShardingInfo(tenantId);  
298 - this.jdbcTemplate.query(sql, args, argTypes, rch);  
299 - }finally {  
300 - this.clearShardingInfo();  
301 - } 151 + public void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch, ID tenantId)
  152 + throws DataAccessException {
  153 + this.doCheckTenantId(sql, tenantId);
  154 + this.jdbcTemplate.query(sql, args, argTypes, rch);
302 } 155 }
303 156
304 @Override 157 @Override
305 - public void query(String sql, Object[] args, RowCallbackHandler rch, Long tenantId) throws DataAccessException {  
306 - try {  
307 - this.loadShardingInfo(tenantId);  
308 - this.jdbcTemplate.query(sql, args, rch);  
309 - }finally {  
310 - this.clearShardingInfo();  
311 - } 158 + public void query(String sql, Object[] args, RowCallbackHandler rch, ID tenantId) throws DataAccessException {
  159 + this.doCheckTenantId(sql, tenantId);
  160 + this.jdbcTemplate.query(sql, args, rch);
312 } 161 }
313 162
314 @Override 163 @Override
315 - public void query(String sql, RowCallbackHandler rch, Long tenantId, Object... args) throws DataAccessException {  
316 - try {  
317 - this.loadShardingInfo(tenantId);  
318 - this.jdbcTemplate.query(sql, rch, args);  
319 - }finally {  
320 - this.clearShardingInfo();  
321 - } 164 + public void query(String sql, RowCallbackHandler rch, ID tenantId, Object... args) throws DataAccessException {
  165 + this.doCheckTenantId(sql, tenantId);
  166 + this.jdbcTemplate.query(sql, rch, args);
322 } 167 }
323 168
324 @Override 169 @Override
325 - public <E> List<E> query(PreparedStatementCreator psc, RowMapper<E> rowMapper, Long tenantId) 170 + public <E> List<E> query(String sql, PreparedStatementSetter pss, RowMapper<E> rowMapper, ID tenantId)
326 throws DataAccessException { 171 throws DataAccessException {
327 - try {  
328 - this.loadShardingInfo(tenantId);  
329 - return this.jdbcTemplate.query(psc, rowMapper);  
330 - }finally {  
331 - this.clearShardingInfo();  
332 - } 172 + this.doCheckTenantId(sql, tenantId);
  173 + return this.jdbcTemplate.query(sql, pss, rowMapper);
333 } 174 }
334 175
335 @Override 176 @Override
336 - public <E> List<E> query(String sql, PreparedStatementSetter pss, RowMapper<E> rowMapper, Long tenantId) 177 + public <E> List<E> query(String sql, Object[] args, int[] argTypes, RowMapper<E> rowMapper, ID tenantId)
337 throws DataAccessException { 178 throws DataAccessException {
338 - try {  
339 - this.loadShardingInfo(tenantId);  
340 - return this.jdbcTemplate.query(sql, pss, rowMapper);  
341 - }finally {  
342 - this.clearShardingInfo();  
343 - } 179 + this.doCheckTenantId(sql, tenantId);
  180 + return this.jdbcTemplate.query(sql, args, argTypes, rowMapper);
344 } 181 }
345 182
346 @Override 183 @Override
347 - public <E> List<E> query(String sql, Object[] args, int[] argTypes, RowMapper<E> rowMapper, Long tenantId) 184 + public <E> List<E> query(String sql, Object[] args, RowMapper<E> rowMapper, ID tenantId)
348 throws DataAccessException { 185 throws DataAccessException {
349 - try {  
350 - this.loadShardingInfo(tenantId);  
351 - return this.jdbcTemplate.query(sql, args, argTypes, rowMapper);  
352 - }finally {  
353 - this.clearShardingInfo();  
354 - } 186 + this.doCheckTenantId(sql, tenantId);
  187 + return this.jdbcTemplate.query(sql, args, rowMapper);
355 } 188 }
356 189
357 @Override 190 @Override
358 - public <E> List<E> query(String sql, Object[] args, RowMapper<E> rowMapper, Long tenantId)  
359 - throws DataAccessException {  
360 - try {  
361 - this.loadShardingInfo(tenantId);  
362 - return this.jdbcTemplate.query(sql, args, rowMapper);  
363 - }finally {  
364 - this.clearShardingInfo();  
365 - } 191 + public <E> List<E> query(String sql, RowMapper<E> rowMapper, ID tenantId, Object... args)
  192 + throws DataAccessException {
  193 + this.doCheckTenantId(sql, tenantId);
  194 + return this.jdbcTemplate.query(sql, rowMapper, args);
366 } 195 }
367 196
368 @Override 197 @Override
369 - public <E> List<E> query(String sql, RowMapper<E> rowMapper, Long tenantId, Object... args)  
370 - throws DataAccessException {  
371 - try {  
372 - this.loadShardingInfo(tenantId);  
373 - return this.jdbcTemplate.query(sql, rowMapper, args);  
374 - }finally {  
375 - this.clearShardingInfo();  
376 - } 198 + public <E> E queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<E> rowMapper, ID tenantId)
  199 + throws DataAccessException {
  200 + this.doCheckTenantId(sql, tenantId);
  201 + return this.jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper);
377 } 202 }
378 203
379 @Override 204 @Override
380 - public <E> E queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<E> rowMapper, Long tenantId) 205 + public <E> E queryForObject(String sql, Object[] args, RowMapper<E> rowMapper, ID tenantId)
381 throws DataAccessException { 206 throws DataAccessException {
382 - try {  
383 - this.loadShardingInfo(tenantId);  
384 - return this.jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper);  
385 - }finally {  
386 - this.clearShardingInfo();  
387 - } 207 + this.doCheckTenantId(sql, tenantId);
  208 + return this.jdbcTemplate.queryForObject(sql, args, rowMapper);
388 } 209 }
389 210
390 @Override 211 @Override
391 - public <E> E queryForObject(String sql, Object[] args, RowMapper<E> rowMapper, Long tenantId) 212 + public <E> E queryForObject(String sql, RowMapper<E> rowMapper, ID tenantId, Object... args)
392 throws DataAccessException { 213 throws DataAccessException {
393 - try {  
394 - this.loadShardingInfo(tenantId);  
395 - return this.jdbcTemplate.queryForObject(sql, args, rowMapper);  
396 - }finally {  
397 - this.clearShardingInfo();  
398 - } 214 + this.doCheckTenantId(sql, tenantId);
  215 + return this.jdbcTemplate.queryForObject(sql, rowMapper, args);
399 } 216 }
400 217
401 @Override 218 @Override
402 - public <E> E queryForObject(String sql, RowMapper<E> rowMapper, Long tenantId, Object... args)  
403 - throws DataAccessException {  
404 - try {  
405 - this.loadShardingInfo(tenantId);  
406 - return this.jdbcTemplate.queryForObject(sql, rowMapper, args);  
407 - }finally {  
408 - this.clearShardingInfo();  
409 - }  
410 - }  
411 -  
412 - @Override  
413 - public <E> E queryForObject(String sql, Object[] args, int[] argTypes, Class<E> requiredType, Long tenantId)  
414 - throws DataAccessException {  
415 - try {  
416 - this.loadShardingInfo(tenantId);  
417 - return this.jdbcTemplate.queryForObject(sql, args, argTypes, requiredType);  
418 - }finally {  
419 - this.clearShardingInfo();  
420 - }  
421 - }  
422 -  
423 - @Override  
424 - public <E> E queryForObject(String sql, Object[] args, Class<E> requiredType, Long tenantId)  
425 - throws DataAccessException {  
426 - try {  
427 - this.loadShardingInfo(tenantId);  
428 - return this.jdbcTemplate.queryForObject(sql, args, requiredType);  
429 - }finally {  
430 - this.clearShardingInfo();  
431 - }  
432 - }  
433 -  
434 - @Override  
435 - public <E> E queryForObject(String sql, Class<E> requiredType, Long tenantId, Object... args)  
436 - throws DataAccessException {  
437 - try {  
438 - this.loadShardingInfo(tenantId);  
439 - return this.jdbcTemplate.queryForObject(sql, requiredType, args);  
440 - }finally {  
441 - this.clearShardingInfo();  
442 - } 219 + public <E> E queryForObject(String sql, Object[] args, int[] argTypes, Class<E> requiredType, ID tenantId)
  220 + throws DataAccessException {
  221 + this.doCheckTenantId(sql, tenantId);
  222 + return this.jdbcTemplate.queryForObject(sql, args, argTypes, requiredType);
443 } 223 }
444 224
445 @Override 225 @Override
446 - public Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes, Long tenantId)  
447 - throws DataAccessException {  
448 - try {  
449 - this.loadShardingInfo(tenantId);  
450 - return this.jdbcTemplate.queryForMap(sql, args, argTypes);  
451 - }finally {  
452 - this.clearShardingInfo();  
453 - } 226 + public <E> E queryForObject(String sql, Object[] args, Class<E> requiredType, ID tenantId)
  227 + throws DataAccessException {
  228 + this.doCheckTenantId(sql, tenantId);
  229 + return this.jdbcTemplate.queryForObject(sql, args, requiredType);
454 } 230 }
455 231
456 @Override 232 @Override
457 - public Map<String, Object> queryForMap(String sql, Long tenantId, Object... args) throws DataAccessException {  
458 - try {  
459 - this.loadShardingInfo(tenantId);  
460 - return this.jdbcTemplate.queryForMap(sql, args);  
461 - }finally {  
462 - this.clearShardingInfo();  
463 - } 233 + public <E> E queryForObject(String sql, Class<E> requiredType, ID tenantId, Object... args)
  234 + throws DataAccessException {
  235 + this.doCheckTenantId(sql, tenantId);
  236 + return this.jdbcTemplate.queryForObject(sql, requiredType, args);
464 } 237 }
465 238
466 @Override 239 @Override
467 - public <E> List<E> queryForList(String sql, Object[] args, int[] argTypes, Class<E> elementType, Long tenantId) 240 + public Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes, ID tenantId)
468 throws DataAccessException { 241 throws DataAccessException {
469 - try {  
470 - this.loadShardingInfo(tenantId);  
471 - return this.jdbcTemplate.queryForList(sql, args, argTypes, elementType);  
472 - }finally {  
473 - this.clearShardingInfo();  
474 - } 242 + this.doCheckTenantId(sql, tenantId);
  243 + return this.jdbcTemplate.queryForMap(sql, args, argTypes);
475 } 244 }
476 245
477 @Override 246 @Override
478 - public <E> List<E> queryForList(String sql, Object[] args, Class<E> elementType, Long tenantId)  
479 - throws DataAccessException {  
480 - try {  
481 - this.loadShardingInfo(tenantId);  
482 - return this.jdbcTemplate.queryForList(sql, args, elementType);  
483 - }finally {  
484 - this.clearShardingInfo();  
485 - } 247 + public Map<String, Object> queryForMap(String sql, ID tenantId, Object... args) throws DataAccessException {
  248 + this.doCheckTenantId(sql, tenantId);
  249 + return this.jdbcTemplate.queryForMap(sql, args);
486 } 250 }
487 251
488 @Override 252 @Override
489 - public <E> List<E> queryForList(String sql, Class<E> elementType, Long tenantId, Object... args)  
490 - throws DataAccessException {  
491 - try {  
492 - this.loadShardingInfo(tenantId);  
493 - return this.jdbcTemplate.queryForList(sql, elementType, args);  
494 - }finally {  
495 - this.clearShardingInfo();  
496 - } 253 + public <E> List<E> queryForList(String sql, Object[] args, int[] argTypes, Class<E> elementType, ID tenantId)
  254 + throws DataAccessException {
  255 + this.doCheckTenantId(sql, tenantId);
  256 + return this.jdbcTemplate.queryForList(sql, args, argTypes, elementType);
497 } 257 }
498 258
499 @Override 259 @Override
500 - public List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes, Long tenantId)  
501 - throws DataAccessException {  
502 - try {  
503 - this.loadShardingInfo(tenantId);  
504 - return this.jdbcTemplate.queryForList(sql, args, argTypes);  
505 - }finally {  
506 - this.clearShardingInfo();  
507 - } 260 + public <E> List<E> queryForList(String sql, Object[] args, Class<E> elementType, ID tenantId)
  261 + throws DataAccessException {
  262 + this.doCheckTenantId(sql, tenantId);
  263 + return this.jdbcTemplate.queryForList(sql, args, elementType);
508 } 264 }
509 265
510 @Override 266 @Override
511 - public List<Map<String, Object>> queryForList(String sql, Long tenantId, Object... args) 267 + public <E> List<E> queryForList(String sql, Class<E> elementType, ID tenantId, Object... args)
512 throws DataAccessException { 268 throws DataAccessException {
513 - try {  
514 - this.loadShardingInfo(tenantId);  
515 - return this.jdbcTemplate.queryForList(sql, args);  
516 - }finally {  
517 - this.clearShardingInfo();  
518 - } 269 + this.doCheckTenantId(sql, tenantId);
  270 + return this.jdbcTemplate.queryForList(sql, elementType, args);
519 } 271 }
520 272
521 @Override 273 @Override
522 - public SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, Long tenantId) 274 + public List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes, ID tenantId)
523 throws DataAccessException { 275 throws DataAccessException {
524 - try {  
525 - this.loadShardingInfo(tenantId);  
526 - return this.jdbcTemplate.queryForRowSet(sql, args, argTypes);  
527 - }finally {  
528 - this.clearShardingInfo();  
529 - } 276 + this.doCheckTenantId(sql, tenantId);
  277 + return this.jdbcTemplate.queryForList(sql, args, argTypes);
530 } 278 }
531 279
532 @Override 280 @Override
533 - public SqlRowSet queryForRowSet(String sql, Long tenantId, Object... args) throws DataAccessException {  
534 - try {  
535 - this.loadShardingInfo(tenantId);  
536 - return this.jdbcTemplate.queryForRowSet(sql, args);  
537 - }finally {  
538 - this.clearShardingInfo();  
539 - } 281 + public List<Map<String, Object>> queryForList(String sql, ID tenantId, Object... args)
  282 + throws DataAccessException {
  283 + this.doCheckTenantId(sql, tenantId);
  284 + return this.jdbcTemplate.queryForList(sql, args);
540 } 285 }
541 286
542 @Override 287 @Override
543 - public int update(PreparedStatementCreator psc, Long tenantId) throws DataAccessException {  
544 - try {  
545 - this.loadShardingInfo(tenantId);  
546 - return this.jdbcTemplate.update(psc);  
547 - }finally {  
548 - this.clearShardingInfo();  
549 - } 288 + public SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes, ID tenantId)
  289 + throws DataAccessException {
  290 + this.doCheckTenantId(sql, tenantId);
  291 + return this.jdbcTemplate.queryForRowSet(sql, args, argTypes);
550 } 292 }
551 293
552 @Override 294 @Override
553 - public int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder, Long tenantId)  
554 - throws DataAccessException {  
555 - try {  
556 - this.loadShardingInfo(tenantId);  
557 - return this.jdbcTemplate.update(psc, generatedKeyHolder);  
558 - }finally {  
559 - this.clearShardingInfo();  
560 - } 295 + public SqlRowSet queryForRowSet(String sql, ID tenantId, Object... args) throws DataAccessException {
  296 + this.doCheckTenantId(sql, tenantId);
  297 + return this.jdbcTemplate.queryForRowSet(sql, args);
561 } 298 }
562 299
563 @Override 300 @Override
564 - public int update(String sql, PreparedStatementSetter pss, Long tenantId) throws DataAccessException {  
565 - try {  
566 - this.loadShardingInfo(tenantId);  
567 - return this.jdbcTemplate.update(sql, pss);  
568 - }finally {  
569 - this.clearShardingInfo();  
570 - } 301 + public int update(String sql, PreparedStatementSetter pss, ID tenantId) throws DataAccessException {
  302 + this.doCheckTenantId(sql, tenantId);
  303 + return this.jdbcTemplate.update(sql, pss);
571 } 304 }
572 305
573 @Override 306 @Override
574 - public int update(String sql, Object[] args, int[] argTypes, Long tenantId) throws DataAccessException {  
575 - try {  
576 - this.loadShardingInfo(tenantId);  
577 - return this.jdbcTemplate.update(sql, args, argTypes);  
578 - }finally {  
579 - this.clearShardingInfo();  
580 - } 307 + public int update(String sql, Object[] args, int[] argTypes, ID tenantId) throws DataAccessException {
  308 + this.doCheckTenantId(sql, tenantId);
  309 + return this.jdbcTemplate.update(sql, args, argTypes);
581 } 310 }
582 311
583 @Override 312 @Override
584 - public int update(String sql, Long tenantId, Object... args) throws DataAccessException {  
585 - try {  
586 - this.loadShardingInfo(tenantId);  
587 - return this.jdbcTemplate.update(sql, args);  
588 - }finally {  
589 - this.clearShardingInfo();  
590 - } 313 + public int update(String sql, ID tenantId, Object... args) throws DataAccessException {
  314 + this.doCheckTenantId(sql, tenantId);
  315 + return this.jdbcTemplate.update(sql, args);
591 } 316 }
592 317
593 @Override 318 @Override
594 - public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, Long tenantId) throws DataAccessException {  
595 - try {  
596 - this.loadShardingInfo(tenantId);  
597 - return this.jdbcTemplate.batchUpdate(sql, pss);  
598 - }finally {  
599 - this.clearShardingInfo();  
600 - } 319 + public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss, ID tenantId) throws DataAccessException {
  320 + this.doCheckTenantId(sql, tenantId);
  321 + return this.jdbcTemplate.batchUpdate(sql, pss);
601 } 322 }
602 323
603 @Override 324 @Override
604 - public int[] batchUpdate(String sql, List<Object[]> batchArgs, Long tenantId) throws DataAccessException {  
605 - try {  
606 - this.loadShardingInfo(tenantId);  
607 - return this.jdbcTemplate.batchUpdate(sql, batchArgs);  
608 - }finally {  
609 - this.clearShardingInfo();  
610 - } 325 + public int[] batchUpdate(String sql, List<Object[]> batchArgs, ID tenantId) throws DataAccessException {
  326 + this.doCheckTenantId(sql, tenantId);
  327 + return this.jdbcTemplate.batchUpdate(sql, batchArgs);
611 } 328 }
612 329
613 @Override 330 @Override
614 - public int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes, Long tenantId)  
615 - throws DataAccessException {  
616 - try {  
617 - this.loadShardingInfo(tenantId);  
618 - return this.jdbcTemplate.batchUpdate(sql, batchArgs);  
619 - }finally {  
620 - this.clearShardingInfo();  
621 - } 331 + public int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes, ID tenantId)
  332 + throws DataAccessException {
  333 + this.doCheckTenantId(sql, tenantId);
  334 + return this.jdbcTemplate.batchUpdate(sql, batchArgs);
622 } 335 }
623 336
624 @Override 337 @Override
625 public <E> int[][] batchUpdate(String sql, Collection<E> batchArgs, int batchSize, 338 public <E> int[][] batchUpdate(String sql, Collection<E> batchArgs, int batchSize,
626 - ParameterizedPreparedStatementSetter<E> pss, Long tenantId) throws DataAccessException {  
627 - try {  
628 - this.loadShardingInfo(tenantId);  
629 - return this.jdbcTemplate.batchUpdate(sql, batchArgs, batchSize, pss);  
630 - }finally {  
631 - this.clearShardingInfo();  
632 - }  
633 - }  
634 -  
635 - @Override  
636 - public <E> E execute(CallableStatementCreator csc, CallableStatementCallback<E> action, Long tenantId)  
637 - throws DataAccessException {  
638 - try {  
639 - this.loadShardingInfo(tenantId);  
640 - return this.jdbcTemplate.execute(csc, action);  
641 - }finally {  
642 - this.clearShardingInfo();  
643 - }  
644 - }  
645 -  
646 - @Override  
647 - public <E> E execute(String callString, CallableStatementCallback<E> action, Long tenantId)  
648 - throws DataAccessException {  
649 - try {  
650 - this.loadShardingInfo(tenantId);  
651 - return this.jdbcTemplate.execute(callString, action);  
652 - }finally {  
653 - this.clearShardingInfo();  
654 - }  
655 - }  
656 -  
657 - @Override  
658 - public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters, Long tenantId)  
659 - throws DataAccessException {  
660 - try {  
661 - this.loadShardingInfo(tenantId);  
662 - return this.jdbcTemplate.call(csc, declaredParameters);  
663 - }finally {  
664 - this.clearShardingInfo();  
665 - } 339 + ParameterizedPreparedStatementSetter<E> pss, ID tenantId) throws DataAccessException {
  340 + this.doCheckTenantId(sql, tenantId);
  341 + return this.jdbcTemplate.batchUpdate(sql, batchArgs, batchSize, pss);
666 } 342 }
667 } 343 }
src/main/java/com/taover/repository/mapper/CustomJdbcTemplateRowMapper.java
1 package com.taover.repository.mapper; 1 package com.taover.repository.mapper;
2 2
3 import java.lang.reflect.Field; 3 import java.lang.reflect.Field;
4 -import java.lang.reflect.Method;  
5 import java.sql.ResultSet; 4 import java.sql.ResultSet;
6 import java.sql.SQLException; 5 import java.sql.SQLException;
7 import java.util.HashMap; 6 import java.util.HashMap;
@@ -15,10 +14,7 @@ import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSetMetaDat @@ -15,10 +14,7 @@ import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSetMetaDat
15 public class CustomJdbcTemplateRowMapper <E> implements RowMapper<E>{ 14 public class CustomJdbcTemplateRowMapper <E> implements RowMapper<E>{
16 Log log = LogFactory.getLog(this.getClass()); 15 Log log = LogFactory.getLog(this.getClass());
17 16
18 - private Map<String, Field> beanFielNameToField = new HashMap<String, Field>();  
19 - private Method beforeMethod = null;  
20 - private Method afterMethod = null;  
21 - 17 + private Map<String, Field> beanFielNameToField = new HashMap<String, Field>();
22 private Class<E> classInfo; 18 private Class<E> classInfo;
23 private Map<String, String> tableToBeanMap; 19 private Map<String, String> tableToBeanMap;
24 20
@@ -30,36 +26,11 @@ public class CustomJdbcTemplateRowMapper &lt;E&gt; implements RowMapper&lt;E&gt;{ @@ -30,36 +26,11 @@ public class CustomJdbcTemplateRowMapper &lt;E&gt; implements RowMapper&lt;E&gt;{
30 for(Field item: fields) { 26 for(Field item: fields) {
31 try { 27 try {
32 item.setAccessible(true); 28 item.setAccessible(true);
33 - this.beanFielNameToField.put(item.getName(), item); 29 + this.beanFielNameToField.put(item.getName(), item);
34 }catch (Exception e) { 30 }catch (Exception e) {
35 log.error("set field accessible:"+e.getMessage()); 31 log.error("set field accessible:"+e.getMessage());
36 } 32 }
37 } 33 }
38 -  
39 - boolean hasImplementPointCut = false;  
40 - Class[] interfaceArr = this.classInfo.getInterfaces();  
41 - for(int i=0; i<interfaceArr.length; ++i){  
42 - if(interfaceArr[i].getName().equals("com.taover.repository.advice.EntityPointCut")){  
43 - hasImplementPointCut = true;  
44 - break;  
45 - }  
46 - }  
47 -  
48 - if(hasImplementPointCut){  
49 - try{  
50 - beforeMethod = this.classInfo.getDeclaredMethod("before");  
51 - beforeMethod.setAccessible(true);  
52 - }catch(Exception e){  
53 - log.error("set before method exception:"+e.getMessage());  
54 - }  
55 -  
56 - try{  
57 - afterMethod = this.classInfo.getDeclaredMethod("after");  
58 - afterMethod.setAccessible(true);  
59 - }catch(Exception e){  
60 - log.error("set after method exception:"+e.getMessage());  
61 - }  
62 - }  
63 } 34 }
64 35
65 @Override 36 @Override
@@ -71,14 +42,6 @@ public class CustomJdbcTemplateRowMapper &lt;E&gt; implements RowMapper&lt;E&gt;{ @@ -71,14 +42,6 @@ public class CustomJdbcTemplateRowMapper &lt;E&gt; implements RowMapper&lt;E&gt;{
71 throw new RuntimeException(e); 42 throw new RuntimeException(e);
72 } 43 }
73 44
74 - if(this.beforeMethod != null){  
75 - try{  
76 - beforeMethod.invoke(targetObj);  
77 - }catch(Exception e){  
78 - log.error("invoke before exception:"+e.getMessage());  
79 - }  
80 - }  
81 -  
82 ResultSetWrappingSqlRowSetMetaData wapping = new ResultSetWrappingSqlRowSetMetaData(rs.getMetaData()); 45 ResultSetWrappingSqlRowSetMetaData wapping = new ResultSetWrappingSqlRowSetMetaData(rs.getMetaData());
83 int columnCount = wapping.getColumnCount(); 46 int columnCount = wapping.getColumnCount();
84 for (int i = 1; i<=columnCount; i++) { 47 for (int i = 1; i<=columnCount; i++) {
@@ -112,14 +75,6 @@ public class CustomJdbcTemplateRowMapper &lt;E&gt; implements RowMapper&lt;E&gt;{ @@ -112,14 +75,6 @@ public class CustomJdbcTemplateRowMapper &lt;E&gt; implements RowMapper&lt;E&gt;{
112 } 75 }
113 } 76 }
114 77
115 - if(this.afterMethod != null){  
116 - try {  
117 - afterMethod.invoke(targetObj);  
118 - }catch (Exception e) {  
119 - log.error("invoke after exception:"+e.getMessage());  
120 - }  
121 - }  
122 -  
123 return targetObj; 78 return targetObj;
124 } 79 }
125 } 80 }
src/main/java/com/taover/repository/shardingsphere/ShardingDatabaseAlgorithmHint.java
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -  
3 -import java.util.Collection;  
4 -import java.util.HashSet;  
5 -import java.util.Properties;  
6 -import java.util.Set;  
7 -  
8 -import org.apache.commons.logging.Log;  
9 -import org.apache.commons.logging.LogFactory;  
10 -import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm;  
11 -import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingValue;  
12 -  
13 -public class ShardingDatabaseAlgorithmHint implements HintShardingAlgorithm<String> {  
14 - Log log = LogFactory.getLog(ShardingDatabaseAlgorithmHint.class);  
15 - Properties prop = null;  
16 -  
17 - public ShardingDatabaseAlgorithmHint() { }  
18 -  
19 - @Override  
20 - public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<String> shardingValue) {  
21 - Collection<String> values = shardingValue.getValues();  
22 - if(values == null || values.isEmpty()) {  
23 - String message = shardingValue.getLogicTableName()+"已启用分库分表,SQL语句请指定tenant_id 或 使用封装好的DAO层方法";  
24 - log.error(message);  
25 - throw new RuntimeException(message);  
26 - }  
27 - Set<String> result = new HashSet<String>(1);  
28 - for(String item: shardingValue.getValues()) {  
29 - result.add(item);  
30 - }  
31 - return result;  
32 - }  
33 -  
34 - @Override  
35 - public String getType() {  
36 - return "DATABASE-HINT";  
37 - }  
38 -  
39 - @Override  
40 - public Properties getProps() {  
41 - return this.prop;  
42 - }  
43 -  
44 - @Override  
45 - public void setProps(Properties props) {  
46 - this.prop = props;  
47 - }  
48 -  
49 - @Override  
50 - public void init() {  
51 - System.out.print("ShardingDatabaseAlgorithmHint:init");  
52 - }  
53 -}  
src/main/java/com/taover/repository/shardingsphere/ShardingInfoEntity.java
@@ -1,119 +0,0 @@ @@ -1,119 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -  
3 -import java.io.Serializable;  
4 -import java.math.BigDecimal;  
5 -import java.sql.Timestamp;  
6 -import java.util.Date;  
7 -  
8 -import javax.persistence.Entity;  
9 -import javax.persistence.Table;  
10 -import javax.persistence.Id;  
11 -import javax.persistence.Column;  
12 -  
13 -/**  
14 - * @version 1.0.0  
15 - */  
16 -@Entity  
17 -@Table(name="sharding_info", catalog="")  
18 -public class ShardingInfoEntity implements Serializable {  
19 -  
20 - private static final long serialVersionUID = 1L;  
21 -  
22 -  
23 - /**  
24 - *  
25 - */  
26 - @Id  
27 - @Column(name="id")  
28 - private java.lang.Long id;  
29 -  
30 - public java.lang.Long getId(){  
31 - return id;  
32 - }  
33 - public void setId(java.lang.Long id){  
34 - this.id = id;  
35 - }  
36 -  
37 - /**  
38 - * 表名  
39 - */  
40 - @Column(name="table_name")  
41 - private java.lang.String tableName;  
42 -  
43 - public java.lang.String getTableName(){  
44 - return tableName;  
45 - }  
46 - public void setTableName(java.lang.String tableName){  
47 - this.tableName = tableName;  
48 - }  
49 -  
50 - /**  
51 - * 租户ID  
52 - */  
53 - @Column(name="tenant_id")  
54 - private java.lang.Long tenantId;  
55 -  
56 - public java.lang.Long getTenantId(){  
57 - return tenantId;  
58 - }  
59 - public void setTenantId(java.lang.Long tenantId){  
60 - this.tenantId = tenantId;  
61 - }  
62 -  
63 - /**  
64 - * 表后缀  
65 - */  
66 - @Column(name="table_suffix")  
67 - private java.lang.String tableSuffix;  
68 -  
69 - public java.lang.String getTableSuffix(){  
70 - return tableSuffix;  
71 - }  
72 - public void setTableSuffix(java.lang.String tableSuffix){  
73 - this.tableSuffix = tableSuffix;  
74 - }  
75 -  
76 - /**  
77 - *  
78 - */  
79 - @Column(name="create_time")  
80 - private java.sql.Timestamp createTime;  
81 -  
82 - public java.sql.Timestamp getCreateTime(){  
83 - return createTime;  
84 - }  
85 - public void setCreateTime(java.sql.Timestamp createTime){  
86 - this.createTime = createTime;  
87 - }  
88 -  
89 - /**  
90 - *  
91 - */  
92 - @Column(name="update_time")  
93 - private java.sql.Timestamp updateTime;  
94 -  
95 - public java.sql.Timestamp getUpdateTime(){  
96 - return updateTime;  
97 - }  
98 - public void setUpdateTime(java.sql.Timestamp updateTime){  
99 - this.updateTime = updateTime;  
100 - }  
101 -  
102 - /**  
103 - * 数据库 后缀  
104 - */  
105 - @Column(name="ds_name")  
106 - private java.lang.String dsName;  
107 -  
108 - public java.lang.String getDsName(){  
109 - return dsName;  
110 - }  
111 - public void setDsName(java.lang.String dsName){  
112 - this.dsName = dsName;  
113 - }  
114 -  
115 - @Override  
116 - public String toString() {  
117 - return "ShardingInfoEntity: [id="+id+",tableName="+tableName+",tenantId="+tenantId+",tableSuffix="+tableSuffix+",createTime="+createTime+",updateTime="+updateTime+",dsName="+dsName+"]";  
118 - }  
119 - }  
src/main/java/com/taover/repository/shardingsphere/ShardingInfoRepository.java
@@ -1,11 +0,0 @@ @@ -1,11 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -  
3 -import com.taover.repository.CustomJdbcTemplate;  
4 -  
5 -public class ShardingInfoRepository extends CustomJdbcTemplate<ShardingInfoEntity, Long>{  
6 -  
7 - public ShardingInfoRepository() throws Exception {  
8 - super();  
9 - }  
10 -  
11 -}  
src/main/java/com/taover/repository/shardingsphere/ShardingKeyGeneratorExt.java
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -  
3 -import java.util.List;  
4 -  
5 -import com.taover.repository.autoconfigure.ShardingSphereKeyGeneratorConfiguration;  
6 -  
7 -public interface ShardingKeyGeneratorExt {  
8 - /**  
9 - * 生成ID List  
10 - * @param shardingOffset 分片索引  
11 - * @param genNum 生成数量  
12 - * @return  
13 - */  
14 - List<Long> generateKeyList(int genNum);  
15 -  
16 - /**  
17 - * 设置属性值  
18 - * @param config  
19 - */  
20 - void loalConfig(ShardingSphereKeyGeneratorConfiguration config);  
21 -}  
src/main/java/com/taover/repository/shardingsphere/ShardingKeyGeneratorImpl.java
@@ -1,217 +0,0 @@ @@ -1,217 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -/*  
3 - * Licensed to the Apache Software Foundation (ASF) under one or more  
4 - * contributor license agreements. See the NOTICE file distributed with  
5 - * this work for additional information regarding copyright ownership.  
6 - * The ASF licenses this file to You under the Apache License, Version 2.0  
7 - * (the "License"); you may not use this file except in compliance with  
8 - * the License. You may obtain a copy of the License at  
9 - *  
10 - * http://www.apache.org/licenses/LICENSE-2.0  
11 - *  
12 - * Unless required by applicable law or agreed to in writing, software  
13 - * distributed under the License is distributed on an "AS IS" BASIS,  
14 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
15 - * See the License for the specific language governing permissions and  
16 - * limitations under the License.  
17 - */  
18 -  
19 -import java.util.ArrayList;  
20 -import java.util.Calendar;  
21 -import java.util.List;  
22 -import java.util.Properties;  
23 -  
24 -import org.apache.shardingsphere.sharding.algorithm.keygen.TimeService;  
25 -import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;  
26 -  
27 -import com.google.common.base.Preconditions;  
28 -import com.taover.repository.autoconfigure.ShardingSphereKeyGeneratorConfiguration;  
29 -  
30 -/**  
31 - * Snowflake distributed primary key generator.  
32 - *  
33 - * <p>  
34 - * Use snowflake algorithm. Length is 64 bit.  
35 - * </p>  
36 - *  
37 - * <pre>  
38 - * 1bit sign bit.  
39 - * 41bits timestamp offset from 2016.11.01(ShardingSphere distributed primary key published data) to now.  
40 - * 10bits worker process id.  
41 - * 12bits auto increment offset in one mills  
42 - * </pre>  
43 - *  
44 - * <p>  
45 - * Call @{@code SnowflakeShardingKeyGenerator.setWorkerId} to set worker id, default value is 0.  
46 - * </p>  
47 - *  
48 - * <p>  
49 - * Call @{@code SnowflakeShardingKeyGenerator.setMaxTolerateTimeDifferenceMilliseconds} to set max tolerate time difference milliseconds, default value is 0.  
50 - * </p>  
51 - */  
52 -public final class ShardingKeyGeneratorImpl implements KeyGenerateAlgorithm, ShardingKeyGeneratorExt {  
53 -  
54 - public static final long EPOCH;  
55 -  
56 - private static final long SEQUENCE_BITS = 11L;  
57 -  
58 - private static final long BATCH_FLAG_BITS = 1L;  
59 -  
60 - private static final long WORKER_ID_BITS = 10L;  
61 -  
62 - private static final long SEQUENCE_MASK = (1 << SEQUENCE_BITS) - 1;  
63 -  
64 - private static final long BATCH_FLAG_LEFT_SHIFT_BITS = SEQUENCE_BITS;  
65 -  
66 - private static final long WORKER_ID_LEFT_SHIFT_BITS = BATCH_FLAG_LEFT_SHIFT_BITS + BATCH_FLAG_BITS;  
67 -  
68 - private static final long TIMESTAMP_LEFT_SHIFT_BITS = WORKER_ID_LEFT_SHIFT_BITS + WORKER_ID_BITS;  
69 -  
70 - private static final long WORKER_ID_MAX_VALUE = 1L << WORKER_ID_BITS;  
71 -  
72 - private static final long WORKER_ID = 0;  
73 -  
74 - private static final int DEFAULT_VIBRATION_VALUE = 1;  
75 -  
76 - private static final int MAX_TOLERATE_TIME_DIFFERENCE_MILLISECONDS = 10;  
77 -  
78 - private static TimeService timeService = new TimeService();  
79 -  
80 - private Properties properties = new Properties();  
81 -  
82 - private int sequenceOffset = -1;  
83 -  
84 - private long sequence;  
85 -  
86 - private long lastMilliseconds;  
87 -  
88 - static {  
89 - Calendar calendar = Calendar.getInstance();  
90 - calendar.set(2016, Calendar.NOVEMBER, 1);  
91 - calendar.set(Calendar.HOUR_OF_DAY, 0);  
92 - calendar.set(Calendar.MINUTE, 0);  
93 - calendar.set(Calendar.SECOND, 0);  
94 - calendar.set(Calendar.MILLISECOND, 0);  
95 - EPOCH = calendar.getTimeInMillis();  
96 - }  
97 -  
98 - @Override  
99 - public String getType() {  
100 - return "SNOWFLAKE-SELF";  
101 - }  
102 -  
103 - @Override  
104 - public synchronized Comparable<?> generateKey() {  
105 - long currentMilliseconds = timeService.getCurrentMillis();  
106 - if (waitTolerateTimeDifferenceIfNeed(currentMilliseconds)) {  
107 - currentMilliseconds = timeService.getCurrentMillis();  
108 - }  
109 - if (lastMilliseconds == currentMilliseconds) {  
110 - if (0L == (sequence = (sequence + 1) & SEQUENCE_MASK)) {  
111 - currentMilliseconds = waitUntilNextTime(currentMilliseconds);  
112 - }  
113 - } else {  
114 - vibrateSequenceOffset();  
115 - sequence = sequenceOffset;  
116 - }  
117 - lastMilliseconds = currentMilliseconds;  
118 - return ((currentMilliseconds - EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (getWorkerId() << WORKER_ID_LEFT_SHIFT_BITS) | (0 << BATCH_FLAG_LEFT_SHIFT_BITS) | sequence;  
119 - }  
120 -  
121 - private boolean waitTolerateTimeDifferenceIfNeed(final long currentMilliseconds) {  
122 - if (lastMilliseconds <= currentMilliseconds) {  
123 - return false;  
124 - }  
125 - long timeDifferenceMilliseconds = lastMilliseconds - currentMilliseconds;  
126 - Preconditions.checkState(timeDifferenceMilliseconds < getMaxTolerateTimeDifferenceMilliseconds(),  
127 - "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", lastMilliseconds, currentMilliseconds);  
128 - try {  
129 - Thread.sleep(timeDifferenceMilliseconds);  
130 - } catch (InterruptedException e) {  
131 - e.printStackTrace();  
132 - }  
133 - return true;  
134 - }  
135 -  
136 - private long getWorkerId() {  
137 - long result = Long.valueOf(properties.getProperty("worker.id", String.valueOf(WORKER_ID)));  
138 - Preconditions.checkArgument(result >= 0L && result < WORKER_ID_MAX_VALUE);  
139 - return result;  
140 - }  
141 -  
142 - private int getMaxVibrationOffset() {  
143 - int result = Integer.parseInt(properties.getProperty("max.vibration.offset", String.valueOf(DEFAULT_VIBRATION_VALUE)));  
144 - Preconditions.checkArgument(result >= 0 && result <= SEQUENCE_MASK, "Illegal max vibration offset");  
145 - return result;  
146 - }  
147 -  
148 - private int getMaxTolerateTimeDifferenceMilliseconds() {  
149 - return Integer.valueOf(properties.getProperty("max.tolerate.time.difference.milliseconds", String.valueOf(MAX_TOLERATE_TIME_DIFFERENCE_MILLISECONDS)));  
150 - }  
151 -  
152 - private long waitUntilNextTime(final long lastTime) {  
153 - long result = timeService.getCurrentMillis();  
154 - while (result <= lastTime) {  
155 - result = timeService.getCurrentMillis();  
156 - }  
157 - return result;  
158 - }  
159 -  
160 - private void vibrateSequenceOffset() {  
161 - sequenceOffset = sequenceOffset >= getMaxVibrationOffset() ? 0 : sequenceOffset + 1;  
162 - }  
163 -  
164 - @Override  
165 - public List<Long> generateKeyList(int genNum) {  
166 - long currentMilliseconds = timeService.getCurrentMillis();  
167 - if (waitTolerateTimeDifferenceIfNeed(currentMilliseconds)) {  
168 - currentMilliseconds = timeService.getCurrentMillis();  
169 - }  
170 - List<Long> data = new ArrayList<Long>(genNum);  
171 - for(int i=0; i<genNum; ++i) {  
172 - if (lastMilliseconds == currentMilliseconds) {  
173 - if (0L == (sequence = (sequence + 1) & SEQUENCE_MASK)) {  
174 - currentMilliseconds = waitUntilNextTime(currentMilliseconds);  
175 - }  
176 - } else {  
177 - vibrateSequenceOffset();  
178 - sequence = sequenceOffset;  
179 - }  
180 - data.add(((currentMilliseconds - EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (getWorkerId() << WORKER_ID_LEFT_SHIFT_BITS) | (1 << BATCH_FLAG_LEFT_SHIFT_BITS) | sequence);  
181 - }  
182 - lastMilliseconds = currentMilliseconds;  
183 - return data;  
184 - }  
185 -  
186 - public static void setTimeService(TimeService timeService) {  
187 - ShardingKeyGeneratorImpl.timeService = timeService;  
188 - }  
189 -  
190 - @Override  
191 - public void loalConfig(ShardingSphereKeyGeneratorConfiguration config) {  
192 - if(config.getMaxTolerateTimeDifferenceMilliseconds() != null) {  
193 - properties.setProperty("max.tolerate.time.difference.milliseconds", config.getMaxTolerateTimeDifferenceMilliseconds());  
194 - }  
195 - if(config.getWorkerId() != null) {  
196 - properties.setProperty("worker.id", config.getWorkerId());  
197 - }  
198 - if(config.getMaxVibrationOffset() != null) {  
199 - properties.setProperty("max.vibration.offset", config.getMaxVibrationOffset());  
200 - }  
201 - }  
202 -  
203 - @Override  
204 - public Properties getProps() {  
205 - return this.properties;  
206 - }  
207 -  
208 - @Override  
209 - public void setProps(Properties props) {  
210 - this.properties = props;  
211 - }  
212 -  
213 - @Override  
214 - public void init() {  
215 - System.out.println("ShardingKeyGeneratorImpl:init");  
216 - }  
217 -}  
src/main/java/com/taover/repository/shardingsphere/ShardingSphereService.java
@@ -1,87 +0,0 @@ @@ -1,87 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -  
3 -import java.util.ArrayList;  
4 -import java.util.HashMap;  
5 -import java.util.List;  
6 -import java.util.Map;  
7 -  
8 -import javax.annotation.Resource;  
9 -  
10 -import org.springframework.stereotype.Service;  
11 -  
12 -import com.taover.repository.autoconfigure.ShardingSphereKeyGeneratorConfiguration;  
13 -  
14 -@Service  
15 -public class ShardingSphereService {  
16 - private Map<Long, List<ShardingInfoEntity>> CACHED_TABLE_SUFFIX_BY_TENANT = null;  
17 - private Map<String, List<ShardingInfoEntity>> CACHED_TABLE_SUFFIX_BY_TABLE_NAME = null;  
18 - private Map<String, ShardingKeyGeneratorExt> GENERATOR_HOLDER = new HashMap<String, ShardingKeyGeneratorExt>();  
19 -  
20 - @Resource  
21 - private ShardingInfoRepository shardingInfoRepository;  
22 - private ShardingSphereKeyGeneratorConfiguration config;  
23 -  
24 - public ShardingSphereService(ShardingSphereKeyGeneratorConfiguration config) {  
25 - this.config = config;  
26 - }  
27 -  
28 - public List<Long> generateKeyList(String tableName, int number){  
29 - if(!GENERATOR_HOLDER.containsKey(tableName)) {  
30 - loadShardingKeyGenerator(tableName);  
31 - }  
32 - return GENERATOR_HOLDER.get(tableName).generateKeyList(number);  
33 - }  
34 -  
35 - public List<ShardingInfoEntity> getShardingInfoByTenantId(Long tenantId) {  
36 - if(CACHED_TABLE_SUFFIX_BY_TENANT == null) {  
37 - loadCacheTableShardingInfo();  
38 - }  
39 - return CACHED_TABLE_SUFFIX_BY_TENANT.get(tenantId);  
40 - }  
41 -  
42 - private synchronized void loadCacheTableShardingInfo() {  
43 - if(CACHED_TABLE_SUFFIX_BY_TENANT != null && CACHED_TABLE_SUFFIX_BY_TABLE_NAME != null) {  
44 - return;  
45 - }  
46 - List<ShardingInfoEntity> dataList = this.shardingInfoRepository.findListBySql("1=1");  
47 - Map<Long, List<ShardingInfoEntity>> tempData = new HashMap<Long, List<ShardingInfoEntity>>();  
48 - Map<String, List<ShardingInfoEntity>> tempDataTableName = new HashMap<String, List<ShardingInfoEntity>>();  
49 - for(ShardingInfoEntity item: dataList) {  
50 - List<ShardingInfoEntity> tempItem = tempData.getOrDefault(item.getTenantId(), new ArrayList<ShardingInfoEntity>());  
51 - tempItem.add(item);  
52 - tempData.put(item.getTenantId(), tempItem);  
53 -  
54 - List<ShardingInfoEntity> tempItemTableName = tempDataTableName.getOrDefault(item.getTableName(), new ArrayList<ShardingInfoEntity>());  
55 - tempItemTableName.add(item);  
56 - tempDataTableName.put(item.getTableName(), tempItemTableName);  
57 - }  
58 - CACHED_TABLE_SUFFIX_BY_TENANT = tempData;  
59 - CACHED_TABLE_SUFFIX_BY_TABLE_NAME = tempDataTableName;  
60 - }  
61 -  
62 - private synchronized void loadShardingKeyGenerator(String tableName) {  
63 - if(GENERATOR_HOLDER.containsKey(tableName)) {  
64 - return;  
65 - }  
66 - ShardingKeyGeneratorExt generator = new ShardingKeyGeneratorImpl();  
67 - generator.loalConfig(config);  
68 - GENERATOR_HOLDER.put(tableName, generator);  
69 - }  
70 -  
71 - public List<ShardingInfoEntity> getShardingInfoByTableNames(String[] broadcastTableNames) {  
72 - if(broadcastTableNames == null || broadcastTableNames.length == 0) {  
73 - return null;  
74 - }  
75 - if(CACHED_TABLE_SUFFIX_BY_TABLE_NAME == null) {  
76 - loadCacheTableShardingInfo();  
77 - }  
78 - List<ShardingInfoEntity> dataList = new ArrayList<ShardingInfoEntity>();  
79 - for(String item: broadcastTableNames) {  
80 - List<ShardingInfoEntity> tempData = CACHED_TABLE_SUFFIX_BY_TABLE_NAME.get(item);  
81 - if(tempData != null && !tempData.isEmpty()) {  
82 - dataList.addAll(tempData);  
83 - }  
84 - }  
85 - return dataList;  
86 - }  
87 -}  
src/main/java/com/taover/repository/shardingsphere/ShardingTableAlgorithmHint.java
@@ -1,54 +0,0 @@ @@ -1,54 +0,0 @@
1 -package com.taover.repository.shardingsphere;  
2 -  
3 -import java.util.Collection;  
4 -import java.util.HashSet;  
5 -import java.util.Properties;  
6 -import java.util.Set;  
7 -  
8 -import org.apache.commons.logging.Log;  
9 -import org.apache.commons.logging.LogFactory;  
10 -import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm;  
11 -import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingValue;  
12 -  
13 -public class ShardingTableAlgorithmHint implements HintShardingAlgorithm<String> {  
14 - Log log = LogFactory.getLog(ShardingTableAlgorithmHint.class);  
15 -  
16 - Properties prop = null;  
17 -  
18 - public ShardingTableAlgorithmHint() { }  
19 -  
20 - @Override  
21 - public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<String> shardingValue) {  
22 - Collection<String> values = shardingValue.getValues();  
23 - if(values == null || values.isEmpty()) {  
24 - String message = shardingValue.getLogicTableName()+"已启用分库分表,SQL语句请指定tenant_id 或 使用封装好的DAO层方法";  
25 - log.error(message);  
26 - throw new RuntimeException(message);  
27 - }  
28 - Set<String> result = new HashSet<String>(availableTargetNames);  
29 - for(String item: values) {  
30 - result.add(shardingValue.getLogicTableName()+item);  
31 - }  
32 - return result;  
33 - }  
34 -  
35 - @Override  
36 - public String getType() {  
37 - return "TABLE-HINT";  
38 - }  
39 -  
40 - @Override  
41 - public Properties getProps() {  
42 - return this.prop;  
43 - }  
44 -  
45 - @Override  
46 - public void setProps(Properties props) {  
47 - this.prop = props;  
48 - }  
49 -  
50 - @Override  
51 - public void init() {  
52 - System.out.println("ShardingTableAlgorithmHint:init");  
53 - }  
54 -}  
src/main/java/com/taover/repository/spring/autoconfigure/TaoverRepositoryAutoConfiguration.java 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +package com.taover.repository.spring.autoconfigure;
  2 +
  3 +import javax.annotation.Resource;
  4 +
  5 +import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  6 +import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
  7 +import org.springframework.context.annotation.Bean;
  8 +import org.springframework.context.annotation.Configuration;
  9 +import org.springframework.jdbc.core.JdbcTemplate;
  10 +
  11 +import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant;
  12 +import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenantImpl;
  13 +
  14 +@Configuration
  15 +@AutoConfigureAfter(JdbcTemplateAutoConfiguration.class)
  16 +public class TaoverRepositoryAutoConfiguration {
  17 + @Resource
  18 + private JdbcTemplate jdbcTemplate;
  19 +
  20 + @Bean
  21 + public JdbcTemplateWrapperTenant jdbcTemplateWrapperTenant() {
  22 + return new JdbcTemplateWrapperTenantImpl(this.jdbcTemplate);
  23 + }
  24 +}
src/main/resources/META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -com.taover.repository.shardingsphere.ShardingKeyGeneratorImpl  
2 \ No newline at end of file 0 \ No newline at end of file
src/main/resources/META-INF/spring.factories
1 -org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.taover.repository.autoconfigure.TaoverRepositoryAutoConfiguration  
2 \ No newline at end of file 1 \ No newline at end of file
  2 +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.taover.repository.spring.autoconfigure.TaoverRepositoryAutoConfiguration
3 \ No newline at end of file 3 \ No newline at end of file
src/test/java/com/taover/repository/test/TestAutoconfigure.java
@@ -18,20 +18,16 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -18,20 +18,16 @@ import org.springframework.jdbc.support.GeneratedKeyHolder;
18 import org.springframework.jdbc.support.KeyHolder; 18 import org.springframework.jdbc.support.KeyHolder;
19 import org.springframework.scheduling.annotation.EnableScheduling; 19 import org.springframework.scheduling.annotation.EnableScheduling;
20 20
21 -import com.taover.repository.jdbctemplate.JdbcTemplateBroadcast;  
22 import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant; 21 import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant;
23 22
24 @SpringBootApplication 23 @SpringBootApplication
25 @EnableScheduling 24 @EnableScheduling
26 public class TestAutoconfigure { 25 public class TestAutoconfigure {
27 - private static JdbcTemplateBroadcast jdbcTemplateBroadcast;  
28 private static JdbcTemplateWrapperTenant jdbcTemplateWrapperTenant; 26 private static JdbcTemplateWrapperTenant jdbcTemplateWrapperTenant;
29 private static JdbcTemplate jdbcTemplate; 27 private static JdbcTemplate jdbcTemplate;
30 -  
31 - 28 +
32 public static void main(String args[]) { 29 public static void main(String args[]) {
33 ConfigurableApplicationContext context = SpringApplication.run(TestAutoconfigure.class, args); 30 ConfigurableApplicationContext context = SpringApplication.run(TestAutoconfigure.class, args);
34 - jdbcTemplateBroadcast = context.getBean(JdbcTemplateBroadcast.class);  
35 jdbcTemplateWrapperTenant = context.getBean(JdbcTemplateWrapperTenant.class); 31 jdbcTemplateWrapperTenant = context.getBean(JdbcTemplateWrapperTenant.class);
36 jdbcTemplate = context.getBean(JdbcTemplate.class); 32 jdbcTemplate = context.getBean(JdbcTemplate.class);
37 33
@@ -67,7 +63,7 @@ public class TestAutoconfigure { @@ -67,7 +63,7 @@ public class TestAutoconfigure {
67 63
68 private static void testSimpleQuery() { 64 private static void testSimpleQuery() {
69 String sql = "select id from demo limit 1; "; 65 String sql = "select id from demo limit 1; ";
70 - System.out.println(jdbcTemplate.queryForObject(sql, BigDecimal.class)); 66 + System.out.println(jdbcTemplateWrapperTenant.queryForObject(sql, BigDecimal.class, null));
71 } 67 }
72 68
73 private static void testExpressSql() { 69 private static void testExpressSql() {
@@ -502,7 +498,6 @@ public class TestAutoconfigure { @@ -502,7 +498,6 @@ public class TestAutoconfigure {
502 } 498 }
503 499
504 public static void testBroadCast() { 500 public static void testBroadCast() {
505 - System.out.println(jdbcTemplateBroadcast.queryForObject("select id from wxorder_order order by id desc limit 5 ", String.class, new String[]{"wxorder_order"}));  
506 System.out.println(jdbcTemplateWrapperTenant.queryForObject("select id from wxorder_order limit 1", Long.class, 1L)); 501 System.out.println(jdbcTemplateWrapperTenant.queryForObject("select id from wxorder_order limit 1", Long.class, 1L));
507 System.out.println(jdbcTemplateWrapperTenant.queryForList("select * from wxorder_order limit 1", 1L)); 502 System.out.println(jdbcTemplateWrapperTenant.queryForList("select * from wxorder_order limit 1", 1L));
508 System.out.println(jdbcTemplateWrapperTenant.queryForList("select * from wxorder_order limit 1", 2L)); 503 System.out.println(jdbcTemplateWrapperTenant.queryForList("select * from wxorder_order limit 1", 2L));
src/test/java/com/taover/repository/test/TestMapper.java
@@ -7,6 +7,8 @@ import javax.sql.DataSource; @@ -7,6 +7,8 @@ import javax.sql.DataSource;
7 import org.springframework.jdbc.core.JdbcTemplate; 7 import org.springframework.jdbc.core.JdbcTemplate;
8 8
9 import com.alibaba.druid.pool.DruidDataSourceFactory; 9 import com.alibaba.druid.pool.DruidDataSourceFactory;
  10 +import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant;
  11 +import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenantImpl;
10 import com.taover.repository.test.repository.CommonRegionRepository; 12 import com.taover.repository.test.repository.CommonRegionRepository;
11 13
12 public class TestMapper { 14 public class TestMapper {
@@ -20,10 +22,10 @@ public class TestMapper { @@ -20,10 +22,10 @@ public class TestMapper {
20 DataSource ds = null; 22 DataSource ds = null;
21 try { 23 try {
22 ds = new DruidDataSourceFactory().createDataSource(properties); 24 ds = new DruidDataSourceFactory().createDataSource(properties);
23 - JdbcTemplate template = new JdbcTemplate(ds); 25 + JdbcTemplateWrapperTenant template = new JdbcTemplateWrapperTenantImpl(new JdbcTemplate(ds));
24 //System.out.println(template.queryForObject("select count(*) from wxorder_order", Integer.class)); 26 //System.out.println(template.queryForObject("select count(*) from wxorder_order", Integer.class));
25 CommonRegionRepository repo = new CommonRegionRepository(template); 27 CommonRegionRepository repo = new CommonRegionRepository(template);
26 - System.out.println(repo.findListBySql("1=1")); 28 + System.out.println(repo.findListBySql("1=1", null));
27 } catch (Exception e) { 29 } catch (Exception e) {
28 // TODO Auto-generated catch block 30 // TODO Auto-generated catch block
29 e.printStackTrace(); 31 e.printStackTrace();
src/test/java/com/taover/repository/test/repository/CommonRegionRepository.java
1 package com.taover.repository.test.repository; 1 package com.taover.repository.test.repository;
2 2
3 -import org.springframework.jdbc.core.JdbcTemplate; 3 +import com.taover.repository.CustomJdbcTemplateWrapperTenant;
  4 +import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant;
4 5
5 -import com.taover.repository.CustomJdbcTemplate;  
6 -  
7 -public class CommonRegionRepository extends CustomJdbcTemplate<CommonRegionEntity, Long>{ 6 +public class CommonRegionRepository extends CustomJdbcTemplateWrapperTenant<CommonRegionEntity, Long>{
8 public static int TYPE_PROVINCE = 1; 7 public static int TYPE_PROVINCE = 1;
9 public static int TYPE_CITY = 2; 8 public static int TYPE_CITY = 2;
10 public static int TYPE_DISTRICT = 3; 9 public static int TYPE_DISTRICT = 3;
11 public static Long PROVINCE_PARENT_ID = 1L; 10 public static Long PROVINCE_PARENT_ID = 1L;
12 11
13 - public CommonRegionRepository(JdbcTemplate jdbcTemplate) throws Exception { 12 + public CommonRegionRepository(JdbcTemplateWrapperTenant jdbcTemplate) throws Exception {
14 super(jdbcTemplate); 13 super(jdbcTemplate);
15 } 14 }
16 } 15 }
src/test/resources/META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -com.taover.repository.shardingsphere.ShardingKeyGeneratorImpl  
2 \ No newline at end of file 0 \ No newline at end of file
src/test/resources/META-INF/spring.factories
1 -org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.taover.repository.autoconfigure.RepositoryAutoConfiguration  
2 \ No newline at end of file 1 \ No newline at end of file
  2 +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.taover.repository.spring.autoconfigure.TaoverRepositoryAutoConfiguration
3 \ No newline at end of file 3 \ No newline at end of file
src/test/resources/application.properties
1 1
2 -server.port=80  
3 -server.session.timeout=3600  
4 -  
5 -spring.servlet.multipart.max-file-size=10MB  
6 -spring.servlet.multipart.max-request-size=20MB  
7 -  
8 -spring.jackson.time-zone=GMT+8  
9 -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss  
10 -spring.mvc.dateFormat = yyyy-MM-dd HH:mm:ss  
11 -spring.gson.serialize-nulls=true  
12 -  
13 -spring.mvc.dispatch-options-request=true  
14 -  
15 -# shardingspere  
16 -spring.shardingsphere.datasource.names=ds0  
17 -spring.shardingsphere.datasource.common.type=com.alibaba.druid.pool.DruidDataSource  
18 -spring.shardingsphere.datasource.common.driver-class-name=com.mysql.cj.jdbc.Driver  
19 -spring.shardingsphere.datasource.ds0.url=jdbc:mysql://rdsifmezqifmezqo.mysql.rds.aliyuncs.com:3306/bzyun_wxorder?characterEncoding=UTF-8  
20 -spring.shardingsphere.datasource.ds0.username=tylife  
21 -spring.shardingsphere.datasource.ds0.password=lexi365  
22 -spring.shardingsphere.datasource.ds0.initial-size=10  
23 -spring.shardingsphere.datasource.ds0.max-active=20  
24 -spring.shardingsphere.datasource.ds0.min-idle=5  
25 -spring.shardingsphere.datasource.ds0.max-wait=60000  
26 -  
27 -spring.shardingsphere.datasource.ds1.url=jdbc:mysql://121.42.142.102:3306/bzyun_wxorder?characterEncoding=UTF-8  
28 -spring.shardingsphere.datasource.ds1.username=dev  
29 -spring.shardingsphere.datasource.ds1.password=taover02  
30 -spring.shardingsphere.datasource.ds1.initial-size=10  
31 -spring.shardingsphere.datasource.ds1.max-active=20  
32 -spring.shardingsphere.datasource.ds1.min-idle=5  
33 -spring.shardingsphere.datasource.ds1.max-wait=60000  
34 -  
35 -#spring.shardingsphere.rules.sharding.tables.wxorder_order.actual-data-nodes=ds0.wxorder_order  
36 -#spring.shardingsphere.rules.sharding.tables.wxorder_order.database-strategy.hint.database_hint.sharding-algorithm-name=database_hint  
37 -#spring.shardingsphere.rules.sharding.tables.wxorder_order.table-strategy.hint.table_hint.sharding-algorithm-name=table_hint  
38 -#spring.shardingsphere.rules.sharding.tables.wxorder_order.key-generate-strategy.column=id  
39 -#spring.shardingsphere.rules.sharding.tables.wxorder_order.key-generate-strategy.key-generator-name=SNOWFLAKE-SELF  
40 -  
41 -#spring.shardingsphere.rules.sharding.sharding-algorithms.database_hint.type=HINT  
42 -#spring.shardingsphere.rules.sharding.sharding-algorithms.database_hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingDatabaseAlgorithmHint  
43 -#spring.shardingsphere.rules.sharding.sharding-algorithms.table_hint.type=HINT  
44 -#spring.shardingsphere.rules.sharding.sharding-algorithms.table_hint.algorithm-class-name=com.taover.repository.shardingsphere.ShardingTableAlgorithmHint  
45 -  
46 -taover.sharding.workerId=1  
47 -taover.sharding.maxVibrationOffset=3  
48 -taover.sharding.maxTolerateTimeDifferenceMilliseconds=1000  
49 -  
50 -#spring.shardingsphere.sharding.default-key-generator.key-generator.column=id  
51 -#spring.shardingsphere.sharding.default-key-generator.type=SNOWFLAKE-SELF  
52 -#spring.shardingsphere.sharding.default-key-generator.props.worker.id=1  
53 -#spring.shardingsphere.sharding.default-key-generator.props.max.vibration.offset=3  
54 -#spring.shardingsphere.sharding.default-key-generator.props.max.tolerate.time.difference.milliseconds=1000 2 +#DB info
  3 +spring.datasource.url=jdbc:mysql://rdsifmezqifmezqo.mysql.rds.aliyuncs.com:3306/bzyun_wxorder?characterEncoding=UTF8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=GMT%2B8
  4 +spring.datasource.username=tylife
  5 +spring.datasource.password=lexi365
  6 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  7 +
  8 +spring.datasource.druid.initial-size=10
  9 +spring.datasource.druid.max-active=20
  10 +spring.datasource.druid.min-idle=5
  11 +spring.datasource.druid.max-wait=60000