深入理解MyBatis中的动态SQL语句
有时候,静态的SQL语句并不能满足应用程序的需求。我们可以根据一些条件,来动态地构建 SQL语句。 例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后
<p>有时候,静态的SQL语句并不能满足应用程序的需求。我们可以根据一些条件,来动态地构建 SQL语句。</p>
例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作。我们可能需要根据用户选择的条件来构建动态的SQL语句。如果用户提供了任何一个条件,我们需要将那个条件添加到SQL语句的WHERE子句中。
!以下内容基于自己建的表和类!
1.
对应的sql映射文件,如下所示:
映射接口:
public interface DynamicSqlMapper{ List
测试方法:
@Testpublic void test_searchCourses1(){
SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();
DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);
Map
LocalDate date = LocalDate.of(2019, 1, 10);map.put("startDate", date);
List
courses.forEach(System.out::println);
} catch (Exception e) {e.printStackTrace();}}
2.choose,when 和 otherwise 条件 有时候,查询功能是以查询类别为基础的。首先,用户需要先选择是通过讲师查询,还是课程名称查询,还是开始时间查询。然后根据选择的查询类别,输入相应的参数,再进行查询。
例如,页面中有一个下拉列表,可以选择查询的类别,可以选择根据讲师查询、根据课程名查询、根据时间查询等等,选择了列表之后,再输入关键字进行查询。
MyBatis提供了
注意:mysql中now()表示当前时间 Oracle需要使用sysdate
对应的sql映射文件,如下所示:
测试方法:
@Testpublic void test_searchCourses2(){
SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();
DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);
Map
List
courses.forEach(System.out::println);
} catch (Exception e) {e.printStackTrace();}}
MyBatis计算
3.Where 条件 有时候,所有的查询条件应该是可选的。在需要使用至少一种查询条件的情况下,可以直接使用WHERE子句。如果有多个条件,我们需要在条件中添加AND或OR。MyBatis提供了
例如,在查询课程界面,假设所有的查询条件是可选的。
注意,
映射文件:
测试方法:
@Testpublic void test_searchCourses3(){
SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();
DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);
Map
List
courses.forEach(System.out::println);
} catch (Exception e) {e.printStackTrace();}}
4.
映射文件:
prefix表示有一个if成立则插入where语句,没有if成立,就会去掉where直接查询suffix表示后缀,和prefix相反
suffixOverrides="and"表示如果最后生成的sql语句多一个and,则自动去掉.prefixOverrides的意思是处理前缀,和suffixOverrides相反
测试方法:
@Testpublic void test_searchCourses4(){
SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();
DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);
Map
List
courses.forEach(System.out::println);
} catch (Exception e) {e.printStackTrace();}}
5.foreach 循环 另外一个强大的动态SQL语句构造标签是
假设查询tutor_id为 1,3,6的讲师所教授的课程,我们可以传递一个tutor_id组成的列表给映射语句,然后通过
映射文件:
映射接口:
public interface DynamicSqlMapper{ List
测试方法:
@Testpublic void test_searchCoursesByTutors(){
SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();
DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);
Map
List
map.put("tutorIds", tutorIds);
List
courses.forEach(System.out::println);
} catch (Exception e) {e.printStackTrace();}}
和上面同样的功能,使用
测试方法保持不变。
6.set 条件,专用于UPDATE更新操作
这里,如果
测试方法:
@Testpublic void test_updateStudent(){
SqlSession sqlSession = null;try {sqlSession = MyBatisSqlSessionFactory.openSession();
DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class);
Student student = new Student();student.setStudId(45);student.setEmail("xx@558idc.com");
mapper.updateStudent(student);
sqlSession.commit();
} catch (Exception e) {e.printStackTrace();}}