MyBatis动态SQL中的`if`标签使用【后端 19】

news2024/12/29 8:43:15

MyBatis动态SQL中的if标签使用

请添加图片描述

引言

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,动态 SQL 是一个非常强大的特性,它允许你根据不同的条件来动态构建 SQL 语句。if 标签是动态 SQL 中最常用的一个标签,它类似于 Java 中的 if 语句,用于在 SQL 语句中根据条件决定是否包含某些片段。本文将详细介绍如何在 MyBatis 中使用 if 标签来构建动态 SQL。

环境搭建

首先,确保你已经搭建了 MyBatis 的开发环境,包括 MyBatis 依赖的添加、数据库连接配置以及实体类、Mapper 接口和 XML 映射文件的定义。

实体类

以一个简单的 Blog 实体类为例:

public class Blog {  
    private String id;  
    private String title;  
    private String author;  
    private Date createTime;  
    private int views;  
  
    // 省略getter和setter方法  
}

Mapper 接口

定义一个 Mapper 接口来声明数据库操作方法:

public interface BlogMapper {  
    int addBlog(Blog blog);  
    List<Blog> queryBlogIF(Map<String, Object> map);  
}

Mapper XML

在 Mapper XML 文件中,使用 if 标签来编写动态 SQL。以下是一个使用 if 标签的示例:

