有时候,固定的SQL语句不能够满足我们的应用需求。我们需要在标准的基础上建立动态的查询语句。例如,在WEB的应用程序中,在标准的基础上,提供一个或多个输入选项或执行搜索。为了执行这些函数,我们需要在可选项的基础上建立动态查询语句。如果用户输入了多个标准的值,我们需要添加到WHERE的语句后。MyBatis提供子这些参数这实现动态语言:
现在我们你想这样的一种场景,我在界面上有一个下拉框可供于选择教师的信息,然后,在课程的名字是个文本框,可以输入想要查找的课程,还有就是选择开始时期和结束日期。当用户点击查询的按钮时,我们需要显示课程的列表信息,这个时候我们调用过程如下:
1) 查询教师的信息
2) 查询输入的课程的名字,如果什么都没有查找到的话那么就返回所有的课程信息。
3) 查询课程的开始时间和结束时间,以用户输入的时间来查询。
查找课程的信息,我们可以使用下面的方法。
public interface CourseMapper
{
List searchCourses(Map map);
}
public void searchCourses()
{
Map map = new HashMap();
map.put("tutorId", 1);
map.put("courseName", "%java%");
map.put("startDate", new Date());
CourseMapper mapper = sqlSession.getMapper(CourseMapper.class);
List courses = mapper.searchCourses(map);
for (Course course : courses) {
System.out.println(course);
}
这个将会生成的语句是:SELECT *FROM COURSES WHERE TUTOR_ID= ? AND
NAME like ? AND START_DATE >= ?。这就是使用动态的SQL语句,更容易去查询。
有时候,查询的功能需要根据查询的类型来查找。第一个,用户需要选择是否需要通过教师或课程或开始时间可结束时间来查询。MyBatis提供了
MyBatis在执行上面的语句时,如果第一种情况为True的话,那么就要添加SQL的语句中。如果没有找到适合的条件,那么就会执行<otherwise>的语句。
有时候查询的标准可能需要被选择。在例子中,至少有一个查询的条件是要被添加的,就如WHERE就是需要加入到查询语句中。同时,查询的语句还要添加AND或OR的限制条件。MyBatis就是提供了
在下面的例子中,我们想像这样的情况,那就是如果if的条件成立的话,那就会执行WHERE的语句。
就如大家看到的,如果if语句返回的true,那么WHERE就会插入到查询语句中。当然,如果WHERE语句中已经有了AND或OR的字符,那么if中的AND或OR就自动去掉,或我们查找的是只有中间一个if的语句成立,那么一样的AND的前缀也是会去掉的。
这里的
其它一个动态的的SQL,那就是
现在我们想要教师课程的信息,只要查找教师的tutor_id的ID是1,2,3和6的。我们可以使用
select id="searchCoursesByTutors" parameterType="map"
resultMap="CourseResult">
SELECT * FROM COURSES
OR tutor_id=#{tutorId}
public interface CourseMapper
{
List searchCoursesByTutors(Map map);
}
public void searchCoursesByTutors()
{
Map map = new HashMap();
List tutorIds = new ArrayList();
tutorIds.add(1);
tutorIds.add(3);
tutorIds.add(6);
map.put("tutorIds", tutorIds);
CourseMapper mapper =
sqlSession.getMapper(CourseMapper.class);
List courses = mapper.searchCoursesByTutors(map);
for (Course course : courses)
{
System.out.println(course);
}
}
当然我们也可以使用IN的字段。
update students
name=#{name},
email=#{email},
phone=#{phone},
where stud_id=#{id}