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

MyBatis 动态 SQL

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。动态 SQL 可以根据运行时提供的条件,包括 参数值逻辑判断循环 等,动态生成SQL语句的各个部分的具体内容。

对动态SQL的学习主要是学习几个重要的标签,下面我们详细介绍:

1、<if> 标签

<if> 标签的作用是根据条件判断是否生成相应的 SQL 片段或语句。

例:根据可选参数插入用户信息

    <insert id="insert2" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into userinfo(username, password
        <if test="photo != null">
            ,photo
        </if>
        ) values (
        #{username},
        #{password}
        <if test="photo != null">
            ,#{photo}
        </if>
        )
    </insert>

: test 中的 字段名,是传入对象中的 属性,不是数据库字段。

在这里插入图片描述

2、<trim> 标签

虽然上面的 <if> 标签可以实现一些动态 SQL,但是如果所有的参数都是可选参数的情况下,只使用 <if> 标签就可能会出错。例如:

    <insert id="insert2" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into userinfo(
        <if test="username != null">
            username
        </if>
        <if test="password != null">
            ,password
        </if>
        ) values (
        <if test="username != null">
            #{username}
        </if>
        <if test="password != null">
            ,#{password}
        </if>
        )
    </insert>

上述这种情况下,如果只传入 username 参数,那么最终拼接的 SQL 语句为:insert into userinfo(,password)……显然,这是一个错误的 SQL 语句。

此时我们可以使用 <trim> 标签结合 <if> 标签,解决上述问题:

trim 标签中的重要属性:

  • prefix:表示整个语句块,以prefix的值作为前缀。
  • suffix:表示整个语句块,以suffix的值作为后缀。
  • prefixOverrides:表示整个语句块要去除掉的前缀。
  • suffixOverrides:表示整个语句块要去除掉的后缀。

使用 <trim> 标签解决上述问题:

    <insert id="insert2" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into userinfo
        <trim prefix="(" suffix=")" prefixOverrides=",">
            <if test="username != null">
                username
            </if>
            <if test="password != null">
                ,password
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" prefixOverrides=",">
            <if test="username != null">
                #{username}
            </if>
            <if test="password != null">
                ,#{password}
            </if>
        </trim>
    </insert>

3、<where> 标签

  1. <where> 标签内部的条件会根据实际情况自动生成 where 子句。
  2. <where>标签会自动去除最前面的“and”和“or”关键字。
  3. 根据以上特性,<where>标签也可以使用 <trim prefix=“where” prefixOverrides=“and”> 或 <trim prefix=“where” prefixOverrides=“or”>替换。

例:根据可选参数查询用户信息

    <select id="getUserInfoByWhere" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
        <where>
            <if test="id > 0">
                id=#{id}
            </if>
            <if test="photo != null">
                and photo=#{photo}
            </if>
        </where>
    </select>


4、<set> 标签

  1. <set> 标签内部的条件会根据实际情况自动生成 set 子句。
  2. <set>标签会自动去除最后面的,
  3. 根据以上特性,<set> 标签也可以使⽤ <trim prefix=“set” suffixOverrides=“,”> 替换

例:设置可选参数更新用户信息

    <update id="updateBySet">
        update userinfo
        <set>
            password=#{password},
            <if test="username != null">
                username=#{username},
            </if>
            <if test="photo != null">
                photo=#{photo}
            </if>
        </set>
        where id=#{id}
    </update>

5、<foreach> 标签

<foreach> 标签用于在 SQL 语句中循环遍历集合或数组,并将其元素应用到 SQL 的特定部分。

下面是 <foreach> 标签中的重要属性:

  • collection:绑定方法参数中的集合,如 List,Set,Map或数组对象.
  • item:遍历时的每⼀个对象.
  • open:语句块开头的字符串.
  • close:语句块结束的字符串.
  • separator:每次遍历之间间隔的字符串.

例如根据用户 id 批量删除用户信息:

接口:

int deleteByIds(List<Integer> ids);

xml 实现:

    <delete id="deleteByIds">
        delete from userinfo
        where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>

相关文章:

  • 数据结构——基于顺序表实现通讯录
  • Kafka基本原理、生产问题总结及性能优化实践 | 京东云技术团队
  • YOLO算法改进6【中阶改进篇】:depthwise separable convolution轻量化C3
  • JAVA整理学习实例(一)面向对象
  • centos 搭建 zookeeper 高可用集群
  • AI:48-基于卷积神经网络的气象图像识别
  • Web测试是什么,有何特点?
  • SAP ABAP基础语法-TCODE学习(六)
  • 操作系统的线程模型
  • 用前端框架Bootstrap和Django实现用户注册页面
  • k8s 资源预留
  • Python+pytest+requests 自动化测试框架
  • SQL Server2000mdf升级SQL Server2005数据库还原
  • 亲测 IDEA Pycharm 全家桶 自动重置免费30天
  • 【Redis】Java连接Redis及Java操作Redis常用数据类型
  • memtest86 prosite v10.6
  • 电脑如何录制小视频
  • AUTOSAR汽车电子嵌入式编程精讲300篇-纯电动汽车车载网络安全性入侵检测(续)
  • PointNet 论文阅读
  • 【WinForm详细教程六】WinForm中的GroupBox和Panel 、TabControl 、SplitContainer控件
  • 权威访谈丨国家疾控局就《世界卫生组织大流行协定》答记者问
  • 国家发改委:安全是低空经济发展的首要前提,稳妥推进低空旅游、航空运动等发展
  • 安徽凤阳通报鼓楼瓦片脱落:2023年曾维修,已成立调查组
  • 上海肺科医院院长陈昶:临床中的痛点,正是新技术诞生的起点
  • 海南乐城管理局原局长贾宁已赴省政协工作,曾从河南跨省任职
  • 三人在共享单车上印小广告被拘,北京警方专项打击非法小广告