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

打印 上一主题 下一主题

主题 885|帖子 885|积分 2655

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

${}:的本质就是字符串拼接       #{}:的本质就是占位符赋值
① 使用${}占位符,在字符串拼接的方式拼接sql,若为字符串类型或为日期类型的字段进行赋值时,需要手动加单引号
② 使用#{}占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,自动添加单引号
MyBatis中的#{}和${}的区别是什么? --前者动态参数,后者字符串拼接

首先,MyBatis提供的#号占位符和$占位符,都是实现动态SQL的一种方式,通过这两种方式把参数传递给xxxMapper.XML
在执行SQL操作之前,MyBatis会对这两种占位符进行动态解析
‘#’号占位符,等同于jdbc里面的?号占位符,它相当于向PreparedStatement中的预处理语句中设置参数,而PreparedStatement中的sql语句是预编译的,SQL语句中使用了占位符规定了SQL语句的机构,并且在设置参数的时候,如果有特殊字符,会自动进行转义,所以使用#号占位符还可以防止SQL注入。
而使用$占位符的方式进行传参,相当于直接把参数拼接到原始的SQL里面,MyBatis不会对它进行特殊处理
  1. <select id="getUserByUsername" resultType="User">
  2.    
  3.     select * from user where username = #{username};
  4.    
  5. </select>
复制代码
所以$和#最大的区别在于,前者是动态参数,后者是占位符,动态参数无法防止SQL注入的问题,所以在实际应用中,应该尽可能的使用#号占位符
另外,$占位符,可以应用在一些动态SQL场景中,比如动态传递表名,批量删除等
模糊查询:
  1. <select id="getUserByLike" resultType="user">
  2.    
  3.    
  4.     select * from user where username like "%"#{username}"%";
  5. </select>
复制代码
动态传递表名
  1. <select id="getUserByTableName" resultType="User">
  2.     select * from ${tableName};
  3. </select>
复制代码
批量删除
  1. <delete id="deleteMore">
  2.     delete from user where id in(${ids});
  3. </delete>
复制代码
虽然用$和#都能实现Mybatis获取参数,并进行SQL拼接,但是大多数还是建议使用#号占位符并且大部分情况下都是使用@Param注解配合#号获取参数,还能有效的避免SQL注入问题。

  • 模糊查询可以使用like concat
  1.    
  2.     <select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
  3.         SELECT DISTINCT u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
  4.         FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
  5.                         LEFT JOIN sys_user_role ur oN u.user_id = de.dept_id
  6.                         LEFT JOIN sys_role r ON r.role_id = ur.role_id
  7.         WHERE u.del_flag = '0' AND r.role_id = #{roleId}
  8.         <if test="userName != null and userName != ''">
  9.             AND u.user_name LIKE CONCAT('%', #{userName}, '%')
  10.         </if>
  11.         <if test="phoneNumber != null and phoneNumber != ''">
  12.             AND u.phonenumber LIKE CONCAT('%', #{phoneNumber}, '%')
  13.         </if>
  14.     </select>
复制代码

  • 批量删除可以用都可以使用foreach标签等
  1.    
  2.     <update id="deleteUserByIds" parameterType="Long">
  3.         UPDATE sys_user
  4.         SET del_flag = '2' WHERE user_id IN
  5.         <foreach collection="array" item="userId" open="(" separator="," close=")">
  6.             #{userId}
  7.         </foreach>
  8.     </update>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表