MyBatis中获取参数值的两种方式:${} 和 #{},以及它们之间区别是什么?
2023/12/28 1:02:58
本文主要是介绍MyBatis中获取参数值的两种方式:${} 和 #{},以及它们之间区别是什么?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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中获取参数值的两种方式:${} 和 #{},以及它们之间区别是什么?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署