前言

还记得当初从北京回来的时候,跟着倪文杰师姐做JavaITOO的一卡通模块,我亲姐贾梦洁带着我一块做,期间,我遇到了一个特别奇葩的问题,就死我要实现Mybatis的模糊查询,根据当时亲姐教给我方法 select * from table where contions like #{something},就是解决不了问题,一点东西都查不出来,还报错。后来,我终于明白,世界上还有${}这个东西。只不过等到今天才去把它发出来,有点亡羊补牢的感觉,希望还能帮到一些像我一样的新手。

#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。

  1. <!--根据id查询用户信息 -->
  2. <select id="findUserById"parameterType="int"resultType="user">
  3. select * from user where id =#{id}
  4. </select>

使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行Java类型和jdbc类型的转换。#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。说得再通俗一点,当我们使用#{}的时候,发出的sql中,#{}代表的内容会自动被加上“”,而${}是直接把东西取出来直接用举个例子:

id="liweizhong",#{id}输出后是"liweizhong",而${value}输出是liweizhong

${}和#{}不同,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:

  1. <!--根据名称模糊查询用户信息 -->
  2. <select id="selectUserByName"parameterType="string"resultType="user">
  3. select * from user whereusername like '%${value}%'
  4. </select>

如果本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很多。

如果使用占位符号则必须人为在传参数中加%

List<User> list =userMapper.selectUserByName("%管理员%");

如果使用${}原始符号则不用人为在参数中加%,直接在mapper配置文件里面接受这个参数就可以了,显得更加的方便,可是sql注入问题?

List<User>list = userMapper.selectUserByName("管理员");

再比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:

  1. ORDER BY ${columnName}

这样要执行的sql是:

  1. ORDER BY columnName

如果使用#{}将无法实现此功能,因为如果这样的话,执行的sql就变成了

  1. ORDER BY "columnName"

那样,你可以试一下,会报错的,无效列名,sql语句报错:

最新文章

  1. 深入理解Javascript面向对象编程
  2. poj3107 树形dp
  3. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
  4. Linux console on LCD
  5. [Forward]Visual Guide: Setting up My Sites in SharePoint 2013
  6. npm创建和发布模块
  7. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
  8. 201521123056 《Java程序设计》第11周学习总结
  9. 01快速入门-04-Map、Set和iterable(ES6)
  10. 删除一个目录及其子目录下的所有.svn文件
  11. 对抗生成网络-图像卷积-mnist数据生成(代码) 1.tf.layers.conv2d(卷积操作) 2.tf.layers.conv2d_transpose(反卷积操作) 3.tf.layers.batch_normalize(归一化操作) 4.tf.maximum(用于lrelu) 5.tf.train_variable(训练中所有参数) 6.np.random.uniform(生成正态数据
  12. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
  13. js中提示框闪退问题
  14. 在浏览器中输入www.baidu.com后执行的全部过程
  15. PendingIntent的使用
  16. Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)
  17. ThinkPad X1 Carbon 2018 Windows 10无法关机的问题
  18. SAC处理命令transfer的一些详细介绍
  19. redirect和forward的区别
  20. remote: ERROR: missing Change-Id in commit message footer

热门文章

  1. 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools:
  2. Python数据分析笔记目录
  3. Apache Torque的使用
  4. [转]MySQL索引背后的数据结构及算法原理
  5. Python 学习小结
  6. elastic search使用总结
  7. 鼠标上下滑动总是放大缩小页面,按住ctrl+0
  8. JS 深浅拷贝
  9. intellij idea Maven 创建项目时出现的一些问题
  10. VS2013全攻略