发布时间:2023-06-29 11:00
本期以最常用的根据id批量删除数据为例:
接口设计1:List类型单参数
Integer deleteByIds(List<Integer> ids);
接口设计2:Array数组类型单参数
Integer deleteByIds(Integer[] ids);
接口设计3:可变长度参数
Integer deleteByIds(Integer... ids);
此以接口2为例子mapper.xml配置如下:
<delete id=\"deleteByIds\">
DELETE FROM t_user WHERE id IN (
<foreach collection=\"array\" item=\"id\" separator=\",\">
#{id}
foreach>
)
delete>
关于
节点的配置说明:
collection
:需要被遍历的对象,当抽象方法的参数只有1个且没有添加@Param
注解时,如果参数类型是List
集合,则取值为list
,如果参数类型是数组,则取值为array
;当抽象方法的参数超过1个,就一定添加了@Param
注解,则取值为@Param
注解配置的参数值;
如下图接口所示:
item
:遍历过程中的每一个元素数据,当前属性可以自定义值表示元素数据的名称,在
节点的子级,使用#{}
占位符时,就可以使用这个名称来表示数据;
separator
:遍历生成的代码片段中,各元素数据之间的分隔符号;
open
/ close
:遍历生成的代码片段的最左侧字符串/最右侧字符串。
补充知识点:关于#{}和${}格式的占位符
MyBatis允许在配置SQL语句时使用#{}
和${}
这2种格式的占位符来表示参数值。
简单原则:在原本使用JDBC技术编程时,编写SQL语句时可以写问号(?
)的位置,都使用#{}
格式的占位符,不可以写问号的位置,必须使用${}
格式的占位符!
使用#{}
格式的占位符,只能表示某个值!MyBatis在处理时,会通过预编译的方式进行处理,即:先使用问号对占位符表示的值进行占位,并将整个SQL语句交由MySQL进行编译相关的处理(包括词法分析、语义分析、编译),当编译完成后,再将值代入到编译成功的SQL语句中一并执行。简单来说,使用#{}
格式的占位符时,最终处理机制是使用了预编译的!所以,使用这种格式的占位符时,在编写SQL时不需要关心值的数据类型的问题,并且,不存在SQL注入的风险!
使用${}
格式的占位符,可以表示SQL语句中的任意片段!MyBatis在处理时,会先将${}
格式占位符对应的值拼接到SQL语句中,然后再将SQL语句交由MySQL进行编译相关处理,也就是说,${}
格式占位符的值在编译之前就已经代入到SQL语句中了!很显然,在处理${}
格式的占位符时,没有(也不可能)使用预编译!所以,使用这种格式的占位符时,需要自行在SQL语句中考虑数据类型的问题,例如字符串类型的值需要使用一对单引号框住!另外,还存在SQL注入的风险!
好了,以上就是本期内容,有不懂的可以留言或者私信喔!