MyBatis 中的动态 SQL 的相关使用方法

   为什么会有动态SQL,把SQL写死不是比较方便吗?其实有很多的举例,这里我那一个常见的来说,像我们用户注册,会有必填字段和非必填字段,有些传来的参数不一样,那对应的SQL也不一样,因此,在这些的场景底下我们需要使用动态SQL来完成。

  这里动态SQL我是使用XML的办法进行说明,因为使用注解不方便,而且不好观察哪里有误。这里我会先从一些常用的标签的介绍来对动态SQL进行使用的讲解。

1.1 <if>标签

    <insert id="insertByCondition">
        insert into userinfo(
            <if test="username != null">
                username
            </if>
            <if test="password != null">
                ,password
            </if>
            <if test="age != null">
                ,age
            </if>
            <if test="gender != null">
                ,gender
            </if>
        ) values (
            <if test="username != null">
                #{username}
            </if>
            <if test="password != null">
                ,#{password}
            </if>
            <if test="age != null">
                ,#{age}
            </if>
            <if test="gender != null">
                ,#{gender}
            </if>
        )
    </insert>

 

  从上述代码可以简单看出来,<if> 标签是一个<if test = "xxxx">xxxx</if>的结构,然后另一个是运行后的结果,这里发现如果if里面都有值的话,可以完好的插入,但是它就一定没问题吗?下面一个图我就简单注释掉几个来,实验一下。

  从上图可以简单的看错来,它是一个BadSql因为我们注掉了username导致,多了一个逗号那怎么样才能避免上述情况呢?那就要引入新的注解。

1.2<trim> 标签

  这里我们先简单介绍一下<trim>标签里面几个常见的属性:
     1. prefix:表示整个语句块,以prefix的值作为前缀。

     2. suffix:表示整个语句块,以suffix的值作为后缀。

     3. prefixOverrides:表示整个语句块要去除掉前缀。

     4. suffixOverrides:表示整个语句块要去掉后缀。

<insert id="insertByCondition">
        insert into userinfo
        <trim prefix="(" suffix=")" prefixOverrides=",">
            <if test="username != null">
                username
            </if>
            <if test="password != null">
                ,password
            </if>
            <if test="gender != null">
                ,gender
            </if>
            <if test="age != null">
                ,age
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" prefixOverrides=",">
            <if test="username != null">
                #{username}
            </if>
            <if test="password != null">
                ,#{password}
            </if>
            <if test="gender != null">
                , #{gender}
            </if>
            <if test="age != null">
                ,#{age}
            </if>

        </trim>
    </insert>

  上述因为username是不能为空,因此我把注掉username改为注掉gender,可以发现在<if>标签里面的问题给解决了。

1.3  <where>标签

<select id="queryUserByCondition" resultType="com.jincheng.mybatisdemo.model.UserInfo">
        select * from userinfo
        <where>
            <if test="age != null">
                age = #{age}
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="deleteFlag">
                and delete_flag = #{deleteFlag}
            </if>
        </where>
    </select>
    <select id="queryUserByCondition" resultType="com.jincheng.mybatisdemo.model.UserInfo">
        select * from userinfo
        <trim prefix="where" prefixOverrides="and">
            <if test="age != null">
                age = #{age}
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="deleteFlag">
                and delete_flag = #{deleteFlag}
            </if>
        </trim>
    </select>

  通过上面可以发现第一个是使用<where>标签进行写的,而另一个是通过使用<trim>标签进行写的。可以简单比对一下<where>标签,生成where关键字,并且去除最前面的and 或者 or,如果where标签代码块,没有一个查询条件,会省略掉where关键字。也可以使用<trim prefix="where" prefixOverrides="and">替换,但是这种情况下,子元素没有内容时,where关键字也会保留。

1.4 <set>标签

<update id="updateByCondition">
        update userinfo
        <set>
            <if test="password != null">
                password = #{password},
            </if>
            <if test="age != null">
                age = #{age},
            </if>
            <if test="gender != null">
                gender = #{gender}
            </if>
        </set>
            where id = #{id}
    </update>

  这里<set>标签,生成set关键字,去掉整个代码块后面的逗号。如果使用<trim prefix="set" suffixOverrides=",">可以进行替换。

