Commit 1adcb6de0be14a2aa0dea25d1e6a8a80dac8fc08

Authored by unknown
1 parent 4631c60c

1.fix a bug about splict sql

build.gradle
... ... @@ -55,7 +55,7 @@ uploadArchives {
55 55 authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
56 56 }
57 57 pom.project {
58   - version '2.1.6'
  58 + version '2.1.8'
59 59 artifactId ARTIFACT_Id
60 60 groupId GROUP_ID
61 61 packaging TYPE
... ...
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&lt;T, ID extends Serializable&gt; {
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 }
... ...