MyBatis涉及的动态SQL

news2025/1/17 3:02:37

动态 SQL 提供了更大的灵活性和可重用性,可以根据不同情况生成不同的 SQL 语句,从而满足应用程序的需求。它简化了数据库操作的编写和管理,提高了开发效率和代码的可维护性。

<if>

用于条件判断,根据条件决定是否包含某个SQL片段。


<!--必填和非必填的<if>标签-->
    <insert id="add2">
        insert into userinfo(id,
                            <if test="name!=null">
                                name,
                            </if>
                             age) values(#{id},
                                          <if test="name!=null">
                                              #{name},
                                          </if>
                                          #{age})
    </insert>

<trim>

提供了一种灵活的方式来去除或添加 SQL 片段的开头或结尾。

<trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">
  SQL statement or fragment
</trim>

 

可以看出trim有四个属性

  • prefix,suffix 添加前缀和后缀;
  • prefixOverrides:去掉前缀;suffixOverrides:去掉后缀
   <insert id="add3">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id!=null">
                id,
            </if>
            <if test="name!=null">
                name,
            </if>

            <if test="age!=null">
                age,
            </if>
            <if test="email!=null">
                email,
            </if>

        </trim> values
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="id!=null">
            #{id},
        </if>
        <if test="name!=null">
            #{name},
        </if>

        <if test="age!=null">
            #{age},
        </if>
        <if test="email!=null">
            #{email},
        </if>

    </trim>

    </insert>


<where>

<where>需要搭配<if> 使用;

<where>需要删除前面的and;

<where>语句中没有内容的话就不会生成where sql关键字

 <select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">
        select* from userinfo
<!--        <where>-->
<!--            <if test="name!=null">-->
<!--              and  name=#{name}-->
<!--            </if>-->
<!--            <if test="id!=null">-->
<!--              and  id=#{id}-->

<!--            </if>-->
<!--        </where>-->
        <trim prefix="where" prefixOverrides="and">
            <if test="name!=null">
                and name=#{name}
            </if>
            <if test="id!=null">
               and id=#{id}

            </if>
        </trim>

    </select>
    <select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">
        select* from userinfo
        <where>
            <if test="name!=null">
              and  name=#{name}
            </if>
            <if test="id!=null">
              and  id=#{id}

            </if>
        </where>

    </select>
    <select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">
        select* from userinfo
        <where>
            <if test="name!=null">
                name=#{name}
            </if>
            <if test="id!=null">
              and  id=#{id}

            </if>
        </where>

    </select>
 
    @Test
    void getListByParam() {
        List<UserInfo> list=userMapper.getListByParam("John",1);//select* from userinfo WHERE name=? and id=?
        List<UserInfo> list1=userMapper.getListByParam("John",null);// select* from userinfo WHERE name=?
        List<UserInfo> list2=userMapper.getListByParam(null,1);//select* from userinfo WHERE id=?
        List<UserInfo> list3=userMapper.getListByParam(null,null);//select* from userinfo
    }

进行单元测试的时候,当输入null参数,if是null的话就没有where后面的sql语句

<set>

<set>用于动态生成 UPDATE 语句的标签。 

在 UPDATE 语句中,我们通常需要根据条件更新表中的某些列。<set> 标签可以帮助我们只更新指定的列,避免全表更新,提高性能和减少网络传输量。

下面是一个使用 <set>标签的示例:

  • 配合if使用;
  • 会自动去除最后一个逗号

<update id="updateUser" parameterType="User">
  UPDATE user
  <set>
    <if test="username != null">
      username = #{username},
    </if>
    <if test="password != null">
      password = #{password},
    </if>
    <if test="email != null">
      email = #{email},
    </if>
  </set>
  WHERE id = #{id}
</update>

在这个示例中,`<set>` 标签包含了多个 `<if>` 标签。每个 `<if>` 标签表示一个条件,如果条件成立,则生成对应的列更新语句。

最终生成的 SQL 语句会根据实际情况只更新存在值的列,而不会更新为 `null` 的列。

需要注意的是,在生成的 SQL 语句中,最后一个列名后面没有逗号,这是通过在 `<if>` 标签中添加逗号来实现的。

<foreach>

item:指定在循环体内每个元素的别名。
index:指定在循环体内每个元素的索引(即下标)。
collection:指定要遍历的集合或数组对象。
open:指定循环体前要添加的字符。
close:指定循环体后要添加的字符。
separator:指定每个元素之间要添加的分隔符。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9-k8s-亲和力与反亲和力

文章目录 一、概念二、实操节点亲和力1三、实操pod亲和力2 一、概念 节点亲和力概念&#xff08;反亲和力相反&#xff09; ps&#xff1a;官方文档http://kubernetes.p2hp.com/docs/concepts/scheduling-eviction/assign-pod-node.html 节点亲和力&#xff08;Node Affinity&a…

自媒体人搞钱的5个AI工具

HI&#xff0c;同学们&#xff0c;我是赤辰&#xff0c;本期是第21篇AI工具类教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完后可领取&#xff01;今天给大家分享一些基于个人创业需求场景&#xff0c;从产品设计图、网站搭建、logo设计、品牌设计&#xff0c;到图片…

CUDA学习笔记4——自定义设备函数

自定义设备函数 核函数&#xff1a;__global__修饰&#xff1b;在设备中执行&#xff1b;设备函数&#xff1a;__device__修饰&#xff1b;在设备中执行&#xff1b;只能被核函数或其他设备函数调用&#xff1b;主机函数&#xff1a;__host__修饰&#xff08;可省略&#xff0…

【数据挖掘】数据挖掘、关联分析、分类预测、决策树、聚类、类神经网络与罗吉斯回归

目录 一、简介二、关于数据挖掘的经典故事和案例2.1 正在影响中国管理的10大技术2.2 从数字中能够得到什么&#xff1f;2.3 一个网络流传的笑话(转述)2.4 啤酒与尿布2.5 网上书店关联销售的案例2.6 数据挖掘在企业中的应用2.7 交叉销售 三、数据挖掘入门3.1 什么激发了数据挖掘…

中文编程开发语言工具开发的实际软件案例:称重管理系统软件

中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件 中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件&#xff0c;软件可以安装在电脑上&#xff0c;也可以安装在收银机上&#xff0c;支持触摸和鼠标点&#xff0c;想学编程可以关注系统…

损失函数总结(二):L1Loss、MSELoss

损失函数总结&#xff08;二&#xff09;&#xff1a;L1Loss、MSELoss 1 引言2 损失函数2.1 L1Loss2.2 MSELoss 3 总结 1 引言 在上一篇博文中介绍了损失函数是什么以及为什么使用损失函数&#xff0c;从这一篇博文就开始关于损失函数有哪些进行进一步的介绍。这里放一张损失函…

电脑时间不准?简单几步教你恢复正常!

在日常使用电脑的过程中&#xff0c;我们经常依赖电脑的系统时间来同步文件、安排任务和进行各种在线活动。然而&#xff0c;有时候电脑的时间会不准确&#xff0c;这可能会导致一系列问题。本文将介绍三种常见的方法&#xff0c;帮助您解决电脑时间不准确的问题&#xff0c;确…

除氟树脂在工业、市政含氟废水处理中的应用

含氟废水的不达标排放对自然环境有很大的危害&#xff0c;氟化物离子可以累积在土壤和水体中&#xff0c;从而对生态系统造成破坏。大量的氟化物离子会对植物生长产生不良影响&#xff0c;并对水生生物造成毒性作用&#xff0c;严重时还可能导致生态灾难。氟化物离子如果没有得…

Linux内存管理 | 三、虚拟地址空间管理

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

解决微信小程序导入项目报错: [app.json文件内容错误]app.json未找到

目录 场景描述 原因分析 解决方法 场景描述 使用微信开发者工具导入项目后&#xff0c;打开控制台&#xff0c;出现报错提示&#xff1a;[app.json文件内容错误]app.json 未找到&#xff0c;如下图&#xff1a; 原因分析 一级文件目录里确实找不到app.json文件&#xff0c…

上市公司专利申请、创新绩效测算(2000-2022年)

参照王治等&#xff08;2022&#xff09;的做法&#xff0c;团队对上市公司-创新绩效进行测算。应用企业当年的专利申请数量&#xff08;Apply&#xff09;和企业当年的发明专利申请数量&#xff08;IApply&#xff09;衡量企业创新绩效 一、数据介绍 数据名称&#xff1a;上市…

如何处理前端路由懒加载?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C++初阶--C++入门(1)

文章目录 C语言与C命名空间命名空间的定义和使用 C的输入输出缺省参数函数重载引用赋值与引用引用在参数上的使用以及注意事项函数返回值的引用引用与值的时间效率比较常引用 C语言与C 很多初学者都会把这两门语言进行混淆&#xff0c;但其实这是两种不同的语言&#xff0c;C相…

零基础学习CSS

01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签…

2023网络工程毕业设计选题推荐 - 计算机毕业设计题目大全

文章目录 0 简介1 如何选题2 最新网络工程选题2.1 Java web - SSM 系统2.2 大数据方向2.3 人工智能方向2.4 其他方向 4 最后 0 简介 学长搜集分享最新的网络工程专业毕设毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准…

从文字到视频:借助ChatGPT与剪映轻松生成高质量视频(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

ChatGPT AIGC 实现Excel 交叉查找 Index+match 函数

行与列交叉多条件查找需求如下: 这个需求要使用Excel中最经典的组合函数Index+match函数。 函数公式可以交给ChatGPT AIGC来实现。 Prompt: 有一个表格A列为品牌,B列为月份,C列为销量,61行数据,请写出Excel函数公式根据E3单元格的品牌与F2单元格的月份查找对应的销量,…

合规合规,合规法规的挑战与解决方案

在当前数据安全威胁日益加剧的时代&#xff0c;无论是来自企业内部还是外部&#xff0c;您都需要采取积极主动的态度。政府方面也希望出于公民数据安全的考虑&#xff0c;确保对企业的IT操作进行监管。为了实现这一目标&#xff0c;政府或主管法定机构发布了关于企业IT操作的法…

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链&#xff08;Chain of Responsibility&#xff09;是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上&#xff0c;而不需要关心链上含有哪些对象。请求…

5款CSS3选项框单选按钮样式(走过路过不要错过)

5款CSS3选项框单选按钮样式是一款创意好看的选项单选按钮样式特效。 样式如下&#xff1a; 文章顶部就是源码&#xff0c;如果下载不了&#xff08;如果被弄成收费or要VPI才能下载&#xff09;私一下我&#xff0c;第一次弄csdn的资源绑定&#xff0c;不行我重新弄成网盘的 百…