背景:别人写的代码,由于数据库添加了一个is_delete(0:未删除;1:已删除)字段用来做假删除,大家都知道,如果说一条数据删除了,那么肯定是不能查出来的了,因此,我的任务就是修改由于添加一个字段而引发的灾难。

问题:

我们的sql:

selecti.id,i.project_id,i.sets,i.name,i.length,i.likes,i.url,i.type,p.project_name
fromt_information as i, t_project as p
where1=1and i.project_id=p.idand i.is_delete=0<if test="name!=null and name!=''">and i.name like ('%${name}%')</if><if test="orderBy !=null and orderBy!=''">order by ${orderBy}</if><bind name="pageNum" value="(pageNum-1)*pageSize"></bind>limit ${pageNum},${pageSize}

我们用了mybatis的动态sql中的if语句:

//如果name不为空,就在上面的sql语句后面拼接上and name
<if test="name!=null and name!=''">and i.name like ('%${name}%')
</if>
下面我们来说说sql语句中的通配符---
使用SQL 通配符可以替代一个或多个字符,即模糊查询。
SQL 通配符必须与 LIKE 运算符一起使用。在 SQL 中,可使用以下通配符如下(举例都是以表person为例):
1.% 替代一个或多个字符
可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%% ) 表示
举例:
查找名字里有王的人:select * from person where name like '%王%'
查找名字里第一个字是王的人:select * from person where name like '王%'
查找名字里最后一个字是王的人:select * from person where name like '%王'
2、_ 仅替代一个字符,匹配单个任意字符,它常用来限制表达式的字符长度语句
举例:
查找名字第第一个字之后的字是静的人:select * from person where name like '_静%'
3、[charlist] 指定一个字符列(字符、字符串或范围),要求所匹配对象为它们中的任一个。
举例:
查询姓氏拼音中包含‘a’或‘b’或‘c’的人:select * from person where name like '[abc]%'
4、[^charlist]或者[!charlist] 不在字符列中的任何单一字符
举例:
查询姓氏拼音中不包含‘a’或‘b’或‘c’的人:select * from person where name like '[!abc]%'
上面通配符的一些举例都是一些最基础的,有一些更复杂的需要我们到时候动动我们灵活的小脑袋瓜排列组合一下啦~~~
下面说一下sql语句中常用的#{}和${}:
1.
#{}表示占位符,可以有效防止sql注入,使用#{}设置参数无需考虑参数类型
${}表示拼接符,无法防止sql注入,使用#{}设置参数需要考虑参数类型
2.
#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是11,那么解析成sql时的值为order by “11”, 如果传入的值是id,则解析成的sql为order by “id”。
${}将传入的数据直接显示生成在sql中。如:order by userid,如果传入的值是11,那么解析成sql时的值为order by 11, 如果传入的值是id,则解析成的sql为order by id。
3.
一般能用#的就别用$。
4.有些情况下必须使用使用#{}(,就是当我们需要拼接的变量上不能带单引号时,就必须使用${},其他情况都尽量使用#{}的方式,因为${}会有sql注入的问题):
i.动态拼接排序字段
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。
order by排序语句中,因为order by 后边必须跟字段名,这个字段名不能带引号,如果带引号会被识别会字符串,而不是字段。
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串如order by,可以这样使用:order by ${columnName};这里MyBatis不会修改或转义字符串。
ii.当sql中表名是从参数中取的情况
表名是从参数中获取的时候,由于表名不能加引号,因此不能用#{}
我在项目中遇到的问题:
如上sql大家来找一找存在的问题,大家来找茬啦!!!
揭晓答案:
selecti.id,i.project_id,i.sets,i.name,i.length,i.likes,i.url,i.type,p.project_namefromt_information as i, t_project as pwhere1=1and i.project_id=p.id<if test="name!=null and name!=''">and i.name like ('%#{name}%')</if><if test="orderBy !=null and orderBy!=''">order by ${orderBy}</if><bind name="pageNum" value="(pageNum-1)*pageSize"></bind>limit #{pageNum},${pageSize}

