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

假如有这样1个查询请求,模糊查询标题中包含a%b_cc‘d的记录,正确的sql应该是下面这样的:

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个公用方法,经过测试是正确的。

/**

*

* 对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。使用预编译语句不仅让代码可读性更好,而且还会有性能优势。可以参考这篇文章:

原文:http://blog.csdn.net/aitangyong/article/details/42749213

java sql特殊字符处理_java用字符串拼接SQL语句的特殊字符转义问题相关推荐

  1. java json特殊字符处理_java json字符串传递给 js 时 特殊字符转义错误 研究

    一些换行 回车等符号需要转义 主要注意 单引号 与双引号. 一 如果js以 双引号接收字符串 则转单引号 "  至 \" 否则js报错 二 如果js以 单引号接收字符串 则转单引号 ...

  2. 华为java安全编码规范_Java安全编码之SQL注入

    随着互联网的发展,Java语言在金融服务业.电子商务.大数据技术等方面的应用极其广泛.Java安全编码规范早已成为SDL中不可或缺的一部分.本文以Java项目广泛采用的两个框架Hibernate和My ...

  3. Oracle 存储过程 字符串拼接 SQL注入的问题

    之前项目中写的一个大的存储过程 中间用到的SQL字符串拼接的方法 来完成业务的流程 类似SQL的动态拼接把 为什么要有用到这种形式 因为我这个存储过程里面要处理 至少三个系统的六种情况 所以使用拼接的 ...

  4. java查找字符位置_java 查找字符串所在的位置代码

    使用了 string 类的 indexof() 方法在字符串中查找子字符串出现的位置,如过存在返回字符串出现的位置(第一位为0),如果不存在返回 -1.方便判断和截取字符串! 语法:stringobj ...

  5. java怎么显示空格符_Java在字符串中看不到空格

    因此,我正在尝试解析一些具有多行文本的文本文件.我的工作是遍历所有单词并将其打印出文件. 因此,我阅读了所有行,然后遍历它们,并用空格将每一行分开,如下所示: line.split("\\s ...

  6. java大string排序_java中字符串排序,String 转化为int比较大小

    引入题目 题目描述 设有nnn个正整数(n≤20)(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 ...

  7. java 中文怎么截取_Java截取字符串的函数且保证中文截取正常

    SUBSTRING  返回字符.binary.text      或      image      表达式的一部分.有关可与该函数一起使用的有效      Microsoft®      SQL   ...

  8. java string 连续字符_Java中字符串中连续相同字符去重方法

    导读 正文 最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到 ...

  9. java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”

    我试图通过 Java连接到SQL Server 2008. >我已将sqljdbc4.jar添加到我的项目库中. >没有为访问数据库的数据库设置用户名和密码(Windows身份验证). & ...

最新文章

  1. ROS知识【15】:在eclipse创建ROS项目
  2. C++加号运算符重载
  3. 关于内容分发网络 CDN 的可靠性和冗余性
  4. oracle查询表占用空,Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询...
  5. 求字符串中字符的出现的最多次数和最少次数,删除后并获得最终字符
  6. UIImagePickerController---iOS-Apple苹果官方文档翻译
  7. apms阅卷系统服务器,apms全通纸笔王网上阅卷系统操作流程
  8. AHCI驱动下载与手动安装图解
  9. 教程详解|3D环物的360物体如何在后台上传?
  10. 计算机中重命名的英文单词,重命名是什么意思
  11. Linux下vasp优化结构,VASP入门系列文章[6]结构优化
  12. Jetpack之LiveData
  13. 程序员必备-网站推荐
  14. Increasing trend of scientists to switch between topics论文翻译
  15. 水下自动循迹机器人_一种夜间巡逻机器人自动循迹方法
  16. 使用python发送邮件(新浪)
  17. frp Connection refused
  18. 解释一下什么叫:同一个java文件只能有一个public类
  19. C++ Internals: VC RTTI - dynamic_cast (2)
  20. mysql排列组合实现_排列-组合的代码实现

热门文章

  1. 逆水寒武境斩鸿蒙怎么弄的,逆水寒武器契合怎么弄 平民玩家提升攻击力方法...
  2. 如何解决Python配置环境变量后cmd仍无法打开的问题
  3. A brief taste of JIFA
  4. 如何加速大模型开发?技术方案拆解来了:昇思MindSpore技术一览
  5. ps 基础 裁剪工具 修复工具 图章工具
  6. 为什么使用Adobe Acrobat打开pdf,不能双面打印,而 word 却可以双面打印
  7. 中谷python_中谷教育Python学习笔记
  8. Kotlin基础 字符串操作与数字类型转换、标准库函数
  9. cad如何转换成pdf格式,黑白色的
  10. uniapp小程序禁止分享,安卓机禁止复制短链接