mybatis之动态SQL常见标签的使用

news2024/11/28 0:51:05

引入where标签的原因:

在上篇文章使用if语句的查询中,我们在SQL语句后面都写入了where 1=1,以保证每次都能够查询出结果,但这种方法并不是最合理的,假设我们现在将where后面的1=1去掉:

如下所示:

 <select id="queryBlogIF" resultType="Blog">
        SELECT * FROM BLOG where
    <if test="title != null">
         title like #{title}
    </if>
    <if test="author != null">
        AND author like #{author}
    </if>
</select>

我们传入单独的title,查询结果:

在这里插入图片描述

我们传入单独的author,查询结果:

查看报错原因,我们会发现,是由于拼接后的SQL语句出现问题

在这里插入图片描述

我们传入title和author,查询结果:

在这里插入图片描述

综合分析上述三种结果,我们可以得出这样一个结论,"and"关键字并不能在我们单独使用某个条件的时候自动的被去除,由此才会发生SQL语句拼接导致的语法错误

针对上述这种情况,我们由此引入where标签!

where标签的使用:

修改SQL语句如下所示:

  <select id="queryBlogIF" resultType="Blog">
        SELECT * FROM BLOG
        <where>
    <if test="title != null">
        and title like #{title}
    </if>
    <if test="author != null">
        AND author like #{author}
    </if>
        </where>
</select>

测试1:

在这里插入图片描述

测试2:

在这里插入图片描述

引入where标签后,并不会出现拼接错误的SQL语句,而是智能的将多余的and去掉,以保证SQL语句可以正确执行

where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除

举例:

当author和title都没有传入的时候,where会自动被去除,相当于查询所有的数据

在这里插入图片描述

choose/when/otherwise:

但有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用

针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句,还是上面的例子,但是思路变为:传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的情形。若两者都没有传入,就返回标记为 views 的 BLOG

   <select id="queryBlogIF" resultType="Blog">
        SELECT * FROM BLOG
        <where>
            <choose>
            <when test="title != null">
                title= #{title}
            </when>
            <when test="author != null">
                 author = #{author}
            </when>
                <otherwise>
                    views=#{views}
                </otherwise>
            </choose>
        </where>
</select>

当title和author都未传入时,至少保证要传入views[也就是otherwise标签中的元素,否则查询结果为null]:

在这里插入图片描述

当只传入title的值时,查询结果只输出title为我们传入的值的数据:

在这里插入图片描述

当author和title同时传入时:

在这里插入图片描述

SQL执行过程分析如下:

在这里插入图片描述

动态更新语句:

第一步:接口中编写方法

//更新博客
int queryBlogupdate(Map map);

第二步:.xml文件中编写SQL语句

<update id="queryBlogupdate" parameterType="map">
        update BLOG
        <set>
            <if test="title != null">
                title= #{title},
            </if>
            <if test="author != null">
                 author = #{author},
            </if>
        </set>
        where id=#{id}
</update>

第三步:测试类中进行测试

 @Test
     public void queryBlogIF() {
          SqlSession sqlSession= mybatis_utils.getSqlSession();
          BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
          HashMap map=new HashMap();
          //传入要更新的字段
          map.put("author","张三说");
          map.put("title","数据结构如此简单");
          map.put("id","e7335f56ac154770a34ad93effc08c80");
          mapper.queryBlogupdate(map);
          sqlSession.close();
     }

部分输出结果如下:

在这里插入图片描述

数据库中查询:

在这里插入图片描述

set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)

举例:

上述的SQL语句不变,这次我们只更新author:

在这里插入图片描述

细心的小伙伴会发现在更新数据的SQL语句中,每个参数后面都有“逗号”,那么为什么上述例子中,我们更新了SQL语句第二个参数的数据,还成功了呢?难道逗号不会对此有影响吗?

原因如下:

在这里插入图片描述

set 元素可以用于动态包含需要更新的列,忽略其它不更新的列