这里用#{}防止了sql注入

这里的第一个#{}也是防止sql注入,但是第二个为什么不需要改成#{}呢(按照idea提示进行的修改)?

还有一个问题,为什么按照现在的修改完成之后,发布之后该sql语句反而不能使用了呢???

望大神指导

【sql语句中的符号】(通配符+#{}+${})相关推荐

  1. oracle sql 符号,Oracle的SQL语句中如何处理‘’符号

    Oracle的SQL语句中如何处理'&'符号 在Oracle中,如果在sql中出现'&'符号,会被自动转义: 而被要求输入在&符号后跟随的字符串的值,例如: update ta ...

  2. SQL语句中的“@”符号的作用

    我遇到一个sql,它是这样的: CString sqlstr = "SELECT A.* FROM TTTTT A WHERE 1 = 1" " AND A.BASE = ...

  3. 03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询

    映射文件的sql语句中 #{} 和 ${} 区别以及实现模糊查询 目录 sql 语句中的 #{} #{} 模糊查询错误用法 #{} 实现模糊查询 sql 语句中的 ${} ${} 实现模糊查询 #{} ...

  4. 【MyBatis笔记】03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询

    映射文件的sql语句中 #{} 和 ${} 区别以及实现模糊查询 sql 语句中的 #{} #{} 模糊查询错误用法 #{} 实现模糊查询 sql 语句中的 ${} ${} 实现模糊查询 #{} 与 ...

  5. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  6. oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?

    sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...

  7. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  8. SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别

    原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制 ...

  9. SQL语句中between and 范围

    2019独角兽企业重金招聘Python工程师标准>>> 经过验证 SQL语句中的between 范围1 and  范伟2  语句是包括的范围1和范围2的 SQL> create ...

最新文章

  1. cmake编译出错:No CMAKE_CXX_COMPILER could be found.
  2. 住房要注意用电安全-记录一下失火
  3. 练习、C# 结构体、冒泡排序
  4. HTML5原生拖拽/拖放(drag drop)详解
  5. php 结尾,PHP“意外结束”
  6. android+图标+i_explore+无背景,Android Studio中Android Device Monitor中的File Explore不显示文...
  7. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码
  8. azure db 设置时区_将数据迁移到Azure Cosmos DB
  9. python:threading多线程模块-使用Queue模块保持线程同步
  10. pthread_cleanup_push()/pthread_cleanup_pop()的详解
  11. 【渝粤教育】广东开放大学 商务交际听说 形成性考核 (31)
  12. c语言定义函数return,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句。...
  13. Python批量下载抖音大V主页视频
  14. JS 不可逆加密后半部分,去混淆还原代码。
  15. 一个 Duang~ 的CSS3动画
  16. Delphi编程中流的使用
  17. 我在Blue Nile(蓝色尼罗河)上通过python爬取一百万颗钻石,最终选出心仪的一颗
  18. OUC暑期培训(深度学习)——第一周学习记录:深度学习和pytorch基础
  19. 非结构化数据的定义及处理方法
  20. PDF在线转Word文本软件

热门文章

  1. 虚拟机如何访问主机服务器,主机怎么访问虚拟机
  2. HTTP请求报文和响应报文
  3. STM32 时钟总结
  4. Spring MVC数据绑定 ----从入门到精通篇(三) POJO数据类型的绑定和自定义数据绑定
  5. 刺客信条奥德赛缺少dll文件_刺客信条奥德赛打不开怎么办 刺客信条奥德赛无法运行解决办法...
  6. 趣头条野蛮生长逐渐降速 后续如何提振股价走势?
  7. Windows10最新版20H2系统下载与安装
  8. 【软件工程】机票预订系统的用例图及用例说明
  9. HCIE之路-1 华为数据通信基础思维导图(不定期更新,纯个人理解,欢迎批评指正!!!)
  10. 孙茂松:机器能创造吗?