大多数情况下,都是使用#{}
1.${}和#{}
#{}
占位符,可以有效地防止SQL注入
- 传参大部分使用
#{}
,底层使用的是PreparedStatement
对象,是安全的数据库访问,能有效防止SQL注入 - 当
parameterType
即传入参数的类型是八种基本类型的时候
#{}
中的内容书写没有限制
使用?
<select id="getOneById" parameterType="_int" resultType="string">
select name
from student
where id=#{zhang}/*这里面的内容可以随便写,不写都可以*/
</select>
- 当
parameterType
即传入参数的类型是实体类的类型时
#{}
中的内容必须是类中成员变量的名称,要区分大小写
<insert id="insert" parameterType="student">
insert into student (name,email,age)
values (#{name},#{email},#{age})/*这三个参数都是实体类的属性*/
</insert>
${}
字符串拼接
- 一般用于模糊查询(
like
)中,但是有SQL注入的风险 - 当
parameterType
即传入参数的类型是八种基本类型的时候
3.5.1及以下的版本,${}
只能写value
3.5.1以上的版本,${}
随便写
<select id="getByName" parameterType="string" resultType="student">
select id,name,email,age
from student
where name like '%${name}%'/*随便写*/
</select>
- 当
parameterType
即传入参数的类型是实体类的类型时
${}
中的内容必须是类中成员变量的名称,要区分大小写
${}
字符串替换
2.优化模糊查询,防SQL注入
Mapper接口中定义方法
List<Users> getByName(String name);
映射文件中
<!--
优化模糊查询
#{}中的内容写法还是那样
-->
<select id="getByName" parameterType="string" resultType="student">
select id,name,email,age
from student
where name like concat('%',#{name},'%')
</select>
3.${}字符串替换
${}
字符串替换 —— ${}
少有的优势(灬ꈍ ꈍ灬)
Mapper接口中定义方法
List<Users> getByNameOrAge(
@Param("columnName")//这里面可以随便写,但是要求与参数名相同
String columnName
@Param("columnValue")
String columnValue);
当传入参数多于1个的时候省略parameterType
属性
<select id="getByName" resultType="student">
select id,name,email,age
from student
where ${columnName} like concat('%',#{columnValue},'%')
</select>
这样可以减少重复的代码