MyBatis中获取参数值的两种方式

${}:的本质就是字符串拼接 #{}:的本质就是占位符赋值

① 使用${}占位符,在字符串拼接的方式拼接sql,若为字符串类型或为日期类型的字段进行赋值时,需要手动加单引号

② 使用#{}占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,自动添加单引号

MyBatis中的#{}和${}的区别是什么? --前者动态参数,后者字符串拼接

首先,MyBatis提供的#号占位符和$占位符,都是实现动态SQL的一种方式,通过这两种方式把参数传递给xxxMapper.XML

在执行SQL操作之前,MyBatis会对这两种占位符进行动态解析

‘#’号占位符,等同于jdbc里面的?号占位符,它相当于向PreparedStatement中的预处理语句中设置参数,而PreparedStatement中的sql语句是预编译的,SQL语句中使用了占位符规定了SQL语句的机构,并且在设置参数的时候,如果有特殊字符,会自动进行转义,所以使用#号占位符还可以防止SQL注入。

而使用$占位符的方式进行传参,相当于直接把参数拼接到原始的SQL里面,MyBatis不会对它进行特殊处理

<!-- User getUserByUsername(String username); -->
<select id="getUserByUsername" resultType="User">
<!-- 通过#{}占位符 获取参数 填充 -->
select * from user where username = #{username}; <!-- 通过${}占位符 获取参数需要加单引号
select * from user where username = '${username}';
-->
</select>

所以$和#最大的区别在于,前者是动态参数,后者是占位符,动态参数无法防止SQL注入的问题,所以在实际应用中,应该尽可能的使用#号占位符

另外,$占位符,可以应用在一些动态SQL场景中,比如动态传递表名,批量删除等

模糊查询:

