Postgresql Jdbc 正则表达式问号?的使用

背景说明:最近在查看项目代码时遇到postgresql正则查询 mybatis配置使用了”??”,有些不明白,使用”?”取代,总是遇到错误”Cause: org.postgresql.util.PSQLException: 未设定参数值 2 的内容”,猜想是jdbc PrepareStatment占位符问号(?)与postgresql正则?相同导致的,却又不知道如何解决,在网上找了很久,只找到一个解决方案链接地址,这个方法确实能达到相同的效果,但是还是想弄懂2个问号时如何使用的,于是使用debug方式,发现postgresql在实现PrepareStament的类中,对特殊符号问号(?)进行了处理,把2个替换成了1个。跟我一起看看postgresql是怎么处理的吧。

正则表达式使用如下

此表达式的含义是:数组中任何一个元素在jsonb中,都能匹配到
postgresql中书写

select '["ab","a"]'::jsonb ?| array['a', 'b']

mybatis中书写

select '["ab","a"]'::jsonb ??| array['a', 'b']

maven配置如下


    org.postgresql
    postgresql
    9.4-1201-jdbc41


    net.postgis
    postgis-jdbc
    2.2.1

sql处理过程

1、首先根据问号(?)对字符串分割,具体对类org.postgresql.core.v3.QueryExecutorImpl,173行 在这里把关键代码贴出来

  case '?':
      if (withParameters) {//有动态参数
          if (i + 1 < aChars.length && aChars[i + 1] == '?') {//连续2个问号,pass
              ++i;
          } else {//在只有一个问号对地方进行字符串分割
              fragmentList.add(query.substring(fragmentStart, i));
              fragmentStart = i + 1;
          }
      }

2、遍历分割后的字符串数组,把连续2个问号改为1个问号,具体类org.postgresql.core.Parser,170行,关键代码如下

    case '?':
        if (i + 1 < aChars.length && aChars[i + 1] == '?') {
            buf.append("?");//连续2个问号,只append1个问号
            ++i;
            break;
        }

        buf.append("?");
        break;

关键就在第2步,对sql重新组装使得postgresql 可以执行

你可能感兴趣的:(SQL)