trim标签:

trim标签的作用:

1:在自己包含的内容前加上某些前缀,例如prefix="where",也可以在其后加上某写后缀,例如:suffix="set"

2:把包含内容的首部某些内容覆盖,即忽略,例如:prefixOverrides="and|or",也可以把尾部的某些内容覆盖,例如:suffixOverrides=","

使用方法1:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

prefix=“where”:等价于加where标签的效果

prefixOverrides=“AND |OR”:表示去除首部多余的and或者or

举例:

未加trim标签的效果:

SQL语句:

<select id="queryBlogtrim" resultType="Blog">
        SELECT * FROM BLOG
        <if test="title != null">
           and title like #{title}
        </if>
        <if test="author != null">
            AND author like #{author}
        </if>
    </select>

在这里插入图片描述

添加trim标签并添加prefix=“WHERE” 属性的效果:

SQL语句:

<select id="queryBlogtrim" resultType="Blog">
        SELECT * FROM BLOG
        <trim prefix="where">
        <if test="title != null">
           and title like #{title}
        </if>
        <if test="author != null">
            AND author like #{author}
        </if>
        </trim>
    </select>

与上述未添加的效果不同之处在于,这次多了个where

在这里插入图片描述

添加trim标签并添加prefix=“WHERE” 和prefixOverrides="AND |OR 属性的效果:

完整的正确用法如下:

<select id="queryBlogtrim" resultType="Blog">
        SELECT * FROM BLOG
        <trim prefix="where" prefixOverrides="and|or">
        <if test="title != null">
           and title like #{title}
        </if>
        <if test="author != null">
            AND author like #{author}
        </if>
        </trim>
    </select>

此时与最初的对比,不仅有了where,而且,对于的and也会被自动的去除

在这里插入图片描述

注意:

如果有小伙伴报下述这种错误,请去检查是不是把trim标签的位置放错了,trim标签应该放在SQL语句下面一行

在这里插入图片描述

使用方法2:

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

prefix=“set”:等价于加set标签的效果

suffixOverrides=“,”,表示去除尾部多余的逗号

举例;

未加trim标签的效果:

SQL语句:

  <update id="queryBlogtrim" parameterType="map">
        update BLOG
            <if test="author != null">
                author = #{author},
            </if>
        <if test="title != null">
                title= #{title},
            </if>
        where id=#{id}
    </update>

在这里插入图片描述

添加trim标签并添加prefix="SET"属性的效果:

SQL语句:

<update id="queryBlogtrim" parameterType="map">
        update BLOG
        <trim prefix="set">
            <if test="author != null">
                author = #{author},
            </if>
        <if test="title != null">
                title= #{title},
            </if>
        </trim>
        where id=#{id}
    </update>

与上述未添加的效果不同之处在于,这次多了个set

在这里插入图片描述

添加trim标签并添加 prefix=“SET” suffixOverrides=","属性的效果:

完整的正确用法如下:

<update id="queryBlogtrim" parameterType="map">
        update BLOG
        <trim prefix="SET" suffixOverrides=",">
            <if test="author != null">
                author = #{author},
            </if>
        <if test="title != null">
                title= #{title},
            </if>
        </trim>
        where id=#{id}
    </update>

此时与最初的对比,不仅有了set,而且,对于的多余的“,”也会被自动的去除

在这里插入图片描述

注:prefix/suffix,前者表示在SQL语句增加前缀,而后者表示在SQL语句中增加后缀,在开头我们只是举例prefix=“where”,当然它也可以prefix=“set”,它并不是谁唯一的,具体的前/后缀值,我们可以根据实际的SQL语句所需进行设定

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

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

相关文章

上午摆摊,下午写代码,35岁程序员的双面人生超爽!

最近看到一个程序员发帖分享自己的工作&#xff1a;白天出摊卖馄饨&#xff0c;下午在家为海外公司全职远程工作。“年入百万是可以的&#xff0c;并且我老家是三线城市&#xff0c;没有房租、通勤费用&#xff0c;性价比还是很高的。” 对比在大城市天天996的程序员&#xff0…

