当前位置: 首页 > news >正文

mybatis-动态SQL

随着用户输入或外部条件的变化而变化的SQL语句, 我们称之为动态SQL.

一. <if>标签

 

根据三个信息来查询员工, 如果我们只想通过其中一个信息(只填写一个信息在代码中其他信息为null)来查询是无法查询出来的, 促使就要用到动态SQL中的<if>.

修改后因为从第二个条件开始每个条件的开头都使用and连接 如果前面的不成立 在生成代码时就会在where和条件之间多出一个and导致不能正常运行此时可以用<where></where>标签代替包裹条件体

<where>标签, 只要有一个条件成立它就会自动在运行时生成where,并且会去除掉影响运行的and

 案例: 动态更新员工信息

<!--    动态更新员工信息-->
    <update id="update">
        update mybatis.emp
        set
        <if test="username != null">username =#{username},</if>
        <if test="name != null">name = #{name},</if>
        <if test="gender != null">gender = #{gender},</if>
        <if test="image != null">image = #{image},</if>
        <if test="job != null">job = #{job},</if>
        <if test="entrydate != null">entrydate = #{entrydate},</if>
        <if test="dept_id != null">dept_id = #{deptId},</if>
        <if test="update_time != null">update_time = #{updateTime}</if>
        where id = #{id}

    </update>

但是如果后面的信息为null在生成代码时前一条最后会有一个" , "导致语法出错,此时就要用到<set>

<!--    动态更新员工信息-->
    <update id="update">
        update mybatis.emp
        <set>
        <if test="username != null">username =#{username},</if>
        <if test="name != null">name = #{name},</if>
        <if test="gender != null">gender = #{gender},</if>
        <if test="image != null">image = #{image},</if>
        <if test="job != null">job = #{job},</if>
        <if test="entrydate != null">entrydate = #{entrydate},</if>
        <if test="deptId != null">dept_id = #{deptId},</if>
        <if test="updateTime != null">update_time = #{updateTime}</if>
        </set>
        where id = #{id}

    </update>

二. <foreach>标签

<!--    批量删除员工(13, 14, 15)-->
<!--
        如果只删除一个数据指定id时可以直接 where id = #{id}
        但是要想批量删除, 就不能这么写了, 要用遍历标签在运行时去生成代码
标签内的容结果参考(?, ?, ?)
        collection: 遍历的集合
        item: 遍历出来的元素
        separator: 数据之间的分隔符
        open: 遍历开始前拼接的SQL片段
        close: 遍历结束后拼接的SQL片段
-->
    <delete id="deleteByIds">
        delete from emp where id in
        <foreach  collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

三. <sql>&<include>标签

此代码标注内容重复如果要修改每个都要修改, 此时就可以用到 <sql>&<include>标签                  至于这里为啥不用 * 直接代替所有元素是因为用 * 的性能比较低

相关文章:

  • Python 发布 Web 应用的常见方法及详细步骤
  • [题解]2024ICPC上海站-In Search of the Ultimate Artifact
  • K8S之脚本管理(Script Management for k8s)
  • aistdio部署deepseek-r1纯教程
  • 地表放置机场和飞机(十)
  • 基于JavaScript的实时数据监控仪表盘开发实践
  • QT C++ modbus 两个字 合成 32位整数
  • DEX-EE三指灵巧手:扩展AI与机器人研究的边界
  • 力扣-二叉树-98 验证二叉搜索树
  • 七、敏捷开发工具:持续集成与部署工具
  • 竞彩数据怎么接入
  • OAI 平台 4G(LTE)基站 、终端、核心网 端到端部署实践(一)
  • . Spring MVC
  • 青少年编程与数学 02-009 Django 5 Web 编程 22课题、性能优化
  • WPF快速创建DeepSeek本地自己的客户端-基础思路版本
  • 用Prim算法求解最小生成树:代码实现与分析
  • AIGC(生成式AI)试用 21 -- Python调用deepseek API
  • 多线程之两阶段终止模式
  • 【DeepSeek】本地部署,保姆级教程
  • scala中为什么能用常量的地方就不用变量
  • 巴基斯坦称对印度发起军事行动
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 会计江湖|年报披露关注什么:独董给出的“信号”
  • 中俄弘扬正确二战史观:缅怀历史,重拾初心,阻止悲剧重演
  • 105岁八路军老战士、抗美援朝老战士谭克煜逝世
  • 暴利之下:宠物殡葬行业的冰与火之歌