Commit 1adcb6de0be14a2aa0dea25d1e6a8a80dac8fc08
1 parent
4631c60c
Exists in
master
and in
2 other branches
1.fix a bug about splict sql
Showing
3 changed files
with
77 additions
and
17 deletions
Show diff stats
build.gradle
src/main/java/com/taover/repository/CustomJdbcTemplate.java
... | ... | @@ -601,16 +601,12 @@ public class CustomJdbcTemplate<T, ID extends Serializable> { |
601 | 601 | } |
602 | 602 | |
603 | 603 | public Map<String, Object> getPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize){ |
604 | - int fromIndex = coreSql.toUpperCase().indexOf("FROM"); | |
605 | - String selectSql = ""; | |
606 | - String fromAndWhereSql = ""; | |
607 | - if(fromIndex > -1) { | |
608 | - selectSql = coreSql.substring(0, fromIndex); | |
609 | - fromAndWhereSql = coreSql.substring(fromIndex, coreSql.length()); | |
610 | - }else { | |
604 | + try { | |
605 | + String[] splitedSql = UtilsSql.splitCoreSql(coreSql); | |
606 | + return this.getPageData(splitedSql[0], splitedSql[1], orderByPartSql, page, pageSize); | |
607 | + }catch (Exception e) { | |
611 | 608 | return UtilsSql.createPage(page, pageSize, 0, new ArrayList<Object>()); |
612 | 609 | } |
613 | - return this.getPageData(selectSql, fromAndWhereSql, orderByPartSql, page, pageSize); | |
614 | 610 | } |
615 | 611 | |
616 | 612 | public Map<String, Object> getPageData(String selectSql, String fromAndWhereSql, String orderByPartSql, Integer page, Integer pageSize){ |
... | ... | @@ -629,16 +625,12 @@ public class CustomJdbcTemplate<T, ID extends Serializable> { |
629 | 625 | } |
630 | 626 | |
631 | 627 | public <E> Map<String, Object> getBeanPageData(String coreSql, String orderByPartSql, Integer page, Integer pageSize, Class<E> beanClass){ |
632 | - int fromIndex = coreSql.toUpperCase().indexOf("FROM"); | |
633 | - String selectSql = ""; | |
634 | - String fromAndWhereSql = ""; | |
635 | - if(fromIndex > -1) { | |
636 | - selectSql = coreSql.substring(0, fromIndex); | |
637 | - fromAndWhereSql = coreSql.substring(fromIndex, coreSql.length()); | |
638 | - }else { | |
628 | + try { | |
629 | + String[] splitedSql = UtilsSql.splitCoreSql(coreSql); | |
630 | + return this.getPageData(splitedSql[0], splitedSql[1], orderByPartSql, page, pageSize, beanClass); | |
631 | + }catch (Exception e) { | |
639 | 632 | return UtilsSql.createPage(page, pageSize, 0, new ArrayList<Object>()); |
640 | 633 | } |
641 | - return this.getPageData(selectSql, fromAndWhereSql, orderByPartSql, page, pageSize, beanClass); | |
642 | 634 | } |
643 | 635 | |
644 | 636 | public <E> Map<String, Object> getPageData(String selectSql, String fromAndWhereSql, String orderByPartSql, Integer page, Integer pageSize, Class<E> beanClass){ | ... | ... |
src/main/java/com/taover/repository/UtilsSql.java
... | ... | @@ -7,6 +7,64 @@ import org.springframework.util.StringUtils; |
7 | 7 | |
8 | 8 | public class UtilsSql { |
9 | 9 | |
10 | + public static String[] splitCoreSql(String coreSql) throws Exception { | |
11 | + //去除''内的信息 | |
12 | + String coreSqlRemoveQuate = replaceSelectAndFromBetweenTopCornerMark(coreSql.toUpperCase()); | |
13 | + int fromIndex = calcFromIndex(coreSqlRemoveQuate); | |
14 | + if(fromIndex > -1) { | |
15 | + return new String[] {coreSql.substring(0, fromIndex), coreSql.substring(fromIndex, coreSql.length())}; | |
16 | + }else { | |
17 | + throw new Exception("未找到FROM子句"); | |
18 | + } | |
19 | + } | |
20 | + | |
21 | + private static int calcFromIndex(String coreSqlUpper) { | |
22 | + //计算位置 | |
23 | + int selectSubSqlNum = 0; | |
24 | + int currWindowIndex = 0; | |
25 | + for(currWindowIndex=0; (currWindowIndex+6)<coreSqlUpper.length(); ) { | |
26 | + String currSubStr = coreSqlUpper.substring(currWindowIndex, currWindowIndex+6); | |
27 | + if("SELECT".equals(currSubStr)) { | |
28 | + ++selectSubSqlNum; | |
29 | + currWindowIndex += 6; | |
30 | + }else if(currSubStr.startsWith("FROM")) { | |
31 | + if(selectSubSqlNum == 1) { | |
32 | + return currWindowIndex; | |
33 | + } | |
34 | + --selectSubSqlNum; | |
35 | + currWindowIndex += 4; | |
36 | + } | |
37 | + ++currWindowIndex; | |
38 | + } | |
39 | + return -1; | |
40 | + } | |
41 | + | |
42 | + private static String replaceSelectAndFromBetweenTopCornerMark(String sql) { | |
43 | + StringBuffer result = new StringBuffer(); | |
44 | + boolean isBetweenMark = false; | |
45 | + int iMark = 0; | |
46 | + int currIndex = 0; | |
47 | + for(currIndex=0; currIndex<sql.length(); ++currIndex) { | |
48 | + char currChar = sql.charAt(currIndex); | |
49 | + if(currChar == '\'') { | |
50 | + if(!isBetweenMark) { | |
51 | + result.append(sql.substring(iMark, currIndex)); | |
52 | + isBetweenMark = true; | |
53 | + }else { | |
54 | + result.append(sql.substring(iMark, currIndex).replaceAll("SELECT", "******").replaceAll("FROM", "****")); | |
55 | + isBetweenMark = false; | |
56 | + } | |
57 | + iMark = currIndex; | |
58 | + }else if(currChar == '\\') { | |
59 | + ++currIndex; | |
60 | + } | |
61 | + } | |
62 | + if(iMark > -1) { | |
63 | + result.append(sql.substring(iMark, currIndex)); | |
64 | + } | |
65 | + return result.toString(); | |
66 | + } | |
67 | + | |
10 | 68 | /** |
11 | 69 | * 获取排序字符串 |
12 | 70 | * @param sort |
... | ... | @@ -84,4 +142,14 @@ public class UtilsSql { |
84 | 142 | pageData.put("total", total); |
85 | 143 | return pageData; |
86 | 144 | } |
145 | + | |
146 | + public static void main(String[] args) { | |
147 | + try { | |
148 | + String[] data = splitCoreSql("select t,(select * as 'fromCActio', dd as 'seelctsele\'ctd' from t) from www where 223"); | |
149 | + System.out.println(data[0]); | |
150 | + System.out.println(data[1]); | |
151 | + } catch (Exception e) { | |
152 | + e.printStackTrace(); | |
153 | + } | |
154 | + } | |
87 | 155 | } | ... | ... |