• MyBatis中动态SQL语句完成多条件查询


    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作;还通过一些条件选择语句让我们SQL的多条件、动态查询更加容易、简洁、直观。

    mybatis中用于实现动态SQL的元素有:

    if:用if实现条件的选择,用于定义where的子句的条件。

    choose(when otherwise)相当于Java中的switch语句,通常when和otherwise一起使用。

    where:简化SQL语句中的where条件。

    set :解决SQL语句中更新语句

    我们可以通过几个例子来看一下这几个元素的运用场景:

    if:

    <select id="queryEmp"  resultType="cn.test.entity.Emp">
              select * from emp where 1=1
              <if test="deptNo!=null">
              and deptno=#{deptNO}
              </if>
              <if test="deptName!=null">
              and deptno=#{deptName}
              </if>
              </select>

    注:<if test="deptNo!=null">中 的deptNo是指实体类中的属性或字段;

    choose:

    <select id="queryEmp"  resultType="cn.test.entity.Emp">
              select * from emp where 1=1
              <choose>
              <when test="deptNo!=null">
              and deptno=#{deptNo}
              </when>
              <when test="deptName!=null">
              and deptname=#{deptName}
              </when>
              <otherwise>
              and personnum>#{personNum}
              </otherwise>
              </choose>
              </select>

    注:上面也说了,choose相当于Java中的switch语句;当第一个when满足时;就只执行第一个when中的条件。当when中的条件都不满足时;就会执行默认的的;也就是otherwise中的语句。

    where:

    <select id="queryEmp"  resultType="cn.test.entity.Emp">
              select * from emp 
              <where>
              <if test="deptNo!=null">
              and deptno=#{deptNO}
              </if>
              <if test="deptName!=null">
              and deptno=#{deptName}
              </if>
              </where>
              </select>

    注: where下面第一个if语句中以and开头,也可以省略第一个and ,如果第一个if语句中有and;mybatis会将第一个and忽略。

    set:

      <update id="updateEmp" parameterType="cn.test.entity.Emp" flushCache="true">
              update emp 
              <set>
              <if test="empName!=null">empname=#{empName},</if>
              <if test="job!=null">job=#{job}</if>
              </set>
              where empno=#{empNo}
              </update>

     

    注:  在mybatis中的SQL语句结尾不能加“;”,这样会导致mybatis无法识别字符;导致SQL语句的语法错误;出现 java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符的错误。的异常。

  • 相关阅读:
    C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗
    如何用一个插件解决 Serverless 灰度发布难题?
    Seata 与三大平台携手编程之夏,百万奖金等你来拿
    函数计算异步任务能力介绍 任务触发去重
    混沌工程平台 ChaosBladeBox 新版重磅发布
    消息队列 RabbitMQ 遇上可观测业务链路可视化
    直播预告 | 容器服务 ACK 弹性预测最佳实践
    Serverless 在阿里云函数计算中的实践
    解密函数计算异步任务能力之「任务的状态及生命周期管理」
    可观测|时序数据降采样在Prometheus实践复盘
  • 原文地址:https://www.cnblogs.com/hwgok/p/7026048.html
Copyright © 2020-2023  润新知