【JavaEE】多线程之线程安全(synchronized篇),死锁问题

目录 线程安全问题 观察线程不安全 线程安全问题的原因 从原子性入手解决线程安全问题 ——synchronized synchronized的使用方法 synchronized的互斥性和可重入性 死锁 死锁的三个典型情况 死锁的四个必要条件 破除死锁 线程安全问题 在前面的章节中&#xff0c…

Wav2Vec HuBert 自监督语音识别模型

文章目录Wav2Vec: Unsupervised pre-training for speech recognitionabstractmethodwav2vec 2.0: A Framework for Self-Supervised Learning of Speech RepresentationsabstractintroductionmethodMODEL arch损失函数finetuneexprimentHuBERT: Self-Supervised Speech Repres…

商品期货跨期套利实战笔记

合约对&#xff1a;IC2301&IC2302 价差计算 前-后&#xff08;6082-6079.8&#xff09; 做多价差开仓&#xff08;预期价差变大&#xff09; 买2301&#xff08;前&#xff09; 卖2302&#xff08;后&#xff09; 做空价差开仓&#xff08;预期价差变小&#xff09;&…

【Java|golang】1813. 句子相似性 III

一个句子是由一些单词与它们之间的单个空格组成&#xff0c;且句子的开头和结尾没有多余空格。比方说&#xff0c;“Hello World” &#xff0c;“HELLO” &#xff0c;“hello world hello world” 都是句子。每个单词都 只 包含大写和小写英文字母。 如果两个句子 sentence1…

react hooks组件间的传值方式(使用ts),子孙传值给祖先组件

父子组件传值参考&#xff1a;react hooks组件传值父传子很简单&#xff0c;只要父组件传参&#xff0c;子组件写好interface childProps和props去接收即可子传父稍复杂父组件写一个回调函数&#xff1a;changeTaskState{(id: any) > { changeTaskStateByID(id) }}当然这个 …

图自监督表征

1、综述 数据挖掘领域大师俞士纶团队新作&#xff1a;最新图自监督学习综述图自监督学习综述&#xff1a;Graph Self-Supervised Learning A Survey图自监督学习&#xff08;Graph Self-supervised Learning&#xff09;最新综述Github代码汇总图自监督学习在腾讯Angel Graph中…

基础数学(二)两数之和 三数之和

目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target&#xff0c;请在数组中找出两个加起来等于目标值的数的下标&#xff0c;返回的下标按升序排列。 &#xff08;注&#xff1a;返回的数组下标从…

从0到1完成一个Node后端(express)项目(四、路由、模块化、中间件、跨域)

往期 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;一、初始化项目、安装nodemon&#xff09; 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;二、下载数据库、navicat、express连接数据库&#xff09; 从0到1完成一个Nod…

分页查询数据重复的问题 (分页时数据库插入数据导致)

参考&#xff1a;https://blog.csdn.net/desongzhang/article/details/124941189参考之后 自己遇到的坑解决办法一、问题描述分页时&#xff0c;同时在数据库中添加数据&#xff0c;导致第n页和第n1页有部分数据重复(重复条数和查询分页时的添加的数据量有关)二、解决办法分页的…

商业智能 BI 跟业务系统的思维差异,跨越和提升

各行业都已开始进入数据时代&#xff0c;但很多企业还是分不清商业智能 BI 跟一般的业务信息化系统定位、用户、思维层面上的差异。 在企业的 IT 信息化规划中&#xff0c;基础的业务系统建设一定是走在前面的&#xff0c;有了这些系统基础&#xff0c;才会有数据的积累&#…

SH-PEG-Silane巯基-聚乙二醇-硅烷试剂简介Silane-PEG-SH

