java sql 字符串_java用字符串拼接SQL语句的特殊字符转义问题
[单就 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语句的特殊字符转义问题相关推荐
- java sql特殊字符处理_java用字符串拼接SQL语句的特殊字符转义问题
在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询.如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入.比如 ...
- java sql 字符串 转义_java拼接SQL语句的特殊字符转义
在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询. 如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入. ...
- 【java注解--使用注解封装自动拼接sql 】
java注解全面解析--实例 使用注解封装自动拼接sql 1.定义注解类 TableName: 用来注解 表名 ,拥有一个属性 value 将适用范围定为:TYPE Class, interfac ...
- java中的字符串_java中字符串的操作
//创建一个字符数组 char[] charArr = {'a','b','c','d','e','f','g'}; //创建一个字符串 String str = new String(charArr ...
- java 去重字符串_Java之字符串去重的简述
在编写JS代码时,我们发现可以通过JSON的特性消除重复数据,并快速的消除数据,下文是Java之字符串去重的简述?让爱站技术频道小编带你一起进入下文了解一下吧! 字符串在任何应用中都占用了大量的内存. ...
- java字母反过来_java实现字符串(数字、字母、汉字)的反向输出
java实现字符串(数字.字母.汉字)的反向输出 在java中可以通过多种方法实现字符串的反向输出. (1).使用String类的split()方法对字符串进行分隔,分隔后返回与该字符串对应的字符串数 ...
- java中截取后几位字符串_java截取字符串后几位
java中常用的字符串的截取方法_计算机软件及应用_IT/计算机_专业资料.jsp中常见使用技术,js,jstl,eclipse,java 1.length() 字符串的长度 例:char chars ...
- java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...
- java 插入字符串_java插入字符串
JAVA insert() 插入字符串 insert() 插入字符串 StringBuffer insert(int index,String str) StringBuffer insert(int ...
- java 字符串数组 转字符串_Java 中将字符串数组转换为字符串
Java 中将字符串数组转换为字符串 import java.util.Arrays; import java.util.HashSet; import java.util.Set; public c ...
最新文章
- 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...
- 2.2.1 处理机调度的概念和层次
- string 类的初始化和赋值(程序成长之路的一颗米)
- WebSocket和Java
- ng-show和ng-if的区别和使用场景
- Python可视化--常用颜色
- step13. ubuntu18.04下载安装配置Hive(转)
- vue判断设备是手机端还是pc端
- 一体机(广告投放机)开发
- iOS 15 真机调试包 DeviceSupport
- 当你在进行SDK安装更新时,遇到了一些不能安装的项目时,你可以酱紫····
- 疯狂膜拜!万字长文轻松彻底入门spring
- pyhton———使用urllib 下载文件~~过掉岁月过掉风
- SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--函数)
- 《Linux内核设计与实现》之进程
- DC-DC直流隔离升压高压输出电源模块12v24v48v转50V110V200V250V350V400V500V600V800V1000V微功率
- 机器学习笔记 --- 数学符号以及读法
- 《The Wiley Handbook of Human Computer Interaction》翻译之Part XI
- java 微信报关 V2
- 广西大学计算机仿真实验,基于Simulink的汽车动力性仿真实验设计
热门文章
- 金蝶K3采购价格管控杂谈
- 一个萌新关于电脑安装软件错误提示“1402”的应对方法
- gliffy UML破解工具
- Ubuntu查看联想笔记本无线网卡内核并安装驱动
- Windows下安装JDK,配置环境变量
- 计算机ip 地址异常,电脑显示IP地址错误怎么办|电脑无法上网提示IP地址错误的解决方法...
- 苹果ipad怎么录屏_原来苹果手机还能这样投屏!1秒小屏变大屏!太好用了
- TOGAF9-certification简介
- server2012R2VC++2015 redistributable安装出错KB2999226-x64.msu 此更新不适合你的计算机
- 深入C++库分析sync_with_stdio实现