MyBatis进阶干货知识
#{}和${}
#{}:预编译SQL,占位的方式
${}:即使SQL,直接拼接
⭐一般不使用${},是为了防止SQL注入问题
1、#{}和${}的用法
我们可以以降序查询的例子来看结果
1、#{}降序排序
以List<InfoXml>来当返回值
写SQL语句
进行测试,结果如下:
⭐如果我们以#{}进行降序排序,会显示错误,因为#{}使预编译的,自动带""
2、${}降序排序
以List<InfoXml>来当返回值
写SQL语句
进行测试,结果如下:
⭐我们以${}进行降序排序,代码反而是可以通过的,因为${}是即时SQL,直接拼接的,不会带""
2、#{}和${}的区别
- #{}:预编译处理, ${}:字符直接替换
- #{} 可以防⽌SQL注⼊, ${}存在SQL注⼊的⻛险, 查询语句中, 可以使⽤ #{} ,推荐使⽤ #{}
- 但是⼀些场景, #{} 不能完成, ⽐如 排序功能, 表名, 字段名作为参数时, 这些情况需要使⽤${}
- 模糊查询虽然${}可以完成, 但因为存在SQL注⼊的问题,所以通常使⽤mysql内置函数concat来完成
标签
<if>标签
以List<InfoXml>来当返回值
写SQL语句
进行测试,结果如下:
<trim>标签
- prefix:表⽰整个语句块,以prefix的值作为前缀
- suffix:表⽰整个语句块,以suffix的值作为后缀
- prefixOverrides:表⽰整个语句块要去除掉的前缀
- suffixOverrides:表⽰整个语句块要去除掉的后缀
以List<InfoXml>来当返回值
写SQL语句
进行测试,结果如下:
<where>标签
以List<InfoXml>来当返回值
写SQL语句
进行测试,结果如下:
<foreach>标签
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符串
以List<InfoXml>来当返回值
写SQL语句
进行测试,结果如下:
<include>标签
在xml映射⽂件中配置的SQL,有时可能会存在很多重复的⽚段,此时就会存在很多冗余的代码
我们可以对重复的代码⽚段进⾏抽取,将其通过 <sql> 标签封装到⼀个SQL⽚段,然后再通过
<include> 标签进⾏引⽤
- <sql> :定义可重⽤的SQL⽚段
- <include> :通过属性refid,指定包含的SQL⽚段
以Integer来当返回值
写SQL语句
进行测试,结果如下: