博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java用字符串拼接SQL语句的特殊字符转义问题
阅读量:2095 次
发布时间:2019-04-29

本文共 2295 字,大约阅读时间需要 7 分钟。

在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询。如果使用的是原始的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://rjdhf.baihongyu.com/

你可能感兴趣的文章
Cisco Packet Tracer教程
查看>>
02. 交换机的基本配置和管理
查看>>
03. 交换机的Telnet远程登陆配置
查看>>
微信小程序-调用-腾讯视频-解决方案
查看>>
phpStudy安装yaf扩展
查看>>
密码 加密 加盐 常用操作记录
查看>>
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>