当前位置: 首页 > news >正文

Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句

Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句

有一张User表,传递name和age参数,通过mybatis的xml格式编写查询name=like“%张%”,或者age=18的学生信息,但是注意传递name和age参数,不一定都有参数值,用xml如何写出查询语句

如果希望在 nameage 都有值的情况下,实现 name 包含给定字符串 age 等于指定值的查询,可以将 AND 改为 OR,并在判断条件时加上逻辑处理。以下是改写的 XML 查询:

<select id="selectStudentByNameOrAge" resultType="User">SELECT * FROM UserWHERE 1=1<if test="name != null and name != ''">AND (name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null"><if test="name != null and name != ''">OR age = #{age})</if><if test="name == null or name == ''">AND age = #{age}</if></if>
</select>

解释

  1. WHERE 1=1 起到占位作用,简化 SQL 条件的拼接。

  2. <if test="name != null and name != ''">:判断 name 是否有值。如果有,则拼接 AND (name LIKE CONCAT('%', #{name}, '%')

  3. <if test="age != null">:判断 age 是否有值。

    是否有值。

    • 如果 agename 都有值,则拼接 OR age = #{age}),实现 nameage 的条件。
    • 如果只有 age 有值(name 为空),则拼接 AND age = #{age}

这样实现后,如果 nameage 都有值,会查询满足 name 包含指定字符串 age 等于指定值的用户。

或者

<select id="selectStudentByNameOrAge" resultType="User">SELECT * FROM UserWHERE 1=1<if test="name != null and name != ''">AND (name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null"><if test="name != null and name != ''">OR</if>age = #{age})</if><if test="name == null or name == ''"><if test="age != null">AND age = #{age}</if></if>
</select>

解释:

  1. 使用 OR 逻辑:如果 nameage 都有值,则 nameage 的条件会被括在一起,实现 (name LIKE '%张%' OR age = 18) 的逻辑。
  2. 分支控制:
    • 如果 name 有值,先添加 name LIKE 条件;
    • 如果 age 也有值,在 name 后面添加 OR age = #{age};
    • 如果只有 age 有值,而 name 没有值,则直接在外面添加 age = #{age} 条件

相关文章:

Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句

Mybatis 注意传递多种参数&#xff0c;不一定都有参数值&#xff0c;用xml如何写出查询语句 有一张User表&#xff0c;传递name和age参数&#xff0c;通过mybatis的xml格式编写查询namelike“%张%”&#xff0c;或者age18的学生信息&#xff0c;但是注意传递name和age参数&…...

【Windows】Redis 部署

1、部署 &#xff08;1&#xff09;下载 目前 Redis官网 没有提供Windows版本的安装程序&#xff0c;如果需要安装&#xff0c;需要到Github上下载适合Windows的版本。 具体下载地址为&#xff1a; Redis-x64-3.0.504.zipRedis-x64-5.0.14.1.zip &#xff08;2&#xff09…...

【经典】Vue中this指向问题??

在Vue中&#xff0c;this关键字的指向取决于this在何处被定义。在Vue的组件方法中&#xff0c;this指向当前组件实例&#xff0c;即Vue的实例。 以下是一些常见场景的this指向示例&#xff1a; 组件方法内部&#xff1a; export default { methods: { someMethod() { …...

Oracle数据泵(expdp)导入导出数据

源数据库操作&#xff08;数据备份&#xff09; 自定义变量 1.查询当前数据库的自定义变量&#xff08;里面包含导出数据文件路径变量配置&#xff0c;即DUMP_DIR&#xff09; select * from dba_directories; 2.若没有配置&#xff0c;则创建一个dump_dir&#xff08;变量…...

得物App 3D球鞋博物馆亮相两博会,打造沉浸式消费新体验

近日&#xff0c;2024中国体育文化博览会、中国体育旅游博览会&#xff08;简称“两博会”&#xff09;在苏州国际展览中心拉开帷幕。得物App携手Apple Vision Pro共同打造的3D球鞋博物馆亮相两博会上海展区&#xff0c;并通过3D技术为观众呈现独特的沉浸式消费新体验。 在3D球…...

深度学习中的迁移学习

文章目录 一、迁移学习的基本概念二、迁移学习的步骤三、迁移学习的策略四、迁移学习的应用五、迁移学习的挑战与未来展望 深度学习中的迁移学习是一种重要的机器学习方法&#xff0c;其 核心思想在于利用从一个任务&#xff08;源任务&#xff09;中学到的知识或模型&#xf…...

【深入浅出】深入浅出Bert(附面试题)

本文的目的是为了帮助大家面试Bert&#xff0c;会结合我的面试经历以及看法去讲解Bert&#xff0c;并非完整的技术细致讲解&#xff0c;介意请移步。 深入浅出】深入浅出Bert&#xff08;附面试题&#xff09; 网络结构Pre-TrainingFine-Tuning 输入编码词向量编码句子编码位置…...

Docker-安装

操作系统&#xff1a;Ubuntu 20.04.6 LTS 更新apt sudo apt update 删除旧版本docker sudo apt-get remove docker docker-engine docker.io 安装docker sudo apt install docker.io 查看docker版本 docker --version 启动docker 启动docker sudo systemctl start docker 启用…...

《盼归》

《盼归》 烈日炎炎天桥上&#xff0c;小月踮脚望远方。 汗水滑落笑颜开&#xff0c;心中英雄是父忙。 车声轰鸣情意长&#xff0c;喇叭回应泪两行。 生日快乐声声唤&#xff0c;盼父归来情意长。 在一个炎热的夏日午后&#xff0c;阳光炙烤着大地&#xff0c;天桥上的温度达…...

第十九章 Vue组件之data函数

目录 一、引言 二、示例代码 2.1. 工程结构图 2.2. main.js 2.3. App.vue 2.4. BaseCount.vue 三、运行效果 一、引言 在Vue CLI脚手架中一个组件的data选项必须是一个函数&#xff0c;以此保证每个组件实例&#xff0c;维护独立的一份数据对象。每次创建新的组件实…...

【jvm】什么时候对象进入老年代

目录 1. 对象年龄达到阈值2. 大对象直接进入老年代3. 动态晋升条件 1. 对象年龄达到阈值 1.基本机制&#xff1a;当一个对象在新生代&#xff08;包括Eden区和Survivor区&#xff09;中经历了多次垃圾回收&#xff08;GC&#xff09;后仍然存活&#xff0c;其年龄会逐渐增加。…...

Vue.nextTick 使用指南:数据更新与 DOM 同步利器

前言 在使用 Vue.js 开发单页面应用时&#xff0c;我们常常需要在数据更新后执行一些操作&#xff0c;比如更新 DOM 或者进行一些依赖于最新数据的计算。这时候&#xff0c;Vue.nextTick 就显得尤为重要&#xff0c;本文将详细介绍 Vue.nextTick 的作用与使用方法。 什么是 V…...

第三百零一节 Lucene教程 - Lucene索引文件

Lucene教程 - Lucene索引文件 索引是识别文档并为搜索准备文档的过程。 下表列出了索引过程中常用的类。 类描述IndexWriter在索引过程中创建/更新索引。Directory表示索引的存储位置。Analyzer分析文档并从文本中获取标记/单词。Document带有字段的虚拟文档。分析仪可以处理…...

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…...

使用常数指针作为函数参数

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用setbas…...

wps宏代码学习

推荐学习视频&#xff1a;https://space.bilibili.com/363834767/channel/collectiondetail?sid1139008&spm_id_from333.788.0.0 打开宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区&#xff0c;当打开多个excel时会有多个&#xff0c;要注意不要把…...

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后&#xff0c;找不到ffmpeg中的一个文件 产生原因&#xff0c;各种包集成&#xff0c;然后安装以后乱七八糟&#xff0c;甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…...

Rust:Vec<u8> 与 [u8] 之间的转换

在 Rust 中&#xff0c;Vec<u8> 是一个动态数组&#xff0c;而 &[u8] 是一个指向字节切片的不可变引用。这两者之间经常需要进行转换&#xff0c;因为它们在处理字节数据时非常常见。 从 &[u8] 转换为 Vec<u8> 要将一个字节切片 &[u8] 转换为一个 Ve…...

Leetcode 课程表

这段代码的算法思想是基于**深度优先搜索&#xff08;DFS&#xff09;**来检测图中的环路&#xff0c;从而判断是否可以完成所有课程。具体来说&#xff0c;我们将每门课程和它的先修关系视为一个有向图&#xff0c;问题的核心就是判断这个有向图中是否存在环路。如果有环路&am…...

Java面试经典 150 题.P55. 跳跃游戏(009)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public boolean canJump(int[] nums) {int…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...