<!-- 模糊查询 -->
<!-- List<User> getUserByLike(@Param("username") String username); -->
<select id="getUserByLike" resultType="user">
<!-- select * from user where username like '%${username}%'; -->
<!-- select * from user where username like concat('%',#{username},'%'); -->
select * from user where username like "%"#{username}"%";
</select>

动态传递表名

<!-- List<User> getUserByTableName(@Param("tableName") String tableName); -->
<select id="getUserByTableName" resultType="User">
select * from ${tableName};
</select>

批量删除

<!-- 批量删除 -->
<!-- Integer deleteMore(@Param("ids") String ids); -->
<delete id="deleteMore">
delete from user where id in(${ids});
</delete>

虽然用$和#都能实现Mybatis获取参数,并进行SQL拼接,但是大多数还是建议使用#号占位符并且大部分情况下都是使用@Param注解配合#号获取参数,还能有效的避免SQL注入问题。

  • 模糊查询可以使用like concat
    <!--List<SysUser> selectAllocatedList(SysUser sysUser);-->
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
SELECT DISTINCT u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
LEFT JOIN sys_user_role ur oN u.user_id = de.dept_id
LEFT JOIN sys_role r ON r.role_id = ur.role_id
WHERE u.del_flag = '0' AND r.role_id = #{roleId}
<if test="userName != null and userName != ''">
AND u.user_name LIKE CONCAT('%', #{userName}, '%')
</if>
<if test="phoneNumber != null and phoneNumber != ''">
AND u.phonenumber LIKE CONCAT('%', #{phoneNumber}, '%')
</if>
</select>
  • 批量删除可以用都可以使用foreach标签等
    <!--Integer deleteUserByUserIds(@Param("userIds")Long[] userIds);-->
<update id="deleteUserByIds" parameterType="Long">
UPDATE sys_user
SET del_flag = '2' WHERE user_id IN
<foreach collection="array" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</update>

MyBatis中获取参数值的两种方式:${} 和 #{},以及它们之间区别是什么?的更多相关文章

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

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

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

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

  3. MyBatis中id回填的两种方式

    在一种场景下需要刚刚插入数据的ID,如果数据少可以先看数据库,记下ID,但数据很多,假设一万个用户并发,每个用户都插入自己的ID,就很难记下来. 下面给定一个场景: 1 User user = new ...

  4. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  5. web.config文件中配置数据库连接的两种方式

    web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报    分类: 数据库(74)  在网站开发 ...

  6. 设置Mybatis打印调试sql的两种方式

    http://blog.csdn.net/gao36951/article/details/53641432 ********************************************* ...

  7. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  8. jQuery中开发插件的两种方式

    jQuery中开发插件的两种方式(附Demo) 做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数 ...

  9. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  10. javascript总结40:DOM中操作样式的两种方式

    1 DOM中操作样式的两种方式 1 通过元素的style属性 注意: 通过style属性设置样式时,css中要写单位的属性,在js代码中也要加单位 //html <div id="bo ...

随机推荐

  1. lattice crosslink开发板mipi核心板csi测试dsi屏lif md6000 fpga

    1. 概述 CrossLink开发板,是用Lattice的芯片CrossLink 家族系列的,LIF-MD6000-6JM80I.该芯片用于桥接视频接口功能,自带2路MIPI硬核的功能,4 LANE  ...

  2. 解密Prompt系列16. LLM对齐经验之数据越少越好?LTD & LIMA & AlpaGasus

    LLM Agent中间插个队,总结下指令微调.对齐数据相关的方案,已经凑够7篇论文可以召唤神龙啦!论文都是以优化指令样本为核心,Data-Centric的观点比较一致:指令微调也就是对齐阶段的数据质量 ...

  3. bash: accelerate: command not found

    py AIGC Stable Diffusion文生图Lora模型微调实现虚拟上装详情     实验手册 实验报告   3. 安装Diffusers 进入PAI-DSW开发环境. 登录PAI控制台. ...

  4. Linux 中如何安全地抹去磁盘数据?

    哈喽大家好,我是咸鱼 离过职的小伙伴都知道,离职的时候需要上交公司电脑,但是电脑里面有许多我们的个人信息(聊天记录.浏览记录等等) 所以我们就需要先把这些信息都删除,确保无法恢复之后才上交 即有些情况 ...

  5. HTTP协议中四种交互方法学习

    一.Get Get用于获取信息,注意,他只是获取.查询数据,也就是说它不会修改服务器上的数据.而根据HTTP规范, 获取信息的过程是安全和幂等的.GET请求的数据会附在URL之后,以"?&q ...

  6. VLAN虚拟网络

    VLAN 名称:vlan 虚拟局域网(virtual LAN) 用途 由于交换机所有的端口都在同一广播域,只要发送广播会产生大量的垃圾信息,同时会有病毒的安全隐患(病毒). 为了解决上述问题 1.物理 ...

  7. C# 在流行度指数上将超过Java

    2023年10月最新的TIOBE编程语言流行指数表明:C#和Java之间的差距从未如此之小,目前,差异仅为1.2%,如果趋势保持这种状态,C#将在大约2个月内超过Java,TIOBE Software ...

  8. Codeforces Round 905 Div 1 (CF1887)

    A1. Dances (Easy version) 把 \(a,b\) 序列都从小到大排序,\(a\) 贪心删大的,\(b\) 贪心删小的,二分答案并 \(O(n)\) \(\text{check}\ ...

  9. 使用 Java 对比两个PDF文档之间的差异

    不论是在团队写作还是在个人工作中,PDF 文档往往会经过多次修订和更新.掌握 PDF 文档内容的变化对于管理文档有极大的帮助.通过对比 PDF 文档,用户可以快速找出文档增加.删除和修改的内容,更好地 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (125)-- 算法导论10.6 6题

    六.用go语言,任意有根树的左孩子右兄弟表示法中每个结点用到三个指针: leftchild.rightsibling 和parent.对于任何结点,都可以在常数时间到达其父结点,并在与其孩子数呈线性关 ...