#{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止   sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, ${} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${} 括号中只能是 value。

下面举个例子来说明这两个的区别:

代码上来先:

<!-- 通过ID查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User">
select * from user where id = #{v}
</select> <!-- //根据用户名称模糊查询用户列表
#{} select * from user where id = ? 占位符 ? == '五'
${} select * from user where username like '%五%' 字符串拼接 -->
<select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User">
select * from user where username like '%${value}%'
</select>
<select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User">
select * from user where username like "%"#{v}"%"
</select>

上面是 user 类对应的 user.xml 文件,用于编写 sql 语句,避免了硬编码。

id 为 findUserByUsername1 的采用的是 ${} 占位符,id 为findUserByUsername2 采用的是 #{} 占位符,

前者生成的 sql 为 select * from user where username like ‘%XXX%’;

后者生成的 sql 语句是 select * from user where username like "%"'XXX'"%",(这样的格式我还没在 sql 中写过,但是的确能 run)

(XXX 是调用该查询是传入的参数)注意这两者的不同,前者不能防止 sql 注入,后者能防止。

Mybatis 中 sql 语句的占位符 #{} 和 ${}的更多相关文章

  1. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  2. MyBatis中使用#和$书写占位符有什么区别?

    #将传入的数据都当成一个字符串,会对传入的数据自动加上引号:$将传入的数据直接显示生成在SQL中.注意:使用$占位符可能会导致SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该 ...

  3. mybatis中sql语句传入多个参数方法

    1 使用map <select id="selectRole" parameterType="map" resultType="RoleMap& ...

  4. log4j打印mybatis执行sql,将占位符换成真实的参数输出

    背景: 在我日常码代码的时候,由于对mybatis的动态sql,比较依赖,并且有时候需求复杂,导致sql较长,而且参数众多,当出现问题是,需要将sql,放到navicat里面去执行查看结果,但是对于复 ...

  5. MyBatis中sql语句

    一.select <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String&qu ...

  6. mybatis中sql语句必须用${}而不能不用#{}的情况

    在mybatis中如果我们使用#{}的方式编写的sql时,#{} 对应的变量自动加上单引号 ' ' 例如: select * from #{param} 当我们给参数传入值为user时,他的sql是这 ...

  7. Mybatis中sql语句中的in查询,一定要判断null的情况

    不严谨的写法,可能会报错:in (),这种情况不符合mysql的语法. select from loanwhere LOAN_ID in <foreach item="item&quo ...

  8. 使用PreparedStatement执行SQL语句时占位符(?)的用法

    1.Student数据库表 ID  name gender       2.Java代码 public static void main(String[] args) { int _id=1; Str ...

  9. mybatis中SQL语句运用总结

    union 连接查询  连接两个表后会过滤掉重复的值 <resultMap id="BaseResultMap" type="com.sprucetec.pay.e ...

随机推荐

  1. 20155308 加分项——C语言实现Linux的pwd命令

    20155308 加分项--C语言实现Linux的pwd命令 实现要求 学习pwd命令 什么是pwd pwd' 代表的是'Print Working Directory'(打印当前目录).如它的名字那 ...

  2. [agc010D]Decrementing-[。。。思考题]

    Description 传送门 Solution 真是够神秘的啊... Alice和Bob两个真的城会玩. 不过本题一个暗示挺明显的.就是黑板上所有数不论何时gcd为1. 考场上我以为会很复杂,结果. ...

  3. day5 二值化

    1.otsu二值化 # coding=utf-8 import cv2 import numpy as np from matplotlib import pyplot as plt #1.读入图像 ...

  4. MySQL主从失败报错误: Got fatal error 1236

    一.问题原因及报错误信息 由于MySQL主库意外重启,导致从库无法同步报错如下: 登录从库查看主从同步的错误信息 [root@--- mysql]# vim mysqld-error.log -- : ...

  5. mysql 创建外键时发生错误的原因和解决方法

    可以去网上查看错误号,就能知道到底哪里出错了 https://zhidao.baidu.com/question/359868536.html 这里1452对应的错误是因为建立外键的表中还有数据,所以 ...

  6. Maven学习(九)-----定制库到Maven本地资源库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  7. exe4j 使用记录(一):下载、安装及注册

    一.下载 exe4j下载地址:https://www.ej-technologies.com/download/exe4j/files 进入下载页面,可以选择exe4j版本. 选择完成后,下载即可. ...

  8. 二维DCT变换

    DCT(Discrete Consine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩.经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是 ...

  9. win2003系统网络安装——基于linux+pxe+dhcp+tftp+samba+ris

    原文发表于:2010-09-16 转载至cu于:2012-07-21 一.原理简介 PXE(preboot execute environment)工作于Client/Server的网络模式,支持工作 ...

  10. 多用户在线FTP程序

    项目名:多用户在线FTP程序 一.需求 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在f ...