MyBatis中#和$符的区别,sql注入问题,动态sql语句

MyBatis中#{}和${}的区别

  1. #{}和${}都是MyBatis提供的sql参数替换。区别是:
  2. #{}是预编译处理,${}是字符串直接替换。
  3. #{}可以防止SQL注入,${}存在SQL注入的风险,例如  “' or 1='1”
  4. 虽然存在SQL注入风险,但也有自己的适用场景,比如排序功能,表名,字段名等作为参数传入时。
  5. #{}模糊查询要搭配使用mysql内置的拼接函数concat,安全性高。模糊查询虽然${}可以完成,但是存在SQL注入,不安全。

直接替换是指:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的 set ⽅法来赋值。

$是直接替换,传入的SQL参数若遇到String类型时,不会自动加单/双引号,就会报错,必须加单/双引号才不出错。并且还有sql注入问题。不过$也有自己的使用场景,比如排序,传入desc,asc字符串时,是不需要加单/双引号的。此时就可以用$,并且这两个字符串不让用户自己传,直接给升序,降序按钮,也就避免了sql注入风险。能发生SQL注入主要还是为用户提供了输入框,用户能传参。

而#无论是Integer类型,还是String类型,都会提前预编译,预编译SQL,而且预编译SQL的性能更高。遇到String类型会自动加单/双引号。

以模糊查询为例,${}和#{}的使用区别

  • 使用${},但存在SQL注入风险。
<select id="getBookByNname" resultType="com.example.demo.entity.BookInfo">select * from book_info where book_name like '${bookName}';
</select>
  • 使用#{},更安全,更高效。
