首页 > 其他分享 >MyBatis中获取参数值的两种方式:${} 和 #{},以及它们之间区别是什么?

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

时间:2023-12-27 21:56:56浏览次数:33  
标签:username 参数值 获取 user SQL MyBatis 占位 id

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>

标签:username,参数值,获取,user,SQL,MyBatis,占位,id
From: https://www.cnblogs.com/CodeYHY/p/17931507.html

相关文章

  • xpath的一次性同时获取a标签和p标签的内容?(下篇)
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python网络爬虫数据提取的问题,一起来看看吧。他的需求就是:xpath的一次性同时获取a标签和p标签的内容。上一篇文章中,大佬们已经给出了一个答案,可是数据获取下来后发现和网页上的顺序展示并不一致,这一篇文......
  • Jmeter —— 接口之间关联调用(获取上一个接口的返回值作为下一个接口的请求参数)
    正则表达式:具体如何操作:1.草稿保存,此请求的响应数据的id为发布总结的请求参数draft_id2.草稿保存的响应数据3.在草稿保存的请求中,添加后置处理器-正则表达式提取器,提取响应数据的id信息4.发布总结请求中,填写请求参数5.最终,可正常发布最后如果你想学习软件测......
  • 记录一次 OpenStack 集群在创建虚机后无法获取 IP 的问题
    现象所有的组件状态都是正常工作的,DHCP服务正常工作,在个个虚拟网络设备端口抓包,发现OpenVSwitch上DHCP包可以通行,虚机获取DHCPDiscover请求可以正常发出,但是无法收到回包。抓包命令tcpdump-ieth0udpport67orport68-vvv抓包点网络节点上对应的网络空间的的......
  • 如何快速获取抖音新用户/用户信息
    一、快速获取抖音用户信息意味着什么?抖音是一款热门的短视频社交平台,拥有海量用户和高度活跃的商业生态。用户逐渐增多,庞大的用户也意味着隐藏着庞大的市场和商机,用户的偏好、关注点等信息都时刻影响着商业的效益,谁可以获取到这个信息差就可以抢占先机,其中获取到新用户或者是已存在......
  • 如何快速获取抖音新用户/用户信息
    一、快速获取抖音用户信息意味着什么?抖音是一款热门的短视频社交平台,拥有海量用户和高度活跃的商业生态。用户逐渐增多,庞大的用户也意味着隐藏着庞大的市场和商机,用户的偏好、关注点等信息都时刻影响着商业的效益,谁可以获取到这个信息差就可以抢占先机,其中获取到新用户或者是已存......
  • 一个完整Python实战项目:selenium识别验证码实现自动登录,自动操作浏览器获取某东数据
    最近都没啥时间,很久没更新了。今天分享一下,如何用selenium识别验证码,实现自动登录以及获取数据。目标:某东话不多说直接开始准备工作环境Python3.10Pycharm模块使用importrandomimporttimefromseleniumimportwebdriverimportpyautoguii......
  • mybatis在读取配置文件,创建SqlSessionFactory对象时。需要对密码进行解密,再连接数据库
    1、我看了网上很多的方法,主要是说通过新建一个jdbc.properties来获取数据库连接池。但是我试了并没有作用。 2、解决办法:简单粗暴。先用后代码读取原有的mybatis-configuration.xml,然后将密码进行解密后,设值到xml中。最后把解密的xml作为源。去生成一份新的xml文件,把心的xml......
  • 简易mybatis实现
    packagecom.ibatis.io.entity;​​publicclassUser{ privateIntegerid; privateStringname;​ privateIntegerage;​ publicIntegergetId(){   returnid; }​ publicvoidsetId(Integerid){   this.id=id; }​ ......
  • 08-Informatica_schema获取元数据
    数据库的元数据即数据库对象的数据,如表,库,的属性数据等,存放在informatica——schema数据库中,已虚拟表的形式存在,只能读不能写一、获取元数据的方法查询INFORMATION_SCHEMA数据库表。其中包含MySQL数据库服务器所管理的所有对象的相关数据使用SHOW语句。用于获取数据库......
  • 获得JD商品评论 API 如何实现实时数据获取
    一、背景介绍随着互联网的快速发展,电商平台如雨后春笋般涌现,其中京东(JD)作为中国最大的自营式电商平台之一,拥有庞大的用户群体和丰富的商品资源。为了更好地了解用户对商品的反馈,京东开放了商品评论的API接口,允许开发者实时获取商品评论数据。本文将介绍如何通过JD商品评论API实现实......