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

Mybatis的优点之一就是可以动态的使用SQL,而在相应的mapper.xml文件中编写SQL时,分别有两种动态获取参数的方式即 #{}${}

首先,介绍一下mapper.xml中mapper标签下select,delete等标签中的 parameterType属性

parameterType属性是用来控制SQL中需要传入的参数类型的属性,同样是通过不同类型的映射值来确定,这一点和resultType属性一样。

SqlSession的实例化对象的 selectList()、selectOne()方法中,第二个参数均为需要传入的Sql参数;selectMap()的第三个参数为需要传入Sql语句参数

在mybatis里,只能传入一个参数,如果想要传入多个参数,需要通过对象或者Map集合的方式传入

然后谈一谈#{}和${}的使用

1.#{}可以通过 索引#{0}(mybatis下标是从0开始),#{param1}获取第一个参数;若是只传入一个参数,可以通过#{}直接获取

2.如果传入参数类型是对象,需要在#{}中写入对象属性名;如果传入参数类型是Map集合名,需要在#{}中写入键名;来获取对应的参数

3.${}中,如果内容写入的是基本数据类型的值,则sql语句直接使用这个值;需要使用${属性名}才能获得传入对象的属性值

主要区别:

1.使用#{}时,mybatis中的sql语句会被预编译处理(此时低层应该使用的是PreparedStatement对象?),即会先将sql中的#{}用占位符?替代,并编译。

然后该sql语句在获取参数时,会调用PreparedStatement的set方法来赋值。即#{}是预编译处理

2.使用${}时,mybatis会直接将${}获得的参数值和${}替换,就是把${}替换成变量的值(在编译阶段就已经替换了)。即${}是字符串替换

当想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:ORDER BY ${columnName}

一般来说能使用#{}尽量使用#{}

原因如下:

  #{}既然是预编译处理,那么使用#{}就能够很大的程度上防止SQL注入;而${}无法防止SQL注入

原文地址:https://www.cnblogs.com/xiang9286/p/10430965.html