[单就 MSSQLSERVER  分以下情况 (可以 用print 来验证 dbms 是怎么 来理解的 )  1. print 'abc'  得到 abc  2. print 'abc=''d' 得到 abc='d  3.print 'abc=''d'

在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询。如果使用的是原始的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个公用方法,经过测试是正确的。

[当sql语句和变量进行拼接时,如下:>添加工作记录当多个变量作为参数进行拼接时,如下:&small=&id=> 如果是sql拼接,则用:String sql=select * from yonghu where usern

/**

*

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

[这两天在项目中遇到一个问题,存入数据库中的数据与用户希望显示的数据有一些不一致,但是存入的数据还是正确的。这样的话,就需要我们在显示数据时做一些处理。项目中对

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

  1. java sql特殊字符处理_java用字符串拼接SQL语句的特殊字符转义问题

    在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询.如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入.比如 ...

  2. java sql 字符串 转义_java拼接SQL语句的特殊字符转义

    在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询. 如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入. ...

  3. 【java注解--使用注解封装自动拼接sql 】

    java注解全面解析--实例 使用注解封装自动拼接sql 1.定义注解类 TableName:  用来注解 表名 ,拥有一个属性 value 将适用范围定为:TYPE  Class, interfac ...

  4. java中的字符串_java中字符串的操作

    //创建一个字符数组 char[] charArr = {'a','b','c','d','e','f','g'}; //创建一个字符串 String str = new String(charArr ...

  5. java 去重字符串_Java之字符串去重的简述

    在编写JS代码时,我们发现可以通过JSON的特性消除重复数据,并快速的消除数据,下文是Java之字符串去重的简述?让爱站技术频道小编带你一起进入下文了解一下吧! 字符串在任何应用中都占用了大量的内存. ...

  6. java字母反过来_java实现字符串(数字、字母、汉字)的反向输出

    java实现字符串(数字.字母.汉字)的反向输出 在java中可以通过多种方法实现字符串的反向输出. (1).使用String类的split()方法对字符串进行分隔,分隔后返回与该字符串对应的字符串数 ...

  7. java中截取后几位字符串_java截取字符串后几位

    java中常用的字符串的截取方法_计算机软件及应用_IT/计算机_专业资料.jsp中常见使用技术,js,jstl,eclipse,java 1.length() 字符串的长度 例:char chars ...

  8. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...

  9. java 插入字符串_java插入字符串

    JAVA insert() 插入字符串 insert() 插入字符串 StringBuffer insert(int index,String str) StringBuffer insert(int ...

  10. java 字符串数组 转字符串_Java 中将字符串数组转换为字符串

    Java 中将字符串数组转换为字符串 import java.util.Arrays; import java.util.HashSet; import java.util.Set; public c ...

最新文章

  1. 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...
  2. 2.2.1 处理机调度的概念和层次
  3. string 类的初始化和赋值(程序成长之路的一颗米)
  4. WebSocket和Java
  5. ng-show和ng-if的区别和使用场景
  6. Python可视化--常用颜色
  7. step13. ubuntu18.04下载安装配置Hive(转)
  8. vue判断设备是手机端还是pc端
  9. 一体机(广告投放机)开发
  10. iOS 15 真机调试包 DeviceSupport
  11. 当你在进行SDK安装更新时,遇到了一些不能安装的项目时,你可以酱紫····
  12. 疯狂膜拜!万字长文轻松彻底入门spring
  13. pyhton———使用urllib 下载文件~~过掉岁月过掉风
  14. SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--函数)
  15. 《Linux内核设计与实现》之进程
  16. DC-DC直流隔离升压高压输出电源模块12v24v48v转50V110V200V250V350V400V500V600V800V1000V微功率
  17. 机器学习笔记 --- 数学符号以及读法
  18. 《The Wiley Handbook of Human Computer Interaction》翻译之Part XI
  19. java 微信报关 V2
  20. 广西大学计算机仿真实验,基于Simulink的汽车动力性仿真实验设计

热门文章

  1. 金蝶K3采购价格管控杂谈
  2. 一个萌新关于电脑安装软件错误提示“1402”的应对方法
  3. gliffy UML破解工具
  4. Ubuntu查看联想笔记本无线网卡内核并安装驱动
  5. Windows下安装JDK,配置环境变量
  6. 计算机ip 地址异常,电脑显示IP地址错误怎么办|电脑无法上网提示IP地址错误的解决方法...
  7. 苹果ipad怎么录屏_原来苹果手机还能这样投屏!1秒小屏变大屏!太好用了
  8. TOGAF9-certification简介
  9. server2012R2VC++2015 redistributable安装出错KB2999226-x64.msu 此更新不适合你的计算机
  10. 深入C++库分析sync_with_stdio实现