Mybatis #和$获取参数值的区别以及@param的使用场景
Mybatis 中$与#的区别
1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.
2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.
3 使用#可以很大程度上防止sql注入。(语句的拼接)
4 但是如果使用在order by 中就需要使用 $.
5 在大多数情况下还是经常使用#,但在不同情况下必须使用$.
我觉得#与的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而{}穿入值,sql解析时,参数是不带引号的。
一 : 理解mybatis中 $与#
在mybatis中的$与#都是在sql中动态的传入参数。
eg:select id,name,age from student where name=#{name} 这个name是动态的,可变的。当你传入什么样的值,就会根据你传入的值执行sql语句。
二:使用$与#
#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
name-->cy
eg: select id,name,age from student where name=#{name} -- name='cy'
select id,name,age from student where name=${name} -- name=cy
Mybatis @param使用场景
请参考如下博客
https://blog.csdn.net/u012702547/article/details/96963374
总结:
1. Mybatis在解析mapper.xml文件时,针对通过#{}引用的参数,是通过?占位符和PreparedStatement.setObject()方式来组装sql语句的,可以方式sql注入。比如传入的参数 username="xyz", password="nihao' or '1'='1"下边的方式可以可以防止sql注入。
String sql = "delete from user where username = ? and password = ?";PreparedStatement pstmt = con.prepareStatement(sql);//添加参数pstmt.setString(1, username);pstmt.setString(2, password);//进行查询rs = pstmt.executeQuery();
而通过${}引用的参数,是直接通过字符串拼装的方式构造最终执行的sql语句。就像下边这样:
stmt =con.createStatement();String sql = "delete from garytb where username = '"+username+"' and password = '"+password+"'";rs = stmt.executeQuery(sql);
2. #{}如果是字符串类型,会自动加上引号。而${}不会,mybatis底层只是会做一个字面量的拼接。
//username="xyz"<select id="test" >SELECT * FROM USERS WHERE USERNAME = #{userName};</select>
比如上边的mapper.xml文件中定义的语句,最后拼装的结果是
SELECT * FROM USERS WHERE USERNAME ='xmy';
而如果上边的参数替换成${userName},则效果就变成了:
SELECT * FROM USERS WHERE USERNAME =xmy;
执行的时候就会报错。
3. 有的时候参数是表明或列明时,拼接后的字符串表明和列明肯定不能有引号,这时${}就派上用场了。需要注意的是,使用${}时,定义mapper接口时,需要在参数名字前使用@param。
@Mapper
public interface UserMapper {List<User> getAllUsers(@Param("order_by")String order_by);
}<select id="getAllUsers" resultType="xxx.User">select * from user order by ${order_by} desc
</select>
再比如,我们希望使用select in()语句,这个时候也是只能使用${}。
@Mapper
public interface UserMapper {List<User> getAllUsers(@Param("order_by")String userNames);
}//userNames="'Bob','Tom','Jerry'";
<select id="getAllUsers" resultType="xxx.User">select * from user where userName in(${userNames})
</select>
Mybatis #和$获取参数值的区别以及@param的使用场景相关推荐
- SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)
P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...
- Mybatis获取参数值的方式
一. Mybatis获取参数值的各种情况 1.mapper接口方法的参数为单个字面量的类型 2.mapper接口方法的参数有多个 3.手动把参数放在map集合中 4.mapper接口方法的参数是实体类 ...
- MyBatis获取参数值的两种方式以及传参情况
MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式:${}和#{} 传参情况 演示环境 1.单个字面量类型的参数 2.多个字面量类型的参数 3.map集合类型的参数 4.实体类类型 ...
- mybatis与php,浅谈mybatis中的#和$的区别
浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...
- jdbc,mybatis,hibernate各自优缺点及区别
jdbc,mybatis,hibernate各自优缺点及区别 先比较下jdbc编程和hibernate编程各自的优缺点. JDBC: 我们平时使用jdbc进行编程,大致需要下面几个步骤:1,使用jdb ...
- iBatis 2.x 和 MyBatis 3.0.x 的区别
简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区别,以及从 iBatis 向 MyBatis 移植时需要注意的地方.通过对本文的学习,读者基本能够了解 MyBatis ...
- java in查询无法查询到数据(mybatis字符#与字符$的区别)
mybatis字符#与字符$的区别 问题:使用in查询查询出一批数据,in查询的参数是字符串拼接的.调试过程中,把mybatis输出的sql复制到navicat中,在控制台将sql的参数也复制出来,替 ...
- 【mybatis】mybatis中 的# 和 $的区别
mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html 转载于:https://www.cnblogs. ...
- mybatis映射器${}和#{}的区别
mybatis映射器${}和#{}的区别 转载于:https://www.cnblogs.com/liyuchen/p/7850185.html
最新文章
- Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...
- python长整型字节数_Python将整数转换为16字节字节
- vue根据不同权限显示图片_vue多级权限组件的实现
- oracle数据库物理结构包含,Oracle - 数据库物理结构
- 【PHP】网站防止QQ拦截防红跳转代码
- Codeforces Beta Round #8 C. Looking for Order 状压dp
- java连接Oracle数据库
- 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·007【uni-app和vue.js基础快速上手】
- labelme批量json_to_dataset转换
- 多目标跟踪-Multi-Object Tracking
- 初识Hadoop入门介绍
- iOS图形学(四):iOS中的绘图框架
- 购入计算机主机怎么入账,出纳记账软件更换主机电脑时如何备份附件资料?
- 捷联惯导算法与组合导航原理讲义捷联惯导基础知识剖析目录
- java打印堆栈信息_Java 打印堆栈的几种方法
- QTP网管自动化测试框架
- PHP除数取余数,php相除取余数的实现方法
- SQL语句--简单的函数书写举例(3)
- 2022云和恩墨大讲堂·苏州站成功举办,论道数智化时代下国产数据库的技术创新与实践
- 如何用帮助中心自助服务页面提高客户使用体验