代码直接放在Github仓库【https://github.com/Damaer/Mybatis-Learning 】,可直接运行,就不占篇幅了。

1.#{}占位符

1.#{}占位符可以用来设置参数,如果传进来的是基本类型,也就是(string,long,double,int,boolean,float等),那么#{}里面的变量名可以随意写,什么abc,xxx等等,这个名字和传进来的参数名可以不一致。

2.如果传进来的是pojo类型,那么#{}中的变量名必须是pojo的属性名,可以写成属性名,也可以写属性名.属性名

参数是int,不需要设置parameterType

<delete id="deleteStudentById" >
delete from student where id=#{XXXdoukeyi}
</delete>

parameterTypepojo类,如果使用pojo类型作为参数,那么必须提供get方法,也就是框架在运行的时候需要通过反射根据#{}中的名字,拿到这个值放到sql语句中,如果占位符中的名称和属性不一致,那么报ReflectionException

<insert id="insertStudent" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
</insert>

3.#{}占位符不能解决的三类问题:

动态表名不可以用#{} :Select * from #{table}

动态列名不可以用#{} : select #{column} from table

动态排序列不可以用#{} : select * from table order by #

注意:不能这样写:

<insert id="insertStudent" parameterType="Student">
insert into student(name,age,score) values(#{Student.name},#{Student.age},#{Student.score})
</insert>

否则会报一个错误(会将Student当成一个属性),所以我们类名就直接省略不写就可以了:

### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'Student' in 'class bean.Student'

2.${}拼接符

1.如果传进来的是基本类型,也就是(string,long,double,int,boolean,float等),那么#{}里面的变量名必须写value

<delete id="deleteStudentById" >
delete from student where id=${value}
</delete>

2.如果传进来的是pojo类型,那么#{}中的变量名必须是pojo的属性名,可以写成属性名,也可以写属性名.属性名但是由于是拼接的方式,对于字符串我们需要自己加引号。

<insert id="insertStudent" parameterType="Student">
insert into student(name,age,score) values('${name}',${age},${score})
</insert>

与上面一样,不能将类名写进来:

<!--这是错误的-->
<insert id="insertStudent" parameterType="Student">
insert into student(name,age,score) values('${Student.name}',${Student.age},${Student.score})
</insert>

3.${}占位符是字符串连接符,可以用来动态设置表名,列名,排序名

动态表名 :Select * from ${table}

动态列名 : select ${column} from table

动态排序 : select * from table order by $

4.${}可以作为连接符使用,但是这样的方式是不安全的,很容易发生sql注入问题,sql注入问题可以参考https://blog.csdn.net/aphysia/article/details/80465600

<select id="selectStudentsByName" resultType="Student">
select id,name,age,score from student where name like '%${value}%'
</select>

3.#{}与${}区别

  • 1.能使用#{}的时候尽量使用#{},不使用${}
  • 2.#{}相当于jdbc中的preparedstatement(预编译),${}是直接使用里面的值进行拼接,如果解释预编译和直接拼接,我想可以这么理解预编译:比如将一个#{name}传进来,预编译是先将sql语句编译成为模板,也就是我知道你要干什么,假设这个sql是要查询名字为xxx的学生信息,那无论这个xxx里面是什么信息,我都只会去根据名字这一列查询,里面无论写的是什么,都只会当做一个字符串,这个类型在预编译的时候已经定义好了。
  • 3.${}就不一样,是将语句拼接之后才确定查询条件/类型的,那么就会有被注入的可能性,有些人故意将名字设置为删除条件,这时候sql就变成删除操作了。
  • 所以我们一般类似模糊查询都是用#{}拼接
<select id="selectStudentsByName" resultType="Student">
select id,name,age,score from student where name like '%' #{name} '%'
</select>
  • 但是对于order by 我们是用不了#{}的,因为用了这个就会被自动转换成字符串,自动加引号,这样语句就不生效了。
<select id="selectStudentsByName" resultType="Student">
select id,name,age,score from student order by #{column}
</select> <!--编译出来的结果如下:-->
select * from table order by 'column'

那我们需要怎么处理呢?我们只能使用${}MyBatis不会修改或转义字符串。这样是不安全的,会导致潜在的SQL注入攻击,我们需要自己限制,不允许用户输入这些字段,或者通常自行转义并检查。所以这必须过滤输入的内容。

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

Mybatis【9】-- Mybatis占位符#{}和拼接符${}有什么区别?的更多相关文章

  1. Mybatis之占位符与拼接符

    1.占位符 1.1  含义: 在持久化框架中,为了将约束条件中的可变参数从sql中分离出来,在原有的参数位置使用特殊的标记来标记该位置,后期通过代码给sql传递参数(即实现sql与代码分离开).这个特 ...

  2. mybatis的#{}占位符和${}拼接符的区别

    #{}占位符:占位 如果传入的是基本类型,那么#{}中的变量名称可以随意写 如果传入的参数是pojo类型,那么#{}中的变量名称必须是pojo中的属性.属性.属性- ${}拼接符:字符串原样拼接 如果 ...

  3. Mybatis mapper文件占位符设置默认值

    如果要设置占位符默认值的话:需要进行 设置 org.apache.ibatis.parsing.PropertyParser.enable-default-value 属性为true启用占位符默认值处 ...

  4. .NET 基础 一步步 一幕幕[运算符、占位符、转义符]

      运算符.占位符.转义符 好吧,在五局全胜之后,终于升到了三个钻,距离一个星星还有一大段距离,忽然想起来今天的博客还没写,果断坑队友,来写博客了....感觉以后还是每天更新一篇比较好.要不晚上就该熬 ...

  5. c#基础学习(0626)之占位符、转义符

    占位符 使用方法:先挖个坑,再填个坑. 使用占位符需要注意的地方: 1.你挖了几个坑,就应该填几个坑,如果填多了,没效果,如果填少了,出现异常 异常是指:语法上没有任何错误,只不过再运行的期间,由于某 ...

  6. SQL注入、占位符拼接符

    一.什么是SQL注入 官方: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意 ...

  7. Java使用占位符拼接字符串

    大家知道,在C#编程中,可以用占位符来拼接字符串,用起来非常的方便. 特别是需要进行大量的参数拼接的时候,比如: Console.WriteLine(String.Format("该域名{0 ...

  8. Mybatis第六篇【配置文件和映射文件再解读、占位符、主键生成与获取、Mapper代理】

    配置文件和映射文件再解读 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理 ...

  9. Spring与Mybatis整合占位符无法解析问题

    问题:写了一个新的dao接口,进行单元测试时提示: Initialization of bean failed; nested exception is org.springframework.bea ...

  10. MyBatis中使用#和$书写占位符有什么区别?

    #将传入的数据都当成一个字符串,会对传入的数据自动加上引号:$将传入的数据直接显示生成在SQL中.注意:使用$占位符可能会导致SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该 ...

随机推荐

  1. github代理加速

    终端命令行 支持终端命令行 git clone , wget , curl 等工具下载.支持 raw.githubusercontent.com , gist.github.com , gist.gi ...

  2. 18 Python如何操作文件?

    本篇是 Python 系列教程第 18 篇,更多内容敬请访问我的 Python 合集 1 打开文件 通常使用内置的 open(文件路径, 模式, encoding="utf-8") ...

  3. SoftCLT: 时间序列的软对比学习《Soft Contrastive Learning for Time Series》(时间序列、时序分类任务、软对比学习、实例上软赋值距离差异、数据空间非嵌入空间度量相似性)

    2024年6月25日,10:11,好几天没看论文了,一直在摸鱼写代码(虽然也没学会多少),今天看一篇师兄推荐的. 论文:Soft Contrastive Learning for Time Serie ...

  4. 【QT性能优化】QT性能优化之QT性能优化实战 QML优化 QT高性能 QT6系列视频课程 QT6 性能优化实战 QT高性能 QT原理源码 QML优化 GUI绘图原理源码

    QT性能优化实战视频课程 QT6 Widgets高性能应用编程 1.课前考试 2.字符串优化(上) 3.字符串优化(下) 4.绘图优化(上) 5.绘图优化(下)  6.QT界面优化(上) 7.QT界面 ...

  5. 初步认识uboot

    1. uboot下载地址 ftp://ftp.denx.de/pub/u-boot/

  6. MySQL笔记--数据库定时备份与恢复

    利用crontab定时.利用mysqldump备份 编写sh启动脚本时记得赋予执行权限(x) 如果没有mysqldump命令执行,基于centos7 yum -y install mysql-clie ...

  7. Thinkphp原生验证码的使用

    Thinkphp原生验证码的使用 一. 获取验证码 public function verifyCode(){ $captcha = new \think\captcha\Captcha(); $ca ...

  8. .NET高级调试 - 3.12 sosex实用的几个命令介绍

    简介 sosex是sos的一个拓展,主要目的是将一些繁琐的排查过程脚本化,比如探测死锁,设置断点等.更加方便快捷协助我们排查问题. 比较可惜的是,在.net core中不可用,作者已经不更新了. 更多 ...

  9. Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复(精华)

    Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复 炎炎夏夜客户机房空调意外故障,前端ESXI物理服务器由于温度过高都自保关机,存储和SAN没有自保关机.上班修复空调后, ...

  10. KubeSphere DevOps 流水线入门指南

    作者:赵海亮,浙江大学计算机专业四年级在读博士生,研究方向为云计算.边缘计算.分布式系统等. 虽然 KubeSphere 能够将我们从 yaml 文件的编写中解放出来,但是项目上云仍然十分繁琐. 此外 ...