Day8
#{}和${}
#{}是对非字符串拼接参数的占位符,如果入参是简单数据类型,#里可以任意写,但如果入参是对象类型,则#{}里必须是对象的成员变量名称,#{}可以有效防止sql注入
#{}占位符#{}里如何看,看parameterType参数的类型
- 如果parameterType的类型是简单类型(8种基本(封装)+String)则#里随便写
- parameterType的类型是实体类型,则#{}只能是类中的成员变量的名称,而且区分大小写
{}里必须是value,但如果入参是对象类型,则{}可以替换列名和表名,存在sql注入风险,尽量少用。
${}字符串拼接或者字符串替换。
-
字符串拼接,一般用于模糊查询,建议少用,因为有sql注入的风险。
分两种情况,同样看parameterType的类型
- 如果parameterType的类型是简单类型,${}里随便写。
- 如果parameterType的类型是实体类的类型,则${}只能是类中成员变量的名称(现在很少用了)
什么是动态sql
可以定义代码片段,可以进行逻辑判断,可以进行循环处理(批量处理),是条件判断更为简单。
-
:用来定义代码片段,可以将所有的列名,或者负责的条件定义为代码片段,供使用时调用。
-
:用来引用定义的代码片段。
<!--定义代码片段--> <sql id="allColumns"> id,username,birthday,sex,address </sql> <!--引用定义好的代码片段--> <select id="getAll" resultType="users"> select <include refid="allColumns"></include> from users </select> -
:进行条件判断
-
:进行多条件拼接,在查询,删除,更新中使用。
-
:有选择地更新处理,至少更新一列。
-
:用来循环遍历,完成循环条件查询,批量删除,批量增加,批量更新
参数详解:
connection:用来指定入参类型,如果是List集合,则为list,如果是Map集合则为map,如果是数组,则为array。
item:每次循环遍历出来的值或对象
separator:多个值或对象或语句之间的分隔符
open:整个循环外边的后括号
close:真个循环外边的后括号