动态sql多用于解决查询条件不确定的情况。
在程序运行期间,根据用户提交的多种可能的查询条件进行查询,提交的查询条件不同,动态生成和执行的sql语句也不同。
常用的动态标签有if,where,choose,foreach等。
1.if标签
对于该标签的执行,当test的值为true时,会将其包含的sql片段拼接到其所在的sql语句中(有条件的选择拼接)
关键代码(在dao层的接口和实现类添加searchStudentsIf(Student student)方法,在映射文件StudentMapepr.xml添加以下代码)
3.使用map封装查询条件
在if和where标签中,多个查询条件都封装到一个Student对象的属性中去了。
但在实际开发中,可能有些条件无法封装到通一个对象中去,这时就要采用map类型进行封装和参数传递。
关键代码(在dao层的接口和实现类添加searchStudentsMap(Map map)方法,在映射文件StudentMapepr.xml添加以下代码)
select * from student
and age between #{ageStart} and #{ageEnd}
4.choose标签
类似于java的开关语句switch…case…。的功能
关键代码(在dao层的接口和实现类添加searchStudentsChoose(Student student)方法,在映射文件StudentMapepr.xml添加以下代码)
select * from student
and studentname like '%' #{sname} '%'
and age=#{age}
and 1!=1
5.foreach标签
用于实现数组和集合类型的输入参数的遍历
i.遍历普通数组
collection属性表示要遍历的集合类型。
若为数组,则使用open,close,sparator这些属性用于对遍历内容进行sql拼接
关键代码(在dao层的接口和实现类添加searchStudentsEachArray(Object[] ids)方法,在映射文件StudentMapepr.xml添加以下代码)
select * from student
where id in
#{myid}
ii.遍历泛型为基本类型的List
collection属性表示要遍历的集合类型。
若为数组,则使用open,close,sparator这些属性用于对遍历内容进行sql拼接
关键代码(在dao层的接口和实现类添加searchStudentsEachList(List list)方法,在映射文件StudentMapepr.xml添加以下代码)
select * from student
where id in
#{myid}
iii.遍历泛型为自定义类型的List
collection属性表示要遍历的集合类型。
若为数组,则使用open,close,sparator这些属性用于对遍历内容进行sql拼接
关键代码(在dao层的接口和实现类添加searchStudentsEachListStu(List list)方法,在映射文件StudentMapepr.xml添加以下代码)
select * from student
where id in
#{stu.sid}
6.sql标签
用于定义sql片段供其他sql标签复用。
若其他标签要使用该sql片段,则需要使用include子标签。
sql标签可以定义sql语句的任何部分,所以include子标签可以放在动态sql的任何位置,最终拼接出需要的sql语句。
sql标签的使用代码如下
select * from student
...