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. PHP对关联数组(键值对数组)遍历循环

    PHP对关联数组循环遍历 $arr=array('yxb'=>20,'ylg'=>21,'lgj'=18); foreach($arr as $name=>$value) { ech ...

  2. Go学习笔记3

    九.错误处理 1.defer+recover机制处理异常错误 展示错误: 发现:程序中出现错误/恐慌以后,程序被中断,无法继续执行. 错误处理/捕获机制: 内置函数recover: 2.自定义错误 需 ...

  3. IOS 16 无法打开开发版或者企业版本APP解决方案 - 需要开启开发者模式

    在IOS 16系统上,打开开发版本APP,或者企业版本APP时,会看到如下的提示信息: 需要开启开发者模式, xxx 需要在开发者模式下运行. 启用开发者模式前, 此App不可用 这个时由于IOS 1 ...

  4. MySQL 分表查询

    分表是一种数据库分割技术,用于将大表拆分成多个小表,以提高数据库的性能和可管理性.在MySQL中,可以使用多种方法进行分表,例如基于范围.哈希或列表等.下面将详细介绍MySQL如何分表以及分表后如何进 ...

  5. Vue 中的 Ajax

    1.1 使用代理服务器 1.1.1 方式一 在 vue.config.js 中添加如下配置: devServer:{ proxy:"http://localhost:5000" } ...

  6. 「codeforces - 185D」Visit of the Great

    link. 简单提一下做法,注意到 \(k^{2^a}\equiv k^{2^b}\equiv-1\equiv (-1)^{2^{b-a}}=1\pmod{(k^{2^a}+1,k^{2^{b}}+1 ...

  7. Kubernetes集群管理面板的安装及使用

    Kubernetes集群管理面板的安装及使用 1.前言 若海的腾讯云Lighthouse组建跨地域Kubernetes集群,让我成功体验到了Kubernetes集群诸多优点,但是非技术出生的我,长时间 ...

  8. 自定义MyBatis拦截器更改表名

    by emanjusaka from ​ https://www.emanjusaka.top/archives/10 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址. 自定义MyBati ...

  9. 8.12 dp模拟赛总结

    考场概况: 开考发现题目竟然不保证按难度顺序排序QAQ 正序开题, \(T1\) 显然是数位 \(dp\) 然而没学过不会写,顺手打了 \(30pts\) 暴力走人. \(T2\) 期望 \(dp\) ...

  10. 使用 redis 实现分布式接口限流注解 RedisLimit

    前言 很多时候,由于种种不可描述的原因,我们需要针对单个接口实现接口限流,防止访问次数过于频繁.这里就用 redis+aop 实现一个限流接口注解 @RedisLimit 代码 点击查看RedisLi ...