MyBatis案例 | 使用映射配置文件实现CRUD操作——动态SQL优化条件查询

news2025/7/13 2:40:31

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:🔥JavaWeb
Java入门篇: 🔥Java基础学习篇
Java进阶学习篇(持续更新中):🔑Java进阶学习篇

在这里插入图片描述
本系列文章会将讲述有关于如何使用MyBatis完成增删查改的操作,预计本系列文章会有以下这些文章,在写完本系列的文章后会有一篇文章罗列这些文章以及其地址(传送门)小伙伴们直接点击查看即可

文章名称文章地址
查询所有数据使用映射配置文件实现CRUD操作——查询所有数据
查询详情使用映射配置文件实现CRUD操作——通过主键查询对应数据
使用映射配置文件实现CRUD操作——多条件查询
添加数据
修改全部字段
修改动态字段
删除一条数据
批量删除数据

文章目录

  • 一、前言
  • 二、概述
  • 三、if标签(多条件动态查询)
    • 1.概述
    • 2.格式
    • 3.具体实例
    • 4.弊端
    • 5.解决弊端方法
      • 1️⃣使用恒等式
      • 2️⃣使用where标签
  • 四、choose标签(单条件动态查询)
    • 1.概述
    • 2.格式
    • 3.实例
  • 五、结语

一、前言

在上一篇文章中我们说到:单单使用参数占位符去编写SQL语句还是存在一定的问题的,比如当我们有一个参数没有值的时候,就查询不出来结果了,而这种情况极有可能发生(因为用户不一定会筛选所有条件)所以要用动态SQL来解决问题

二、概述

在MyBatis中有以下几个属性标签来支撑动态SQL

  • if

  • choose(when,otherwise)

  • trim(where,set)

  • foreach

三、if标签(多条件动态查询)

1.概述

if标签是条件判断,if标签里面写test,即逻辑表达式,可以理解为if后面的判断语句

2.格式

<if test="···">
	···
</if>

3.具体实例

<select id="selectByCondition" resultMap="brandResultMap">

        select
        *
        from tb_brand
        where
        <if test="status != null">
            status = #{status}
        </if>

        <if test="companyName != null and conpanyName != '' ">
            and company_name like #{companyName}
        </if>

        <if test="brandName != null and brandName != '' ">
            and brand_name like #{brandName}
        </if>


    </select>

4.弊端

当我们stasus参数没有传入的时候,SQL语句会变化,变成一个不正确的SQL语句,如下所示,所以在查询过程中也会报错,无法正确实现查询要求,但是如果不加and的话,原本的SQL语句语法也不对,所以接下来会讲述如何解决
在这里插入图片描述

此时 SQL 语句

select * from tb_brand where and company_name like ? and brand_name like ?

5.解决弊端方法

1️⃣使用恒等式

这里我们只需要在where后加一个恒等式"1 = 1",那么就算第一个条件没有执行,SQL语句也不会出现语法错误,拼接完后的SQL语句会变成如下这样,也就不会报错,可以正常执行,但是依然不是最优解。MyBtais提供了一个where标签可以一下子解决问题

select * from tb_brand where 1 = 1 and company_name like ? and brand_name like ?

2️⃣使用where标签

这个标签可以 自动生成SQL语句中的WHERE关键字,并判断是否只有一个条件,如果是,还会 自动去掉AND,保证SQL语句的语法正确性
在这里插入图片描述

四、choose标签(单条件动态查询)

1.概述

choose标签是可以从多个条件中选择一个,可以把它看成Java中的switch语句,既然是要选择,那么每个条件都要有一个when标签包裹语句,如果所有条件都不符合的话,就要用otherwise标签来包裹最后的语句,一般为1 = 1,即直接查询所有的数据

一般会使用在单条件的动态查询中,比如下拉表单选择要查询的条件(状态/品牌名称/公司名称),再输入自己想要搜索的关键字

2.格式

<choose>

	<when>
		···
	</when>
	
	<when>
		···
	</when>
	
	<otherwise>
		···
	</otherwise>
	
</choose>

3.实例

<select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
       		<choose>

            	<when test="status != null">
                status = #{status}
            	</when>

            	<when test="companyName != null and conpanyName != '' ">
                company_name like #{companyName}
            	</when>

            	<when test="brandName != null and brandName != '' ">
                brand_name like #{brandName}
            	</when>
            	
            	<otherwise>
                1 = 1;
            	</otherwise>

        	</choose>
	</where>
</select>

