5. Mybatis获取参数值的两种方式
MyBatis 获取参数值的两种方式:${} 和 #{}
- ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
- ${}使用字符串拼接的方式拼接 sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引
- 号;但是#{}使用占位符赋值的方式拼接 sql,此时为字符串类型或日期类型的字段进行赋值时,
- 可以自动添加单引号
#{}:先编译 sql 语句,再给占位符传值,底层是 PreparedStatement 实现。可以防止 sql 注入,比较常用。
${}:先进行 sql 语句拼接,然后再编译 sql 语句,底层是 Statement 实现。存在 sql 注入现象。只有在需要进行 sql 语句关键字拼接的情况下才会用到。
Mybatis 中的 ${} 和 #{} 都是用于 SQL 语句中参数的替代。
#{} 使用的是预编译语句,用于将输入参数的值与 SQL 语句分开处理,防止 SQL 注入等安全问题,同时也有效的提高了 SQL 语句的查询性能。在 SQL 解析过程中,#{} 会将参数值进行一定的处理,比如转义特殊字符、处理成相应的数据类型等。
$ {} 在 SQL 中是直接替换为参数的值,不做任何转义和修改。这种方式的优点是灵活性强,可以用于不同的场景,但是这种方式存在 SQL 注入的风险,因为输入的参数被直接拼接到 SQL 语句中,如果不充分防范,很容易被攻击者利用。
一般情况下,使用 #{} 是比较安全的方式,但是如果在某些特殊的情况下,确实需要使用 ${},比如在动态 SQL 中,将一些动态的 SQL 拼接到主 SQL 中。
综上所述,#{} 适用于大多情况下,比如查询、更新等;而 ${} 适用于某些特殊情况,比如动态 SQL,但是需要注意 SQL 注入的问题。
使用方式示例:
-
#{}:
<select id="getUserById" resultType="User">
select * from user where id = #{id}
</select>
Map<String, Object> param = new HashMap<>();
param.put("id", 1);
User user = sqlSession.selectOne("getUserById", param);
-
${}:
<!-- 动态 SQL 标签 -->
<select id="getUserByCondition" resultType="User">
select * from user where
<if test="name != null">
name = '${name}'
</if>
<if test="age != null">
and age = '${age}'
</if>
</select>
Map<String, Object> param = new HashMap<>();
param.put("name", "John Doe");
param.put("age", 20);
User user = sqlSession.selectOne("getUserByCondition", param);
1. 单个字面量类型的参数
若 mapper 接口中的方法参数为单个的字面量类型
此时可以使用\({}和#{}以任意的名称获取参数的值,注意\){}需要手动加单引号
2. 多个字面量类型的参数
- 若 mapper 接口中的方法参数为多个时
- 此时 MyBatis 会自动将这些参数放在一个 map 集合中,以 arg0,arg1...为键,以参数为值;以
- param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问 map 集合的键就可以获取相
- 对应的值,注意${}需要手动加单引号
3. map 集合类型的参数
若 mapper 接口中的方法需要的参数为多个时,此时可以手动创建 map 集合,将这些数据放在 map 中
只需要通过\({}和#{}访问map集合的键就可以获取相对应的值,注意\){}需要手动加单引号


代码实现:
@Test
public void testCheckLoginMap() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("username", "zhangsan");
map.put("password", "123456");
User user = mapper.checkLoginMap(map);
System.out.println(user);
sqlSession.close();
}
4. 实体类类型的参数
若 mapper 接口中的方法参数为实体类对象时 , 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值
注意 :
- ${} 需要手动添加单引号
根据属性名获取属性值
这里的属性名指的是实体类当中
get后面的名字 , 就像 getAge 而这里的属性名值得就是 age , 大小写无所谓
5. 使用@Param 标识参数
可以通过@Param 注解标识 mapper 接口中的方法参数, 此时会将这些参数放在 map 集合中,以@Param 注解的 value 属性值为键,以参数为值;以 param1,param2...为键,以参数为值;只需要通过${}和#{}访问 map 集合的键就可以获取相对应的值
注意${}需要手动加单引号
5. Mybatis获取参数值的两种方式的更多相关文章
- MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单 ...
- MyBatis_04(MyBatis获取“参数值”的两种方式)
MyBatis获取"参数值"的两种方式 (重点!!!) MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接 , #{}的本质就是占位符赋值 ${}使用字 ...
- java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...
- MyBatis配置数据源的两种方式
---------------------siwuxie095 MyBatis 配置数据源的两种方式 1.配置方 ...
- mybatis批量保存的两种方式(高效插入)
知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...
- js获取url参数值的两种方式
js获取url参数值的方法有很多,下面也为大家介绍两种. 方法一:正则分析法 function getQueryString(name) { var reg = new RegExp(" ...
- struts2的action从request获取参数值的几种方式
使用jquery框架的ajax能够方便的向后台传递参数,以$.post为例,参数有2种方式字符串和键值对:$.post(url, "name=aty&age=25")和$. ...
- RabbitMQ Consumer获取消息的两种方式(poll,subscribe)解析
以下转自:http://blog.csdn.net/yangbutao/article/details/10395599 rabbitMQ中consumer通过建立到queue的连接,创建channe ...
- (先导)Git Api对接:获取private_token的两种方式
" Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.在公司一般用于代码管理:开发用例管理平台时我们选择使用git来管理用例,期间使用了很多git ap ...
- HttpClient获取Cookie的两种方式
转载:http://blog.csdn.net/zhangbinu/article/details/72777620 一.旧版本的HttpClient获取Cookies p.s. 该方式官方已不推荐使 ...
随机推荐
- Win系统下的免杀思路(总结非教程)
1.简介 在安全厂商日趋成熟的背景下,编写免杀马的难度和成本日益增长.好用新兴的开源项目在短时间内就被分析并加入特征库.笔者调研了部分开源项目,其中也有项目做了类似的分析 [1],目前能够免杀的项目初 ...
- list Api
类型 名称 void add(String item)将指定的项目添加到滚动列表的末尾. void add(String item, int index)将指定的项目添加到由索引指示的位置的滚动列表中 ...
- MySQL--索引的数据结构
1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页面,便可以快速定位到需要的文章,mysql中也是一样的道理,进行数据查找时, ...
- AtCoder Beginner Contest 061 - D Score Attack
给定一张边带权的有向图.从节点\(1\)出发,每经过一条边一次,得分加上这条边的边权.(可以多次经过,多次累加 必须在点\(n\)结束游戏 判断是否能使得分无限大,如果否,求最大得分. sol 题目所 ...
- Java设计模式 —— 代理模式
15 代理模式 15.1 代理模式概述 Proxy Pattern: 给某一个对象提供一个代理或占位符,由代理对象来控制对原对象的访问. 代理对象是客户端和目标对象的之前的桥梁,它接收来自客户端的请求 ...
- DRF的Serializer组件(源码分析)
DRF的Serializer组件(源码分析) 1. 数据校验 drf中为我们提供了Serializer,他主要有两大功能: 对请求数据校验(底层调用Django的Form和ModelForm) 对数据 ...
- 3.2 构造器、this、包机制、访问修饰符、封装
构造器 构造器:在实例化的一个对象的时候会给对象赋予初始值,因此我们可以通过修改构造器,来改变对象的初始值,构造器是完成对象的初始化,并不是创建对象 我们也可以创建多个构造器实现不同的初始化,即构造器 ...
- Mastering Regular Expressions(精通正则表达式) 阅读笔记:第一章,概念
Real Scenario(现实场景) Here's the scenario: you're given the job of checking the pages on a web server ...
- pngquant 在 Windows 上压缩带中文路径的 png 图片
pngquant 是一个优秀的 png 压缩工具,但是在 Windows 上不支持目录中带有 unicode 字符(例如中文)的文件.所以要用一个折中的办法(即标准输入)让 pngquant 压缩目录 ...
- 2022-11-30:小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为“好e“ : 当且仅当这个e字符和r、d相邻 例如“reeder“只有一个“好e“,前两个e都不是“好e“,只有第三个
2022-11-30:小红拿到了一个仅由r.e.d组成的字符串 她定义一个字符e为"好e" : 当且仅当这个e字符和r.d相邻 例如"reeder"只有一个&q ...