‍

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获取参数值的两种方式的更多相关文章

  1. MyBatis获取参数值的两种方式

    MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单 ...

  2. MyBatis_04(MyBatis获取“参数值”的两种方式)

    MyBatis获取"参数值"的两种方式 (重点!!!) MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接 , #{}的本质就是占位符赋值 ${}使用字 ...

  3. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  4. MyBatis配置数据源的两种方式

    ---------------------siwuxie095                                     MyBatis 配置数据源的两种方式         1.配置方 ...

  5. mybatis批量保存的两种方式(高效插入)

    知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...

  6. js获取url参数值的两种方式

    js获取url参数值的方法有很多,下面也为大家介绍两种.  方法一:正则分析法  function getQueryString(name) {  var reg = new RegExp(" ...

  7. struts2的action从request获取参数值的几种方式

    使用jquery框架的ajax能够方便的向后台传递参数,以$.post为例,参数有2种方式字符串和键值对:$.post(url, "name=aty&age=25")和$. ...

  8. RabbitMQ Consumer获取消息的两种方式(poll,subscribe)解析

    以下转自:http://blog.csdn.net/yangbutao/article/details/10395599 rabbitMQ中consumer通过建立到queue的连接,创建channe ...

  9. (先导)Git Api对接:获取private_token的两种方式

    " Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.在公司一般用于代码管理:开发用例管理平台时我们选择使用git来管理用例,期间使用了很多git ap ...

  10. HttpClient获取Cookie的两种方式

    转载:http://blog.csdn.net/zhangbinu/article/details/72777620 一.旧版本的HttpClient获取Cookies p.s. 该方式官方已不推荐使 ...

随机推荐

  1. 长达 1.7 万字的 explain 关键字指南!

    当你的数据里只有几千几万,那么 SQL 优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL 优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让 MySQL 查询语句又快又好是一件 ...

  2. 势如破竹的雷霆两招,微服务进阶Serverless

    ​在应用开发中,服务器的开发一直是最重要的部分之一.在服务器开发不断演进过程中,我们可以将它简单分为5个阶段: 物理机阶段->虚拟机阶段->云计算阶段->容器阶段->当前的Se ...

  3. 投资组合计算分析——R语言

    "投资组合"是指金融资产(如股票.债券和现金)的任何组合.投资组合有很多类型,包括市场投资组合和零投资投资组合.可以使用以下任何一种投资方法和原则来管理投资组合的资产分配:股息加权 ...

  4. pandas之分组操作

    在数据分析中,经常会遇到这样的情况:根据某一列(或多列)标签把数据划分为不同的组别,然后再对其进行数据分析.比如,某网站对注册用户的性别或者年龄等进行分组,从而研究出网站用户的画像(特点).在 Pan ...

  5. smtp.office365.com 无法从传输连接中读取数据: net_io_connectionclosed

    这几天发送邮件时突然会报一个错 无法从传输连接中读取数据:net_io_connectionclosed. 因使用的是 smtp.office365.com 经过查询,发现了这个 Recently, ...

  6. 信息论之从熵、惊奇到交叉熵、KL散度和互信息

    一.熵(PRML) 考虑将A地观测的一个随机变量x,编码后传输到B地. 这个随机变量有8种可能的状态,每个状态都是等可能的.为了把x的值传给接收者,需要传输⼀个3⽐特的消息.注意,这个变量的熵由下式给 ...

  7. 10分钟带你徒手做个Java线程池

    摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理. 本文分享自华为云社区<放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧>,作者:冰 ...

  8. SRAM 测试总结

    SoC随着工艺进步设计复杂度增加,embeded sram也越来越多.在40nm SoC产品Sram一般在20Mbits左右,当工艺发展到28nm时Sram就增加到100Mbits.如果考虑AI产品, ...

  9. python+folium

    建模时无意中发现了一个很好用的交互式画地图的库!!

  10. C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地

    本文将探讨如何使用c#开发基于大语言模型的私域聊天机器人落地.大语言模型(Large Language Model,LLM 这里主要以chatgpt为代表的的文本生成式人工智能)是一种利用深度学习方法 ...