这里的测试类与前面相同,这里就不再赘述了,大家可以查看前面的文章来写测试类,这里我就传入了一个status参数来查询,即查询状态为1的数据,结果如下

[Brand{id=2, brandName=‘华为’, companyName=‘华为技术有限公司’, ordered=100, description=‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’, status=1}, Brand{id=3, brandName=‘小米’, companyName=‘小米科技有限公司’, ordered=50, description=‘are you ok’, status=1}]

如果没有任何一个参数传递进去的话,那么执行的会是1 = 1,那结果应该是表格中所有的数据
在这里插入图片描述

[Brand{id=1, brandName=‘三只松鼠’, companyName=‘三只松鼠股份有限公司’, ordered=5, description=‘好吃不上火’, status=0}, Brand{id=2, brandName=‘华为’, companyName=‘华为技术有限公司’, ordered=100, description=‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’, status=1}, Brand{id=3, brandName=‘小米’, companyName=‘小米科技有限公司’, ordered=50, description=‘are you ok’, status=1}]

五、结语

接下来将讲述添加功能,有任何问题可以留言评论

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

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

相关文章

面试官:如何进行 JVM 调优(附真实案例)

前言 面试官&#xff1a;在工作中做过 JVM 调优吗&#xff1f;讲讲做过哪些 JVM 调优&#xff1f; 我一个QPS不到10的项目&#xff0c;上次问我缓存穿透缓存雪崩&#xff0c;这次问我 JVM 调优&#xff0c;我是真滴难。 不过大家别慌&#xff0c;热心的我给大家找来了几个满分…

一文学会IDEA中的Maven集成与创建(详细教程)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

‘conda‘不是内部或外部命令,也不是可运行的程序或批处理文件。

Anaconda环境搭建常见问题 conda不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决方案&#xff1a;配置环境变量 1.找到Anaconda Nvaigator单机右键 2.更多 3.打开文件所在位置 4.继续Anaconda Nvaigator单机右键&#xff0c;更多&#xff0c;选择文件…

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下&#xff0c;赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写&#xff0c;这里不清楚的同学可以看一下我上一篇文章。…

IDEA连接MySQL数据库并执行SQL语句使用数据

文章目录一、IDEA连接MySQL数据库&#xff08;一&#xff09;首先新建普通Java项目&#xff08;二&#xff09;连接数据库1、点击右侧DataBase2、点击加号&#xff0c;找到MySQL&#xff0c;添加数据库3、输入用户名和密码&#xff0c;点击**Test Connection**4、显示连接成功&…

深度分析| 数据防泄露技术再次“翻红”的思考与建议

此文章由天空卫士供稿 01、数据防泄露的定义 数据防泄露&#xff08;Data leakage prevention&#xff0c;DLP&#xff09;是指通过一定的技术和管理&#xff0c;防止组织内敏感数据或信息资产&#xff0c;违反安全约束而丧失组织控制、破坏数据机密性的策略和措施。数据防泄…

【云原生】裸金属架构之服务器安装VMWare ESXI虚拟化平台详细流程

??作者简介&#xff1a;大家好&#xff0c;我是&#xff0c;运维领域创作者&#xff0c;??阿里云ACE认证高级工程师?? 个人主页&#xff1a; ??支持我&#xff1a;点赞??收藏留言?? ??格言&#xff1a;你未必出类拔萃&#xff0c;但一定与众不同&#xff01;??…

[SSD4] 固态硬盘主控功能_SSD主控品牌

固态硬盘(Solid State Drives),简称SSD。它是一种电脑存储设备,由闪存(FLASH)、 闪存控制器、高速缓存(DRAM)组成。这是是固态硬盘的三个基本部件,对性能有关键影响。 了解一颗固态硬盘首先要从主控入手,主控对于固态硬盘的影响丝毫不亚于闪存。那么主控芯片对于固态硬盘…

来了!Python 官方发布了整套的中文PDF 文档(共27本)

1. 《Python中文指南》 学 Python 最好的学习资料永远是 Python 官方文档&#xff0c;可惜现在的官方文档大都是英文&#xff0c;虽然有中文的翻译版了&#xff0c;但是进度实在堪忧。 为了照顾英文不好的同学&#xff0c;我自己写了一份 面向零基础的朋友 的在线 Python 文档…

Stable diffusion安装踩坑(winMaciOS)

