apbbbbb
旋转的钢笔
采纳率19.3%
2018-01-18 08:50 阅读 1.6k
已采纳

java 中拼接sql,& 取地址符号如何转义????

5

使用的oracle数据库,前端传值含有&符号,oracle会默认当变量处理,改如何拼接让
它当字符串处理????

如下

控制台打印的sql为
 select count(*) from t_course t  left join t_course_target b on t.course_code=b.course_code where   1=1  and b.section_no in ('Games&Toys',null)
 想要结果
  select count(*) from t_course t left join t_course_target b on t.course_code=b.course_code where 1=1 and b.section_no in ('Games'||'&'||'Toys',null) ;

实现代码
sql+=" and b.division_no in ("+divisionNo.replaceAll("&", " '||'+'&'+'||'")+")";
请问这段我该如何拼接????

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • 已采纳
    qq_34756209 Jian_Shen_Zero 2018-01-18 09:36

    特殊字符前是要加转义符的,改成 sql+=" and b.division_no in ("+divisionNo.replaceAll("\&", " '\|\|'+'\&'+'\|\|'")+")";

    点赞 评论 复制链接分享
  • qq_40119946 qq_40119946 2018-01-18 09:06
    点赞 评论 复制链接分享
  • qq_41326651 qq_41326651 2018-01-18 09:29

    在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询。如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入。比如对输入的%和_和',就需要进行转义,因为这3个字符是SQL的特殊字符,如果不处理会导致sql出错或者是查询数据不正确。

    假如有这样1个查询请求,模糊查询标题中包含a%b_cc'd的记录,正确的sql应该是下面这样的:
    [sql] view plain copy
    select * from t_sch_work_info t where t.title like '%a/%b/_cc''d%' ESCAPE '/';

    这就需要对String content = "a%b_cc'd";进行转义后,再拼成SQL语句。oracle数据库允许我们使用自己定义的字符作为转义字符。看了下我们项目DAO层的编码风格,使用到了2种转义字符 \ 和 / 。定位问题的时候发现,有人拼接SQL语句出错。自己用这2种字符,写了2个公用方法,经过测试是正确的。
    [java] view plain copy
    /**
    *

    * 对content的内容进行转换后,在作为oracle查询的条件字段值。使用/作为oracle的转义字符,比较合适。

    * 既能达到效果,而且java代码相对容易理解,建议这种使用方式

    * "%'" + content + "'% ESCAPE '/' "这种拼接sql看起来也容易理解

    *

    * @param content
    * @return
    */

    public static String decodeSpecialCharsWhenLikeUseBackslash(String content)

    {

    // 单引号是oracle字符串的边界,oralce中用2个单引号代表1个单引号

    String afterDecode = content.replaceAll("'", "''");

    // 由于使用了/作为ESCAPE的转义特殊字符,所以需要对该字符进行转义

    // 这里的作用是将"a/a"转成"a//a"

    afterDecode = afterDecode.replaceAll("/", "//");

    // 使用转义字符 /,对oracle特殊字符% 进行转义,只作为普通查询字符,不是模糊匹配

    afterDecode = afterDecode.replaceAll("%", "/%");

    // 使用转义字符 /,对oracle特殊字符_ 进行转义,只作为普通查询字符,不是模糊匹配

    afterDecode = afterDecode.replaceAll("_", "/_");

    return afterDecode;

    }

    /**
    * 对content的内容进行转换后,在作为oracle查询的条件字段值。使用\作为oracle的转义字符。

    * 这种做法也能达到目的,但不是好的做法,比较容易出错,而且代码很那看懂。

    * "%'" + content + "'% ESCAPE '\' "这种拼接sql实际上是错误的.

    * "%'" + content + "'% ESCAPE '\' "这种拼接sql才是正确的

    *

    * @param content
    * @return
    */

    public static String decodeSpecialCharsWhenLikeUseSlash(String content)

    {

    // 单引号是oracle字符串的边界,oralce中用2个单引号代表1个单引号

    String afterDecode = content.replaceAll("'", "''");

    // 由于使用了\作为ESCAPE的转义特殊字符,所以需要对该字符进行转义

    // 由于\在java和正则表达式中都是特殊字符,需要进行特殊处理

    // 这里的作用是将"a\a"转成"a\a"

    afterDecode = afterDecode.replaceAll("\\", "\\\\");

    // 使用转义字符 \,对oracle特殊字符% 进行转义,只作为普通查询字符,不是模糊匹配

    afterDecode = afterDecode.replaceAll("%", "\\%");

    // 使用转义字符 \,对oracle特殊字符_ 进行转义,只作为普通查询字符,不是模糊匹配

    afterDecode = afterDecode.replaceAll("_", "\\_");

    return afterDecode;

    }

    对比上面的代码,很容易看出使用/,代码更简单,更容易理解。之所以写这个博客,不是推荐大家去手动拼接SQL字符串,因为这种做法效率很低,而且很容易出错。实际开发中,我们应该使用JDBC或者hibernate等框架,提供的预编译SQL。使用预编译语句不仅让代码可读性更好,而且还会有性能优势。可以参考这篇文章:
    HQL或SQL使用?带来的好处:减少SQL解析时间、降低内存开销、防止SQL注入

    点赞 评论 复制链接分享
  • u010031616 u010031616 2018-01-18 09:48

    public static String decodeSpecialCharsWhenLikeUseSlash(String content)

    {

    // 单引号是oracle字符串的边界,oralce中用2个单引号代表1个单引号

    String afterDecode = content.replaceAll("'", "''");

    // 由于使用了\作为ESCAPE的转义特殊字符,所以需要对该字符进行转义

    // 由于\在java和正则表达式中都是特殊字符,需要进行特殊处理

    // 这里的作用是将"a\a"转成"a\a"

    afterDecode = afterDecode.replaceAll("\", "\\");

    // 使用转义字符 \,对oracle特殊字符% 进行转义,只作为普通查询字符,不是模糊匹配

    afterDecode = afterDecode.replaceAll("%", "\%");

    // 使用转义字符 \,对oracle特殊字符_ 进行转义,只作为普通查询字符,不是模糊匹配

    afterDecode = afterDecode.replaceAll("_", "\_");

    return afterDecode;

    }

    点赞 评论 复制链接分享
  • chai1143126501 来临 2018-01-19 09:22

    sql语句转义大多用相同的字符就行,比如&&就转义了&

    点赞 评论 复制链接分享

相关推荐