一、动态SQL Dynamic-SQL
-
动态SQL语句:条件需求不一样的时候,对应sql语句执行结果也不一样。
- 根据逻辑判断条件,选择执行不同的SQL语句,实现动态SQL语句
- 举例说明:在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作。
-
xml配置文件中使用动态SQL语句:MyBatis通过使用,,,,元素提供了对构造动态SQL语句的高级别支持。
-
条件标签:通过条件判断,嵌入SQL语句。满足条件则为true,执行嵌入的SQL语句;否则不执行。
-
特点1:每一个if标签都会执行,进行条件判断
-
特点2:if标签中嵌套的sql语句中,头或者尾多余的关键字(or,and,in等mybatis都会自动删除第一个或者最后一个多余的)
假定有一个课程搜索界面,设置了讲师(Tutor)下拉列表框,课程名称(CourseName)文本输入框,开始时间(StartDate)输入框,结束时间(EndDate)输入框,作为搜索条件。 假定课讲师下拉列表是必须选的,其他的都是可选的。 当用户点击搜索按钮时,需要显示符合条件的列表数据。 对应的sql映射文件,如下所示: <!-- 独立的Course封装映射 --> <resultMap type="Course" id="CourseResult"> <id column="course_id" property="courseId" /> <result column="name" property="name" /> <result column="description" property="description" /> <result column="start_date" property="startDate" /> <result column="end_date" property="endDate" /> </resultMap> <!-- 查询Course的select语句,里面加入了if条件判断 --> <!-- 接口中抽象方法参数为map集合,预编译#{表中列名}中查询条件的列名tutorId和参数map集合中存放的key值tutorId保持一致 --> <select id="searchCourses" parameterType="map" resultMap="CourseResult"> SELECT * FROM COURSES WHERE TUTOR_ID= #{tutorId} <if test="courseName != null"> AND NAME LIKE #{courseName} </if> <if test="startDate != null"> AND START_DATE >= #{startDate} </if> <if test="endDate != null"> <!-- 将特殊字符用<![CDATA[ 特殊字符 ]]>标识,解析xml时候将特殊字符看为String字符串 --> AND END_DATE <![CDATA[ <= ]]> #{endDate} </if> </select> 映射接口: public interface DynamicSqlMapper{ List<Course> searchCourses(Map<String, Object> map); } 测试方法: @Test public void test_searchCourses1(){ SqlSession sqlSession = null; try { sqlSession = MyBatisSqlSessionFactory.openSession(); DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class); Map<String,Object> map = new HashMap<String,Object>(); map.put("tutorId", 1); map.put("courseName", "%Java%"); LocalDate date = LocalDate.of(2019, 1, 10); map.put("startDate", date); List<Course> courses = mapper.searchCourses(map); courses.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } } 結果:可以通过日志输出结果知道,if条件判断满足那个条件,就会结果会显示哪个SQL语句 SELECT * FROM COURSES WHERE TUTOR_ID= ? AND NAME like ? AND START_DATE >= ?。
-
-
:相当于if,else if和else的关系
-
如果when标签中的条件判断,只执行第一个满足条件判断中嵌套sql语句;都不满足,则执行otherwise中的嵌套sql语句
注意:mysql中now()表示当前时间 oracle需要使用sysdate <select id="searchCourses" parameterType="map" resultMap="CourseResult"> SELECT * FROM COURSES <choose> <when test="searchBy == 'Tutor'"> WHERE TUTOR_ID = #{tutorId} </when> <when test="searchBy == 'CourseName'"> WHERE name like #{courseName} </when> <otherwise> WHERE start_date >= sysdate </otherwise> </choose> </select> 测试方法: @Test public void test_searchCourses2(){ SqlSession sqlSession = null; try { sqlSession = MyBatisSqlSessionFactory.openSession(); DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class); Map<String,Object> map = new HashMap<String,Object>(); // map.put("searchBy", "Tutor"); // map.put("tutorId", 1); map.put("searchBy", "CourseName"); map.put("courseName", "%MyBatis%"); List<Course
-