Mybaits-动态SQL,自定义类型结果集ResultSet,Map传入多参数,SQL语句缓存机制

一、动态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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值