• Mybatis动态SQL


        动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号,还有臭名昭著苏的SQL拼接问题。利用动态 SQL,可以彻底摆脱这种痛苦。

    动态SQL标签及属性列表:

    • where:
          where标签解决了我们在之前SQL拼接问题中当传参为空时会出现“WHERE AND”情况,我们在传统的jdbc写法中为了解决这个问题,将“WHERE”改为了“WHERE 1=1”.使用where标签我们就再也不用遇到这种情况,where标签会自动检测如果它包含的标签中有返回值的话,它会自动插入where,再也不用我们去手动添加. 此外如果它包含的标签中返回内容为 AND 或者 OR 开头,则它会自动替换掉,十分方便.

      1.  <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
      2.         select * from student
      3.          <where>
      4.              <if test="no!=null&no!=''">
      5.                 no = #{no}
      6.              if>
      7.              <if test="name!=null&name!=''">
      8.                 name = #{name}
      9.              if>
      10.          where>
      11.      select>
    • if:
          if标签通常用于WHERE语句,UPDATE语句,INSERT语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段,判断是否插入某一个字段的值

    • foreach:
          foreach标签主要用于构建in条件,可在SQL中对集合进行迭代.也常用到批量删除,添加操作中.

      1.  <select id="findStudentlist1" resultType="com.ffyc.mybatisdemo.model.Student">
      2.         select * from student where no in
      3.          <foreach collection="list" item="no" open="(" separator="," close=")">
      4.             #{no}
      5.          foreach>
      6.      select>
    • trim:
          格式化输出,也可用来设定或忽略前后缀

      1.  <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
      2.         select * from student
      3.          <trim prefix="where" prefixOverrides="and|or">
      4.              <if test="no!=null&no!=''">
      5.                 no = #{no}
      6.              if>
      7.              <if test="name!=null&name!=''">
      8.                 name = #{name}
      9.              if>
      10.          trim>
      11.      select>
    • collection:
          collection属性的值有三个分别为: list,array,map 对应的参数类型分别为: LIst,数组,map集合

      • item: 表示在迭代过程中每一个元素的别名

      • open: 前缀

      • close: 后缀

      • separator: 分隔符,表示迭代时每个元素之间以什么分隔

      1. <select id="findStudentlist1" resultType="com.ffyc.mybatisdemo.model.Student">
      2.         select * from student where no in
      3.          <foreach collection="list" item="no" open="(" separator="," close=")">
      4.             #{no}
      5.          foreach>
      6.      select>
    • choose:
          从多个选项中选择一个.按照顺序判断when中的条件是否成立,有一个成立则choose结束.当choose中所有的when都不成立时,则执行otherwise中的SQL.类似于java中的switch case default.

      1.  <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
      2.         select * from student
      3.          <trim prefix="where" prefixOverrides="and|or">
      4.             <choose>
      5.              <when test="no!=null&no!=''">
      6.                 no = #{no}
      7.              when>
      8.              <otherwise>
      9.                 name = #{name}
      10.              otherwise>
      11.             choose>
      12.          trim>
      13.      select>
    • set:
          没有if标签时,如果有一个参数为null,都会导致错误.当在update语句中使用if标签时,如果最后面的if没有执行,则会导致逗号多余的错误.使用SET标签可以动态的配置set关键字,和剔除追加到条件末尾的任何不相关的逗号.

      1. <update id="updateStudent" parameterType="Student">
      2.         update student
      3.          <set>
      4.              <if test="name!=null">
      5.                 name = #{name},
      6.              if>
      7.              <if test="gender!=null">
      8.                 gender = #{gender},
      9.              if>
      10.              <if test="no!=null">
      11.                 no = #{no}
      12.              if>
      13.          set>
      14.         where id = #{id}
      15.      update>

    我们在上述标签介绍时在xml文件中示例了每个标签及属性的使用方法,因此在此处我们只示例一个简单查询列表的测试方法:

    1.接口中的方法:

    1.  //动态SQl
    2.       List findStudentList2(Student student);

    2.mapper.xml文件:

    1. <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
    2.         select * from student
    3.          <where>
    4.              <if test="no!=null&no!=''">
    5.                 no = #{no}
    6.              if>
    7.              <if test="name!=null&name!=''">
    8.                 name = #{name}
    9.              if>
    10.          where>
    11.   select>

    3.测试类:

     
    1. @Test
    2.      //动态SQL
    3.      public void findStudentlist2() {
    4.          SqlSession sqlSession = MybatisUtil.getSqlSession();
    5.          StudentDao2 studentDao2 = sqlSession.getMapper(StudentDao2.class);
    6.          Student student = new Student();
    7.          student.setNo(103);  //此处我们动态传入no值进行查询
    8.          List students = studentDao2.findStudentList2(student);
    9.          System.out.println(students);
    10.          sqlSession.close();
    11.     }

    4.运行结果:

  • 相关阅读:
    ES 查看、删除索引命令
    vue2.0项目安装依赖 sass 报错
    Oracle 存储过程数据插入临时表慢以及SQL语句查询慢
    Graph Data Augmentation for GraphMachine Learning: A Survey
    什么是Linux
    nginx常见报错及解决acme.sh给Nginx配置SSL证书
    springboot启动流程是什么?
    11.9存储器实验总结(单ram,双ram,FIFO)
    基于SSM的外卖点餐系统设计与实现
    Reactjs数据篇
  • 原文地址:https://blog.csdn.net/weixin_52629592/article/details/125843553