mybatis 框架动态传入参数${}和#{}之间的区别
动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉下mybatis里#{}与${}的用法:
在动态sql解析过程,#{}与${}的效果是不一样的:
#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
如以下sql语句
select * from user where name = #{name};
会被解析为:
select * from user where name = ?;
可以看到#{}被解析为一个参数占位符?。
${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
如以下sql语句:
select * from user where name = ${name};
当我们传递参数“sprite”时,sql会解析为:
select * from user where name = "sprite";
可以看到预编译之前的sql语句已经不包含变量name了。
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
#{}与${}的区别可以简单总结如下:
- #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
- ${}将传入的参数直接显示生成在sql中,不会添加引号
- #{}能够很大程度上防止sql注入,${}无法防止sql注入
- ${}一般用于传输数据库的表名、字段名等
要实现动态调用表名和字段名,就不能使用预编译了,需添加statementType="STATEMENT"。如下
<select id="getUser" resultType="java.util.Map" parameterType="java.lang.String" statementType="STATEMENT">
select
${columns}
from ${tableName}
where COMPANY_REMARK = ${company}
</select>
mybatis 框架动态传入参数${}和#{}之间的区别的更多相关文章
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- JavaWeb_(Mybatis框架)动态sql_七
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- MyBatis,动态传入表名,字段名的解决办法
转载:http://luoyu-ds.iteye.com/blog/1517607 今天做项目,遇到的问题就是需求修改数据表的记录,而且字段名都不是固定的,也就是说是需要通过参数传入的, 本来这也不是 ...
- MyBatis框架——动态SQL
MyBatis 作为⼀个“半⾃动化”的 ORM 框架,需要开发者⼿动定义 SQL 语句. 在业务需求⽐较复杂的情 况下,⼿动拼接 SQL 语句的⼯作量会⾮常⼤,为了适⽤于不同的业务需求,往往需要做很多 ...
- java Mybatis框架动态SQL
1.if+where <select id="getgoods" resultType="Goods" > select * from goods ...
- PHP如何动态传入参数
首先需要说明的是,URL写作/index.php/xx/b/c可以直接被index.php文件接受,而不用做任何额外的操作 但是如果需要在URL中隐藏index.php的话,才需要伪静态重写规则,将^ ...
- JavaWeb_(Mybatis框架)Mapper动态代理开发_三
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- JavaWeb_(Mybatis框架)关联查询_六
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- JavaWeb_(Mybatis框架)输入和输出参数_五
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
随机推荐
- Spring+MyBatis纯注解零XML整合(4)
不得不说,利用XML作为配置文件是一个非常好的想法,它可以轻松地实现配置集中化,而且修改之后无需再次编译.然而,由于大多数情况下开发者基本都会拿到程序的源码,加之对于各种XML配置文件一般情况下也只有 ...
- javascript将算法复杂度从O(n^2)做到O(n)
compare the difference of two giving array, return results: 1. elements in both array, 2. elements o ...
- stingray后端开发
stingray可是化后端开发架构 任何web应用的后端职能都是一样的:业务数据的增删改查.后端语言多种多样,但是唯一不变的就是SQL,你用Java也好,PHP,Python也好,最终操作数据库都是一 ...
- mysql系统变量
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html Table 5.2 System Variable Summar ...
- Ajax的优缺点及工作原理?
定义和用法: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).Ajax 是一种用于创建快速动态网页的技术.Ajax 是一种在无 ...
- Sql server中依据存储过程中的部分信息查找存储过程名称的方法【视图和Function】
1.查询的语句: select a.id,b.name,a.*,b.* from syscomments a join sysobjects b on a.id=b.id where b.xtype= ...
- 【Linux】shell编程案例
一.随机生成字符文件名 1.需求描述: 使用for循环在/usr/test目录下创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串test,案例名称如下: 以下为示例: 2.代 ...
- tihs 关键字
//this关键词 /*调用类中的属性 调用类中的方法或构造方法 调用当前对象,调用自己的方法,可以省略. */ //http://blog.sina.com.cn/s/blog_71f6c19801 ...
- DLib库Base64编解码示例
代码 #include <iostream> #include <fstream> #include <sstream> #include <string&g ...
- Docker安装和常用命令
Docker安装 Docker的安装可以参考 https://docs.docker.com/ 下面的 Get Docker / Docker CE / Linux, 需要关注的主要是CentOS和U ...