<select id="getBookByName" resultType="com.example.demo.entity.BookInfo">select * from book_info where book_name like concat('%',#{bookName},'%');
</select>

SQL注入问题${}

代码演示,所传参数后跟  ' or '1=1 。就会查出全结果集。

bookMapper.getBookByN("平凡的世界' or '1=1");  //传入参数
select * from book_info where book_name = '${bookName}'; //SQL语句

SQL日志打印:


动态 SQL 语法

1.<if>标签
  • 使用场景:当我们在输入个人信息的时候,不一定都得填写(必填项+非必填项),这时候有的参数就为空。所以在插入时就得判空。
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into userinfo {username,password,nickname,<if test="sex != null"> //test中的sex是属性,不是字段sex,</if>}birthday)values (#{username},#{password},#{nickname},<if test="sex !=null"> //test中的这里的sex是属性#{sex},</if>#{birthday})</insert>

注意 test 中的 sex,是传⼊对象中的属性,不是数据库字段。


2.<trim>标签

prefix:表示整个语句块,以prefix的值作为前缀

suffix:表示整个语句块,以suffix的值作为后缀

prefixOverrides:表示整个语句块要去除掉的前缀

suffixOverrides:表示整个语句块要去除掉的后缀

  • 如果输入参数全是非必填项。就需要if标签和trim标签相结合。
     <insert id="ss" useGeneratedKeys="true" keyProperty="id">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">username,</if> //别忘记逗号<if test="password != null">password,</if> //test中的是属性,不是字段<if test="nickname != null">nickname,</if><if test="sex != null">sex,</if><if test="birthday != null">birthday,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="username != null">#{username},</if><if test="nickname != null">#{nickname},</if><if test="sex != null">#{sex},</if><if test="birthday != null">#{birthday},</if></trim></insert>

3.<where>标签
  • 对于where后跟的参数是否为空,不清楚时。
    <select id="select" parameterType="com.example.demo.entity.UserInfo"> //parameterType为 传入的参数类型select * from usrinfo<where><if test="username != null">and username = #{username}</if><if test="userId != null">and userId = #{userId}</if><if test="sex != null">and sex = #{sex}</if></where></select>

以上标签也可以使⽤ <trim prefix="where" suffixOverrides="and"> 替换。


4.<set>标签
  • 动态update操作
    //parameterType 为传入参数的类型<update id="update" parameterType="com.example.demo.entity.UserInfo">update userinfo<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="nickname != null">nickname = #{nickname},</if><if test="sex != null">sex = #{sex},</if><if test="birthday != null">birthday = #{birthday},</if></set>where = #{id}</update>

以上标签也可以使⽤ <trim prefix="set suffixOverrides=","> 替换。


5.<foreach>标签
  • 遍历集合(如List)时,可以使用,例如批量删除等操作。
    // collection 集合类型  item集合名<delete id="deleteByIds">delete from userinfo where id in<foreach collection="list" item="item" open="(" close=")" separator=",">#{list}</foreach></delete>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/463236.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

test222

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

[论文总结] 深度学习在农业领域应用论文笔记12

文章目录 1. 3D-ZeF: A 3D Zebrafish Tracking Benchmark Dataset (CVPR, 2020)摘要背景相关研究所提出的数据集方法和结果个人总结 2. Automated flower classification over a large number of classes (Computer Vision, Graphics & Image Processing, 2008)摘要背景分割…

XSS-Lab

1.关于20关的payload合集。 <script>alert(1)</script> "><script>alert(1)</script> onclickalert(1) " onclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

我最喜欢的Dynamo节点TOP 10

今天分享下&#xff0c;我最喜爱的10个Dynmao节点&#xff0c;在某种程度上讲&#xff0c;这些是我比较常用的节点&#xff0c;当然了&#xff0c;这些仅仅是我的个人观点&#xff0c;仅供娱乐~~ 第十名 Code Block & Python Script 首先CodeBlock作为最常用的一个节点&…

数据库管理-第14期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

基于JavaWeb的物业管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88822949?spm1001.2014.3001.5503 物业管理系统 项目描述 主要功能有&#xff1a; 保安保洁管理 保修管理 房产信息管理 公告管理 管理员信息管理 业主信息管理 登录管理 技…

RCE(命令执行)知识点总结最详细

description: 这里是CTF做题时常见的会遇见的RCE的漏洞知识点总结。 如果你觉得写得好并且想看更多web知识的话可以去gitbook.22kaka.fun去看&#xff0c;上面是我写的一本关于web学习的一个gitbook&#xff0c;当然如果你能去我的github为我的这个项目点亮星星我会感激不尽htt…

Linux 软件管理(YUM RPM)

1 YUM yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&#xff0c;无须繁琐地一次次…

Qt网络编程-写一个简单的网络调试助手

环境 Windows&#xff1a;Qt5.15.2&#xff08;VS2022&#xff09; Linux&#xff1a;Qt5.12.12&#xff08;gcc) 源代码 TCP服务器 头文件&#xff1a; #ifndef TCPSERVERWIDGET_H #define TCPSERVERWIDGET_H #include <QWidget> namespace Ui { class TCPServerW…

Linux文本三剑客(2)

文章目录 一、Linux文本三剑客之awk使用方法awk 的原理实例一&#xff1a;只查看test.txt文件&#xff08;100行&#xff09;内第20到第30行的内容&#xff08;企业面试&#xff09;实例二&#xff1a;已知test.txt文件内容为 BEGIN 和 END 模块实例一&#xff1a;统计/etc/pas…

C#实现矩阵乘法

目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组&#xff0c;主要用来存储一系列数&#xff0c;例如&#xff0c;mn矩阵是排列在m行和n列中的一系列数&#xff0c;mn矩阵可与一个np矩阵相乘&#xff0c;结果…

AAAI 2024 | Adobe提出全新上下文提示学习框架CoPL,高效提升下游性能

论文题目&#xff1a;CoPL: Contextual Prompt Learning for Vision-Language Understanding 论文链接&#xff1a;https://arxiv.org/abs/2307.00910 提示学习&#xff08;Prompt Learning&#xff09;在近几年的快速发展&#xff0c;激活了以Transformer为基础的大型语言模型…