用Java重写SQL语句到预处理语句

时间:2011-11-28 15:44:34

标签: java sql parsing

由于我们无法控制的情况(换句话说,使用第三方编写的代码),我们发现自己需要将带有内联值的SQL语句重写为预处理语句。现在,我们正在使用一组可怕的正则表达式来捕获大多数情况,但仍然在一些情况下失败(并且通常会失败,产生无效的SQL)。

看起来我们需要实际解析SQL,代替“?”显式字符串和数值的参数,并将注入的值收集到新准备的语句中。

  1. 有没有人这样做过?
  2. 如果你还没有,但是你使用过一个Java SQL解析器,你会为此建议使用解析器吗?
  3. 以下是我们正在处理并希望重写的“毛茸茸”的SQL类型的示例:

    rewrite from
    SELECT COL1 FROM TB1 WHERE LOWER(COL2) = LOWER('foo bar ' || '&' || ' Abc(' || '''' || ')') 
        AND COL3 = 2 AND COL4 = 1
    to
    SELECT COL1 FROM TB1 WHERE LOWER(COL2) = LOWER(? || ? || ? || ? || ?) 
        AND COL3 = ? AND COL4 = ?
    applied to ("foo bar ", "&", " Abc(", "'", ")", 2, 1)
    

1 个答案:

答案 0 :(得分:0)

1)您可以创建temproray表(会话时间,内存基础 - 如您所愿)以填充您需要的值(以小写字母表示,以达到性能目的)。

并将您的查询更改为:

SELECT  t1.COL1 
FROM    TB1 t1 
        INNER JOIN TEMP_TABLE t2 ON ( t2.val = LOWER(t1.COL2) )
WHERE   t1.COL3 = ? AND t1.COL4 = ?

2)如果您使用MySQL并且搜索的值不包含逗号,您可以使用“find_in_set”函数:

SELECT  COL1 
FROM    TB1 t1 
WHERE   FIND_IN_SET( LOWER(t1.COL2), ? )
        AND t1.COL3 = ? AND t1.COL4 = ?

applied to ("foo bar,&,Abc(,',)",2,1