今天Apple官方支持了这个库&#xff0c;所以特意下载下来试试看&#xff0c;效果还不错&#xff0c;M芯片在深度学习领域第一次给人惊喜了。 https://machinelearning.apple.com/research/stable-diffusion-coreml-apple-silicon 1.win使用 安装 分享一下一个有意思的库的安…

算法的效率——时间复杂度和空间复杂度

文章目录1. 算法效率1.1 什么是算法1.2 算法的好坏2. 时间复杂度2.1 什么是时间复杂度2.2 时间复杂度的计算方法2.3 大O的渐进表示法2.4 常见时间复杂度计算举例3. 空间复杂度4. 常见复杂度对比1. 算法效率 1.1 什么是算法 目前普遍认可对算法的定义是&#xff1a;算法是解决…

通过CSS,H5,JavaScript实现表格表单的随机选择,和简单的随机点名。

目录 一、表格表单的随机选择 效果展示&#xff08;表单内容可以根据自己需要进行修改&#xff09; 1.H5的布局 第一步&#xff1a; 第二步&#xff1a; 2.CSS布局 3.JS的布局 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 二、简单的随机点名 效果展…

软件测试简历项目经验怎么写,没有项目经验?

怎么办&#xff1f;只能接受低薪工作吗&#xff1f;No No No。本文就教大家如何解决这个问题。 为了帮助大家彻底解决“没有项目”这个拦路虎&#xff0c;接下来文章将从以下几个方面进行展开&#xff1a; 1、应该去哪找项目&#xff1f; 2、在众多的项目中&#xff0c;该怎么…

【AI作画】使用stable-diffusion-webui搭建AI作画平台

一、安装配置Anaconda 进入官网下载安装包https://www.anaconda.com/并安装&#xff0c;然后将Anaconda配置到环境变量中。 打开命令行&#xff0c;依次通过如下命令创建Python运行虚拟环境。 conda env create novelai python3.10.6E:\workspace\02_Python\novalai>conda…

基于FPGA 的TDC设计更好的选择——易灵思Quantum架构FPGA

时间数据转换器(TDC)常被用于测量时间间隔&#xff0c;被广泛应用于飞行时间测量领域。分辨率是一个重要的参数&#xff0c;但TDC线性度将直接影响整个系统的精度。尤其是近年来迅猛增长的汽车自动驾驶&#xff08;ADAS&#xff09;领域&#xff0c;利用光测距的激光雷达&#…

GCN-图卷积神经网络算法简单实现(含python代码)

本文是就实现GCN算法模型进行的代码介绍&#xff0c;上一篇文章是GCN算法的原理和模型介绍。 代码中用到的Cora数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1SbqIOtysKqHKZ7C50DM_eA 提取码&#xff1a;pfny 文章目录 目的 一、数据集介绍 二、实现过程讲…

[闪存 2.1] 闪存芯片物理结构与_SLC/MLC/TLC/QLC

固态硬盘(Solid State Drives),简称SSD。它是一种电脑存储设备,由闪存(FLASH)、 闪存控制器、高速缓存(DRAM)组成。这是是固态硬盘的三个基本部件,对性能有关键影响。 闪存芯片简介闪存颗粒是固态

MySQL数据库的基础语法总结(1)

MySql一.数据库,数据表的基本操作1.数据库的基本操作2. 数据表的基本操作2.1 数据库的数据类型2.1.1 整数类型2.1.2 浮点数类型和定点数类型2.1.3 字符串类型2.1.4 日期与时间类型2.2 数据表的基本操作2.2.1 创建一个数据表2.2.2 查看数据表2.2.3 查看表的基本信息的MySQL指令2…

设计模式(上)

目录 1.设计模式概述 1.什么是设计模式 2.学习设计模式的意义 3.23种设计模式 4.七大设计原则 2.创建者模式 1.单例模式 2.工厂模式 3.抽象工厂模式 4.建造者模式 5.原型模式 3.结构型模式 1.适配器模式 2.桥接模式 3.代理模式 4.组合模式 5.装饰模式 6.享元…

[架构之路-24]:目标系统 - 系统软件 - C语言的结构与程序的工作原理 - 程序控制、函数调用栈、函数调用性能优化

目录 前言&#xff1a; 第1章 结构化程序与分层编程系统 1.1 计算机软硬件模型 1.2 程序的经典框架&#xff1a;算法数据结构 1.3 程序的结构化框架 1.4 程序的层次模型 1.5 程序设计的层次模型 第2章 C语言概述 2.1 C语言本质 2.2 C语言关键字 2.3 C语言在编程语言的…