<mapper namespace="com.example.mapper.BlogMapper">  
  
    <!-- 添加博客 -->  
    <insert id="addBlog" parameterType="com.example.pojo.Blog">  
        INSERT INTO blog (id, title, author, create_time, views)  
        VALUES (#{id}, #{title}, #{author}, #{createTime}, #{views});  
    </insert>  
  
    <!-- 条件查询博客 -->  
    <select id="queryBlogIF" resultType="com.example.pojo.Blog" parameterType="map">  
        SELECT * FROM blog  
        WHERE 1=1  
        <if test="title != null">  
            AND title LIKE CONCAT('%', #{title}, '%')  
        </if>  
    </select>  
  
</mapper>

注意:

  • 在使用 if 标签时,test 属性是必须的,它用于指定条件表达式。
  • 条件表达式中的字段名(如 title)必须与传入的参数对象(这里是 Map)中的键或实体类中的属性名一致。
  • 在 SQL 语句中,使用 #{} 来引用参数对象中的属性或 Map 中的值。

if 标签的进阶用法

数字类型的条件判断

当参数为数字类型时,可以直接判断是否为 null 或进行大小比较:

<if test="id != null and id > 28">  
    AND id = #{id}  
</if>

也可以使用 MyBatis 提供的符号进行比较,如 gt(大于)、lt(小于)等:

<if test="id != null and id gt 28">  
    AND id = #{id}  
</if>

字符串类型的条件判断

对于字符串类型,可以判断是否为 null 或空串,并进行模糊查询:

<if test="username != null and username != ''">  
    AND username LIKE CONCAT('%', #{username}, '%')  
</if>

复杂条件的逻辑组合

当需要多个条件组合时,可以使用 andor 进行逻辑组合:

<if test="username != null and username != ''">  
    AND username LIKE CONCAT('%', #{username}, '%')  
</if>  
<if test="views != null and views > 100">  
    AND views > #{views}  
</if>

注意事项

  • 当使用 if 标签时,如果条件不成立,则不会生成 SQL 片段,因此不会影响 SQL 语句的语法正确性。
  • 在使用 if 标签时,注意 SQL 语句中的逗号问题,尤其是在 SET 语句或 WHERE 子句中,避免因为条件不成立而导致 SQL 语句中多余的逗号。
  • 对于复杂逻辑的判断,可以考虑使用 choosewhenotherwise 等标签来替代多个 if 标签,使代码更加清晰。

总结

MyBatis 的动态 SQL 特性,特别是 if 标签,极大地提高了 SQL 语句的灵活性和可维护性。通过合理使用 if 标签,可以根据不同的条件动态构建 SQL 语句,从而满足复杂的业务需求。希望本文对你有所帮助,如果你有任何问题或建议,请随时留言交流。

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

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

相关文章

nginx服务器安装和部署代理

文章目录 Linux下面安装nginx nginx下载官网: [nginx: download](https://nginx.org/en/download.html) 使用yum命令安装gcc环境 yum install -y wget gcc-c pcre-devel zlib-devel openssl-devel//安装多个环境 wget gcc pcre-devel 支持正则表达式 zlib-devel提供了压缩和…

C++:输入输出,字符串,命名空间

1.输出斐波那契数列的前20项 #include <iostream>using namespace std;int main() {int a[20];int i;for(i0;i<20;i){if(i<2){a[i]1;cout<<a[i]<<ends;}else{a[i]a[i-1]a[i-2];cout<<a[i]<<ends;}}return 0; } 2.输入一个字符&#xff0…

Java泛型(“代码模板”,一套代码套用各种类型)

1.什么是泛型 a.定义 i.如果不用泛型定义&#xff0c;在使用ArrayList时需要为每个class编写特定类型代码。 ii.泛型就是定义一种模板&#xff0c;既实现了编写一次&#xff0c;万能匹配&#xff0c;又通过编译器保证了类型安全。 iii.编写模板代码来适应任意…

python调用c++动态链接库,环境是VS2022和vscode2023

目录 前言&#xff1a;配置环境&#xff1a;基础夯实&#xff08;对于ctypes的介绍&#xff09;&#xff1a;1. 加载共享库2. 定义函数原型3. 调用函数4. 处理数据结构5. 处理指针6. 错误处理7. 使用 ctypes.util总结 效果展示&#xff1a;操作步骤(保姆级教学)一在VS中创建dll…

【LGR-200-Div.4】洛谷入门赛 #27 A - H题解,包含(C++, Go语言)

前言&#xff1a; 本文为【LGR-200-Div.4】洛谷入门赛 #27 A - H题解 我只是一个只会各种暴力法的蒟蒻&#xff0c;这场比赛没有参加&#xff0c;是比赛完去写的&#xff0c;但是那个题目昨天晚上才能提交&#xff0c;导致拖久了一点 最后面贴一个Go语言的&#xff0c;反正也没…

前端分段式渲染较长文章

实现思路&#xff1a; 1. 后端返回整篇文章。 2. JavaScript 分段处理&#xff1a;将文章按一定的字符或段落长度分割&#xff0c;然后逐步将这些段落追加到页面上。 3. 定时器或递归调用&#xff1a;使用 setInterval 或 setTimeout 来控制段落的逐步渲染。 代码实现示例 …

2024年企业必备10款源代码加密软件!保护公司源代码 !

随着科技的发展&#xff0c;企业的数据安全性变得愈发重要&#xff0c;特别是源代码——企业的核心资产之一。源代码一旦泄露&#xff0c;可能带来不可估量的损失&#xff0c;导致竞争优势丧失、知识产权泄露&#xff0c;甚至对企业的未来生存造成威胁。因此&#xff0c;确保源…

Centos中关闭swap分区,关闭内存交换

概述&#xff1a; Swap 分区是 Linux 系统中扩展物理内存的一种机制。Swap的主要功能是当全部的RAM被占用并需要更多内存时&#xff0c;用磁盘空间代理RAM内存。Swap对虚拟化技术资源损耗非常大&#xff0c;一般虚拟化是不允许开启交换空间的&#xff0c;如果不关闭Swap&…

城市脉络下的空间句法:整合度与选择度的深度解析

上回写过一篇&#xff0c;基于空间句法的路网整合度、选择度分析&#xff0c;当时碍于篇幅和侧重点&#xff0c;主要讲了如何安装sDNA这个插件来实现路网的整合度、选择度分析&#xff0c;并且分析部分也只是画了几条简单的线段&#xff0c;这次我们深化一下原理和指标的解析&a…

手势识别-Yolov5模型-自制数据集训练

1、源码下载&#xff1a; 大家可以直接在浏览器搜索yolov5即可找到官方链接&#xff0c;跳转进github进行下载&#xff1a; 这里对yolov5模型补充说明一下&#xff0c;它是存在较多版本的&#xff0c;具体信息可在master->tags中查看&#xff0c;大家根据需要下载。这些不同…

2024.9.18 作业

将配置桥接网络的过程整理成文档&#xff0c;发csdn 放资源里了 思维导图&#xff1a;

0基础带你入门Linux之简介

1.Linux和Windows对比 Window很明显的特征就是有C盘、D盘登各种磁盘 我们通过点击不同的盘符&#xff0c;点击里面存储的文件进行查阅的操作 而Linux则很简单&#xff0c;只有一个根目录&#xff0c;也可以说只有一个盘&#xff0c;整个系统所有的东西都是在根目录下的 我们可…

C/C++中哪些数据存放于栈区、堆区、静态区、常量区的详细说明

文章目录 1. 栈区&#xff08;Stack&#xff09;2. 堆区&#xff08;Heap&#xff09;3. 静态区&#xff08;Static&#xff09;4. 常量区&#xff08;Read-Only or Constant Section&#xff09;总结&#xff1a;栈&#xff08;Stack&#xff09;的生长&#xff1a;堆&#xf…

js中apply,call,bind的区别与用法

在JavaScript中&#xff0c;所有的函数再被调用的时候都会默认传入两个参数&#xff0c;一个是this&#xff0c;还有一个是arguments。在默认情况下this都是指当前的调用函数的对象。但是有时候我们需要改变this的指向&#xff0c;也就是说使函数可以被其他对象来调用&#xff…

【数据可视化】Arcgis api 4.x 专题图制作之分级色彩,采用自然间断法(使用simple-statistics JS数学统计库生成自然间断点)

1.效果 2.实现 2.1 分级色彩 分级色彩是在GIS制图中&#xff0c;通过不同颜色等级来表示数据量级差异的符号化方法&#xff0c;帮助用户直观识别和比较数据的大小。 2.2 分级方法 在GIS中进行分级色彩制图时&#xff0c;可以选择不同的分级方法来表示数据的分布和变化&#xf…

好用又便宜的电商分账系统

多部门联合治税的背景下&#xff0c;合规运营是企业的首要任务。确保税务合规不仅能避免法律风险&#xff0c;还能提升企业的信誉和运营效率&#xff0c;电商分账系统是电商行业必备的合规工具。今天&#xff0c;商淘云为您分享选择性价比高的电商分账系统的三大规则&#xff0…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发&#xff0c;数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录&#xff0c;我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可&#xff0c;如果存在的情况我们再去获取下用户的信息看看token是否过期…

探索音乐的新边界——AI写歌的奇妙呈现

在音乐的世界里&#xff0c; 创新总是令人充满期待。 对于没有创作灵感、毫无创作水平的小孩&#xff0c;走进一个充满惊喜的音乐平台 —— &#xff08;Suno&#xff09; 看看AI 写歌的神奇魅力。S为我们提供了一个丰富多彩的音乐世界&#xff0c; 从新歌推荐到各种风格的音…

Vmware虚拟机无法打开内核设备“\\.\Global\vmx86“的解决方法

我的问题是在一次系统更新后&#xff0c;导致虚拟机无法使用的。我的虚拟机只有方法三解决了问题。 一、方法一 以管理员身份打开cmd&#xff0c;依次执行以下命令&#xff1a; net start vmci net start vmx86 net start VMnetuserif二、方法二 按 WinR 键&#xff0c;运行…