1.5 <foreach>标签

  简单来说一下<foreach>标签里面的属性:

      1. collection:绑定方法参数中的集合,如LIst,Set,Map或数组对象

      2. item:遍历是的每一个对象

      3. open:语句块开头的字符串

      4. close:语句块结束的字符串

      5. separator:每次遍历之间间隔的字符串。

一般用在批量删除中等等。

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

1.6 <inlcude>标签

  这个标签用于在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会在很多多余的代码。

  这里我们需要对重复的代码片段进行抽取,将其通过<sql>标签封装到一个SQL片段,然后通过<include>标签进行引用:

        1.<sql> : 定义可重用的SQL片段

        2. <include>:通过属性refid,指定包含的SQL片段。

    <sql id="selectAll">
        select * from userinfo
    </sql>

    <select id="select" resultType="com.jincheng.mybatisdemo.model.UserInfo">
        <include refid="selectAll"></include>
    </select>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序 uniapp+vue动漫交流系统 java(springboot+ssm)/python(flask+django)/

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端&#xff1a;HTML5,CSS3 VUE 后端&#xff1a;java(springbootssm)/python(flaskdja…

数字化社交的引擎:解析Facebook的影响力

随着数字技术的飞速发展&#xff0c;社交网络已成为人们日常生活中不可或缺的一部分。而在这个数字化社交的世界中&#xff0c;Facebook作为最具影响力和知名度的平台之一&#xff0c;其所扮演的角色越发重要。本文将深入解析Facebook在数字化社交领域的影响力&#xff0c;并探…

独一无二:探索单例模式在现代编程中的奥秘与实践

设计模式在软件开发中扮演着至关重要的角色&#xff0c;它们是解决特定问题的经典方法。在众多设计模式中&#xff0c;单例模式因其独特的应用场景和简洁的实现而广受欢迎。本文将从多个角度详细介绍单例模式&#xff0c;帮助你理解它的定义、实现、应用以及潜在的限制。 1. 什…

VRRP(虚拟路由冗余协议)详解

VRRP-------虚拟路由冗余协议 在一个网络中&#xff0c;要做为一个合格的网络首先就要具备几种冗余&#xff0c;增加网络的可靠性。 这几种冗余分别为&#xff1a;线路冗余&#xff0c;设备冗余&#xff0c;网关冗余&#xff0c;UPS冗余 VRRP该协议就是解决网关冗余的。在二层…

【opencv】示例-imgcodecs_jpeg.cpp使用OpenCV库来创建和处理图像,并保存为不同JPEG采样因子的版本...

上层-原始图像 下层&#xff1a;编码解码后的lossy_img #include <opencv2/core.hpp> // 包含OpenCV核心功能的头文件 #include <opencv2/imgproc.hpp> // 包含OpenCV图像处理功能的头文件 #include <opencv2/imgcodecs.hpp> // 包含OpenCV图像编码解码功能…

滑动门Tab中使用Swiper造成动画不再循环了

路走的多了&#xff0c;坑也多。百度用的多了&#xff0c;就懒得用脑了。 这次案例是swiper效果&#xff0c;swiper官网或者通常的做法是&#xff0c;页面一加载就开始渲染swiper了&#xff0c;当然这个只需要傻傻的复制就行。 但是在滑动门Tab中的内容&#xff0c;还是按照之…

Linux下mysql的彻底卸载

Linux下mysql的彻底卸载 1、查看mysql的安装情况2、删除上图安装的软件3、都删除成功之后&#xff0c;查找相关的mysql的文件4、删除全部文件5、再次执行命令 1、查看mysql的安装情况 rpm -qa | grep -i mysql2、删除上图安装的软件 rpm -ev mysql-community-libs-5.7.27-1.e…

4.Labview簇、变体与类(上)

在Labview中&#xff0c;何为簇与变体&#xff0c;何为类&#xff1f;应该如何理解&#xff1f;具体有什么应用场景&#xff1f; 本文基于Labview软件&#xff0c;独到的讲解了簇与变体与类函数的使用方法和场景&#xff0c;从理论上讲解其数据流的底层概念&#xff0c;从实践上…