SH-PEG-Silane巯基-聚乙二醇-硅烷 外观&#xff1a;固体或液体&#xff0c;取决于分子量大小。 PEG可选分子量: 1000,2000,3400&#xff0c;5000&#xff0c;10000 溶剂: 溶于DMSO,DMF,DCM&#xff0c;溶于水。 纯度&#xff1a;>95% 保存&#xff1a;-20℃&#xff0c…

目标检测模型设计准则 | YOLOv7参考的ELAN模型解读,YOLO系列模型思想的设计源头

转载&#xff1a;https://mp.weixin.qq.com/s/5SjQvRqRct6ClpE2eEcdkw设计高效、高质量的表达性网络架构一直是深度学习领域最重要的研究课题。当今的大多数网络设计策略都集中于如何集成从不同层提取的特征&#xff0c;以及如何设计计算单元来有效地提取这些特征&#xff0c;从…

Ubuntu22.04 设置静态IP

1.查看网卡名称及IP ip addr 网卡名称&#xff1a;ens33 IP:192.168.44.130 2.修改配置文件 在 /etc/netplan/ 目录下找到配置文件 *.yaml &#xff0c;修改为 network:version: 2#renderer: NetworkManagerethernets:ens33:addresses: [192.168.44.130/24]dhcp4: nooptio…

Chrome扩展程序(插件),用你开发的脚本在浏览器上随心所欲

Chrome扩展程序&#xff08;插件&#xff09;&#xff0c;用你开发的脚本在浏览器上随心所欲Chrome插件的文件结构Hello_World编写利用JavaScript实现Hello Everything灵活运用浏览器的存储storageoptions_Page基本用法电脑发通知 - Notifications的应用普通界面右键菜单 - con…

Android 9.0系统源码_SystemUI(八)PhoneWindow更新状态栏和导航栏背景颜色的流程解析

前言 状态栏与导航栏属于SystemUi的管理范畴&#xff0c;虽然界面的UI会受到SystemUi的影响&#xff0c;但是&#xff0c;APP并没有直接绘制SystemUI的权限与必要。APP端之所以能够更改状态栏的颜色、导航栏的颜色&#xff0c;其实还是操作自己的View更改UI。可以这么理解&…

【Linux】探索缓冲区的概念 | Git 三板斧 | 实现简易进度条

爆笑教程&#xff0c;只送有缘人 &#x1f449; 《看表情包学Linux》 &#x1f4ad; 写在前面&#xff1a;本章我们先对缓冲区的概念进行一个详细的探究&#xff0c;之后会带着大家一步步去编写一个简陋的 "进度条" 小程序&#xff0c;过程还是挺有意思的&#xff0c…

EMQX 在 Kubernetes 中如何进行优雅升级

背景 为了降低 EMQX 在 Kubernetes 上的部署、运维成本&#xff0c;我们将一些日常运维能力进行总结、抽象并整合到代码中&#xff0c;以 EMQX Kubernetes Operator 的方式帮助用户实现 EMQX 的自动化部署和运维。 此前&#xff0c;EMQX Kubernetes Operator v1beta1、v1beta…

React--》如何在React中创建TypeScript项目并使用?

目录 React中创建TS项目 TS目录结构 React函数组件类型 React类组件类型 如果你已经掌握了TS中基础类型、高级类型的使用&#xff0c;还想在前端项目中更深一层的使用TS&#xff0c;还需要掌握React、Vue、Angular等框架和框架提供的API&#xff0c;懂得如何在框架中使用TS…

【ROS】—— 机器人导航(仿真)—导航实现(十八)[重要][重要][重要]

文章目录前言准备条件1. 导航实现01_SLAM建图1.1 gmapping简介1.2 gmapping节点说明1.3 gmapping使用1.3.1 编写gmapping节点相关launch文件1.3.2 执行2. 导航实现02_地图服务2.1 map_server简介2.2 map_server使用之地图保存节点(map_saver)2.2.1 map_saver节点说明2.2.2 地图…