服务器数据恢复—不同型号服务器RAID5数据恢复策略有何不同?

RAID5作为应用最广泛的raid阵列级别之一&#xff0c;在不同型号服务器中的RAID5出现故障后&#xff0c;处理方法也不同。 RAID5阵列级别是无独立校验磁盘的奇偶校验磁盘阵列&#xff0c;采用数据分块和独立存取技术&#xff0c;能在同一磁盘上并行处理多个访问请求&#xff0c;…

取出/var/log/secure中一小时内登录失败超过三次的IP

取出/var/log/secure中一小时内登录失败超过三次的IP 前两个字段是日期&#xff0c;第三个字段是小时&#xff0c;第四个字段是IP cat /var/log/secure | sort -i | awk -F [ :] /Failed/{a[$1" "$2" "$3" "$4" "$(NF-3)]}END{for(i …

华为海思数字芯片设计笔试第五套

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…

手持气象站功能介绍

TH-SQ5手持气象站是一种便携式设备&#xff0c;用于手动测量和记录气象参数&#xff0c;如温度、湿度、风速和气压。这些设备通常用于户外活动、教育和业余气象观测。以下是对机械式手持气象站的一些续写内容&#xff1a; 数据记录功能&#xff1a;虽然基本型号的机械式手持气象…

Java常用数据结构与集合

数据结构 数组&#xff1a; 内存地址连续检索效率高(可以通过下标访问成员)增删操作效率低(保证数据越界的问题,需动态扩容)长度固定&#xff0c;扩容的需要新的数组复制或者Arrays类的copyOf方法 链表 内存地址不连续查询快删除慢&#xff0c;因为需要移动指针又分双向链表…

【MoS2】应变增强的单层MoS2光电探测器

这篇文章的标题是《Strain-Enhanced Large-Area Monolayer MoS2 Photodetectors》&#xff0c;作者是Borna Radatovic等人&#xff0c;发表在《ACS Applied Materials & Interfaces》期刊的2024年第16卷。文章主要研究了应变增强的大面积单层MoS2光电探测器的性能和应用潜力…

车内AR互动娱乐解决方案,打造沉浸式智能座舱体验

美摄科技凭借其卓越的创新能力&#xff0c;为企业带来了革命性的车内AR互动娱乐解决方案。该方案凭借自研的AI检测和渲染引擎&#xff0c;打造出逼真的数字形象&#xff0c;不仅丰富了车机娱乐内容&#xff0c;更提升了乘客与车辆的互动体验&#xff0c;让每一次出行都成为一场…

2024 年适用于 Mac 电脑的最佳 SD 卡恢复软件

D 卡体积很小&#xff0c;广泛用于数码相机、摄像机、行车记录仪、无人机等。通常&#xff0c;在使用设备拍照、拍摄视频后&#xff0c;您会将文件移动到 Mac 进行进一步编辑或作为备份。大多数时候&#xff0c;应该存在问题。但是&#xff0c;您的 SD 卡仍然会出现一些问题并导…

揭秘分享京东商品详情数据接口(商品属性,sku,价格)API接口可测试

今天给大家分享关于封装根据京东商品ID或商品链接批量获取京东商品详情数据接口方法&#xff0c;支持高并发请求。 如果你对京东的商品详情数据感兴趣&#xff0c;我建议你采取以下合法和合规的途径&#xff1a; 使用京东开放平台&#xff1a;京东开放平台提供了一系列的API接…

Harmony鸿蒙南向驱动开发-RTC接口使用

功能简介 RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时…

微信小程序中调取小程序实现报错:提示 开发版小程序已过期,请在开发者工具中重新扫码的 解决方案

出现的问题&#xff1a; 解决方法&#xff1a; 将envVersion: develop,开发版切换为正式版 envVersion: release,wx.navigateToMiniProgram({appId:res.data.appId,path: res.data.prePayTn,extraData: {foo: bar,miniProgramOrgId:res.data.miniProgramOrgId,orderId: res.d…

云原生(八)、Kubernetes基础(一)

K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间&#xff0c;以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…