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

MyBatis系统学习篇 - 动态SQL

MyBatis提供了动态SQL帮助我们解决在业务过程中,我们根据不同的条件动态生成SQL语句,用来满足各种复杂的查询需求,包括MyBatis中常用的动态SQL标签和用法,这种方式在一定程度上帮助我们重复写许多SQL堆积在一起,下面我们就看一下Mybatis中常用的有哪些动态SQL标签以及他的用法:

if

<if>:用来表示条件判断,根据我们的条件动态生成SQL片段。在实际开发中,算是我们用的最多的一种动态SQL条件判断字段是加入SQL中还是不加入SQL语句中。

<select id="getUser" resultType="com.example.User">SELECT * FROM usersWHERE 1=1<if test="name != null and name != ''">AND name = #{name}</if><if test="age != null">AND age = #{age}</if>
</select>

上述代码中,我们使用了<if> 语句来判断,上述语句的 name != null and name != '' 表示,当传过来的name 字段的值不为空,并且name 传过来的是不是空字符串,那么我们就通过 将<if >语句内部的SQL语句添加进去。实际上If 标签,就是通过test属性的表达式进行判断,当表达式的结果为true,那么标签中的内容就会执行,否则就直接被忽略掉。

where

<where>: where一般和if结合使用:

  • 当where 标签中的if条件都不满足的时候,则where标签没有任何功能,那就不会添加任何的where关键字。
  • 当where标签中的if条件有满足或者全部满足的时候,那么where标签会自动添加where关键字,并将条件最前方多余的and去掉
    ps: where标签不能去掉条件最后多余的and标签
<select id="getUser" resultType="com.example.User">SELECT * FROM users<where><if test="name != null and name != ''">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>

trim标签

<trim>:用于去除或添加SQL片段的前缀或后缀。
常用属性:

  • prefix: 在trim标签中的内容的前面添加某些内容。
  • prefixOverrides: 在trim标签中的内容的前面去掉某些内容。
  • suffix:在trim标签中内容的后面添加某些内容。
  • suffixOverrides : 在trim标签中的内容的后面去掉某些内容。
<select id="getEmpListByMoreTJ" resultType="Emp">select * from users<trim prefix="where" suffixOverrides="and"><if test="name != '' and name != null">name = #{ename} and</if><if test="age != '' and age != null">age = #{age} and</if><if test="sex != '' and sex != null">sex = #{sex}</if></trim>
</select>

<trim prefix="where" suffixOverrides="and">:在<trim>标签中添加了前缀where,并通过suffixOverrides="and"去除了最后一个条件中的and。
根据不同的条件值,动态生成了查询语句的条件部分。如果ename、age和sex参数都有值,则生成完整的查询条件;如果某个参数没有值,则不生成对应的条件。

上述示例中使用了#{}占位符来引用参数值,这是为了防止SQL注入攻击。确保传递给SQL语句的参数值被正确地转义和处理。

choose、when、otherwise

<choose><when><otherwise>:用于多条件判断,类似于Java中的switch语句。也可以说是if ...else if ... else

<select id="getUser" resultType="com.example.User">SELECT * FROM usersWHERE 1=1<choose><when test="name != null">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 'ACTIVE'</otherwise></choose>
</select>

在上述示例中,根据name和age参数的值,动态生成了不同的查询条件:

如果name参数不为null,则生成AND name = #{name}的条件。
如果age参数不为null,则生成AND age = #{age}的条件。
如果以上两个条件都不成立(即name和age都为null),则生成AND status = 'ACTIVE’的条件。

<choose>标签用于多条件判断,类似于Java中的switch语句。在<choose>标签中,可以包含多个<when>标签和一个<otherwise>标签。

<when>标签用于指定条件成立时生成的SQL片段。在每个<when>标签中,通过test属性来判断条件是否成立。

<otherwise>标签用于指定所有条件都不成立时生成的SQL片段。

通过使用、和标签,可以根据不同的条件值动态生成不同的SQL片段,实现灵活的条件判断和SQL拼接。这样可以满足复杂查询需求,同时保持SQL语句的可读性和可维护性。

foreach

<foreach>:用于遍历集合或数组,生成重复的SQL片段。

<!--int insertMoreEmp(List<Emp> emps);-->
<insert id="insertMoreEmp">insert into t_emp values<foreach collection="emps" item="emp" separator=",">(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)</foreach>
</insert>
<!--int deleteMoreByArray(int[] eids);-->
<delete id="deleteMoreByArray">delete from t_emp where<foreach collection="eids" item="eid" separator="or">eid = #{eid}</foreach>
</delete>
<!--int deleteMoreByArray(int[] eids);-->
<delete id="deleteMoreByArray">delete from t_emp where eid in<foreach collection="eids" item="eid" separator="," open="(" close=")">#{eid}</foreach>
</delete>

<insert>标签示例:

<insert id="insertMoreEmp">insert into t_emp values<foreach collection="emps" item="emp" separator=",">(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)</foreach>
</insert>

使用了<foreach>标签来遍历emps集合,将集合中的每个Emp对象的属性值插入到t_emp表中。

public int insertMoreEmp(List<Emp> emps) {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);return empMapper.insertMoreEmp(emps);}
}public static void main(String[] args) {List<Emp> emps = new ArrayList<>();// 添加要插入的Emp对象到emps集合中Emp emp1 = new Emp();emp1.setEname("John");emp1.setAge(25);emp1.setSex("Male");emp1.setEmail("john@example.com");emps.add(emp1);Emp emp2 = new Emp();emp2.setEname("Jane");emp2.setAge(30);emp2.setSex("Female");emp2.setEmail("jane@example.com");emps.add(emp2);// 调用insertMoreEmp方法进行批量插入int rowsAffected = insertMoreEmp(emps);System.out.println(rowsAffected + " rows inserted.");
}

<delete>标签示例(使用or连接条件)

<delete id="deleteMoreByArray">delete from t_emp where<foreach collection="eids" item="eid" separator="or">eid = #{eid}</foreach>
</delete>

在上述示例中,使用了<foreach>标签来遍历eids数组,将数组中的每个元素作为删除条件的一部分,使用or连接多个条件。

public int deleteMoreByArray(int[] eids) {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);return empMapper.deleteMoreByArray(eids);}
}public static void main(String[] args) {int[] eids = {1, 2, 3}; // 要删除的eid数组// 调用deleteMoreByArray方法进行批量删除int rowsAffected = deleteMoreByArray(eids);System.out.println(rowsAffected + " rows deleted.");
}

<delete>标签示例(使用in连接条件):

<delete id="deleteMoreByArray">delete from t_emp where eid in<foreach collection="eids" item="eid" separator="," open="(" close=")">#{eid}</foreach>
</delete>

公共SQL片段

在Mapper.xml文件中,我们对可以通过记录一段公共的SQL片段,在使用的地方通过include标签进行引入。

示例:

<sql id="empColumns">eid,ename,age,sex,did
</sql>

使用:

select <include refid="empColumns"></include> from t_emp

相关文章:

MyBatis系统学习篇 - 动态SQL

MyBatis提供了动态SQL帮助我们解决在业务过程中&#xff0c;我们根据不同的条件动态生成SQL语句&#xff0c;用来满足各种复杂的查询需求&#xff0c;包括MyBatis中常用的动态SQL标签和用法&#xff0c;这种方式在一定程度上帮助我们重复写许多SQL堆积在一起&#xff0c;下面我…...

[LLM-Agent]万字长文深度解析规划框架:HuggingGPT

HuggingGPT是一个结合了ChatGPT和Hugging Face平台上的各种专家模型&#xff0c;以解决复杂的AI任务&#xff0c;可以认为他是一种结合任务规划和工具调用两种Agent工作流的框架。它的工作流程主要分为以下几个步骤&#xff1a; 任务规划&#xff1a;使用ChatGPT分析用户的请求…...

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新&#xff1a;AI与云原生的融合之旅 1. 智能数据库管理&#xff1a;AI的魔法 在数字化时代&#xff0c;数据库技术作为信息管理的核心&#xff0c;正经历着前所未有的变革。AI&#xff08;人工智能&#xff09;和云原生技术的融合&#xff0c;正在重新定义数据库…...

彩光赋能中国智造 极简光3.X助力“数智”转型

蒸汽时代、电气时代、信息时代三大工业革命后 互联网和智能制造主导的工业4.0时代来临 大数据、云计算、人工智能等新兴技术 对企业园区的网络架构、负载能力等 提出了新要求,也使得光纤较于传统铜缆 在距离、性能、延时上的优势日益凸显 基于此 围绕未来园区网建设的企…...

985上交应届生转正12天,被某东辞退了!

&#x1f447;我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299&#xff0c;限时特价2杯咖啡&#xff0c;满100人涨10元。 01.事情起源 最近粉丝群都在转发一个截图&#xff0c;某应届毕业生在某东实习一年&#xff0c;才转正才12天&#xff0c;就因为自己调侃…...

Unity算法(一)——快速排序算法

文章目录 前言快速排序算法1、概念与实现2、优化 前言 算法是程序员的基础能力之一&#xff0c;资质越老的程序员在这方面理解会越深&#xff0c;很多时候项目在某个需要优化、提升的节点时&#xff0c;往往一些算法的使用就可以大大提升程序性能。当然&#xff0c;对于不同项…...

Leetcode 2028

思路&#xff1a;1-6之间的的n个数组合起来要变成sum_t mean*(rolls.size()n) - sum(rolls) ; 那么可以先假设每个数都是sum_t / n 其中这个数必须要在1 - 6 之间否者无法分配。 然后可以得出n * (sum_t / n ) < sum ; 需要对余数mod进行调整&#xff0c;为了减少调整的次…...

Angular(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目&#xff0c;可以使用 Angular CLI&#xff08;命令行界面&#xff09;。以下是使用 Angular CLI 创建一个新项目的步骤&#xff1a; 1、安装 Angular CLI&#xff1a; 打开你的命令行界面&#xff08;在 Windows 上是 CMD、PowerShell 或 Git Bas…...

字节跳动(校招)算法原题

大模型"价格战"越演越烈 昨天的 文章 提到&#xff0c;自从 5 月 15 号&#xff0c;字节跳动发布了击穿行业底价的豆包大模型后&#xff0c;各大厂家纷纷跟进降价&#xff0c;而且都不是普通降价&#xff0c;要么降价 90% 以上&#xff0c;要么直接免费。 今天是豆包…...

前端面试题日常练-day39 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 哪个jQuery方法用于设置元素的HTML内容&#xff1f; a) .html() b) .text() c) .val() d) .append() 2. 在jQuery中&#xff0c;以下哪个方法用于隐藏或显示一个元素&#xff1f; a) .toggle…...

心电信号降噪方法(滤波器/移动平均/小波等,MATLAB环境)

对于一个正常的、完整的心动周期&#xff0c;对应的心电图波形如下图所示&#xff0c;各个波形都对应着心脏兴奋活动的生理过程&#xff0c;包含P波&#xff0c;PR段&#xff0c;QRS波群&#xff0c;ST段&#xff0c;T波&#xff0c;U波。 &#xff08;1&#xff09;P波心电图中…...

Kubernetes 文档 / 概念 / 工作负载 / 管理工作负载

Kubernetes 文档 / 概念 / 工作负载 / 管理工作负载 此文档从 Kubernetes 官网摘录 中文地址 英文地址 你已经部署了你的应用并且通过 Service 将其暴露出来。现在要做什么&#xff1f; Kubernetes 提供了一系列的工具帮助你管理应用的部署&#xff0c;包括扩缩和更新。 组织…...

【第6章】SpringBoot整合Mybatis

文章目录 前言一、准备1. 版本要求2.安装3. 建表语句 二、案例1. mapper2.实体类3.测试类4.扫描5. 配置6. mapper.xml7.输出 总结 前言 MyBatis-Spring-Boot-Starter 可以帮助你更快地在 Spring Boot 之上构建 MyBatis 应用。 一、准备 1. 版本要求 MyBatis-Spring-Boot-Sta…...

vim常用指令——001

vim常用指令 Vim的命令模式常用操作一、定位移动光标二、行的基本操作【复制、粘贴、删除】三、查找、替换四、分屏命令 总结给大家总结下四个运行模式&#xff1a; Vim的命令模式常用操作 一、定位移动光标 按h&#xff1a;将光标向左移动一个字符&#xff0c;等同于方向键左…...

java 对接农行支付相关业务(二)

文章目录 农行掌银集成第三方APP1:掌银支付对接快e通的流程1.1 在农行网站上注册我们的app信息([网址](https://openbank.abchina.com/Portal/index/index.html))1.2:java整合农行的jar包依赖1.3:把相关配置信息整合到项目中1.4:前端获取授权码信息1.5:后端根据授权码信…...

超频是什么意思?超频的好处和坏处

你是否曾经听说过超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 电脑超频是什么意思 电脑超频&#xff08;Overclocking&#xff09;&#xff0c;顾名思义&#xff0c;是…...

【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示

进度条控制脚本&#xff0c;支持节点进度条&#xff0c;图片进度条&#xff0c;进度条组件&#xff0c;和进度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定义…...

Bean的一些属性信息总结

我们知道&#xff0c;在Spring中&#xff0c;一个Bean可以理解为一个对象&#xff0c;但是二者之间肯定是有区别的&#xff0c;比如一个Bean可以实例化成很多个对象、Bean中可以带有某些描述信息。 学习Bean&#xff0c;能更好地使用Bean。 1、Spring两个核心概念的由来【可忽…...

CentOS 7 安装 Minio

获取MinIO安装包 下载地址如下&#xff1a;下载地址通过以下命令可直接将安装包下载至服务器 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm安装MinIO rpm -ivh minio-20230809233022.0.0.x86_64.rpm集成Systemd …...

vue3和vite实现vue-router4版本路由的配置以及自动生成路由配置

这个是普通的手动路由配置&#xff1a;https://blog.csdn.net/weixin_68658847/article/details/130071101 自动路由配置 创建项目 npm create vitelatest my-vue-app -- --template vue // 或者 yarn create vite my-vue-app --template vue// 安装路由 yarn add vue-route…...

掌握AMD Ryzen处理器精细调控:SMUDebugTool实战指南

掌握AMD Ryzen处理器精细调控&#xff1a;SMUDebugTool实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…...

别再套table了!手把手教你用LaTeX的longtable搞定跨页表格(附字体调整避坑指南)

LaTeX长表格排版实战&#xff1a;从table到longtable的平滑迁移与字体优化 第一次在LaTeX中遇到需要跨页的表格时&#xff0c;我像大多数初学者一样&#xff0c;本能地在longtable外面套了一层table环境——结果表格不仅无法正确分页&#xff0c;还出现了各种诡异的格式错乱。经…...

罗技鼠标宏完整实现方案:从Lua脚本到PUBG精准射击的进阶指南

罗技鼠标宏完整实现方案&#xff1a;从Lua脚本到PUBG精准射击的进阶指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在竞技射击游戏《绝地求…...

智慧树自动刷课插件终极指南:5分钟快速上手,告别手动刷课烦恼

智慧树自动刷课插件终极指南&#xff1a;5分钟快速上手&#xff0c;告别手动刷课烦恼 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频操作而…...

Windows进程注入技术深度解析:从DLL注入到反射式加载

1. 项目概述与核心价值在Windows安全研究、恶意软件分析乃至一些高级的软件开发场景中&#xff0c;“进程注入”是一个绕不开的核心技术点。简单来说&#xff0c;它指的是将一个代码模块&#xff08;通常是DLL&#xff09;或一段代码&#xff08;Shellcode&#xff09;加载到另…...

基于以太网转换器的工业交换机接入方案提升数据传输效率与稳定性

一、项目背景 某中型自动化生产企业现有3条生产线&#xff0c;核心控制设备采用10套西门子S7-200 SMART CPU SR40 PLC&#xff0c;负责生产线配料、输送、检测等全流程控制。随着企业数字化升级推进&#xff0c;需实现PLC与上位机、触摸屏的数据实时交互&#xff0c;接入工厂简…...

多 Harness Control Plane 如何重塑企业云 Agent 架构

Agent 规模化部署的真正瓶颈不是模型&#xff0c;而是 Harness 选择与治理 在生产环境中&#xff0c;工程领导者决定今年要把云 Agent 推到全团队规模&#xff1a;代码迁移、大型特性构建、生产部署、日常运维全线自动化。可一旦真正落地&#xff0c;第一个卡住的永远不是模型能…...

别再只盯着IoU了!深入浅出聊聊边界框回归:从IoU到Shape-IoU的演进与选择

边界框回归的进化论&#xff1a;从IoU到Shape-IoU的技术跃迁与实战选型 当我们在计算机视觉领域谈论目标检测时&#xff0c;边界框回归就像是一场永不停歇的进化竞赛。从最初的IoU开始&#xff0c;这场竞赛已经经历了GIoU、DIoU、CIoU、SIoU等多个技术迭代&#xff0c;而最新登…...

手把手教你用STM32F103C8T6驱动NRF24L01模块(附完整代码与避坑指南)

STM32F103C8T6与NRF24L01无线通信实战&#xff1a;从硬件对接到代码调试全解析 在物联网和智能硬件快速发展的今天&#xff0c;无线通信技术已成为嵌入式系统设计中不可或缺的一环。NRF24L01作为一款性价比极高的2.4GHz无线收发模块&#xff0c;配合STM32F103C8T6这类主流微控制…...

Gmail现可语音对话式检索邮件,亮相Google IO 2026

谷歌在向Gmail注入AI功能的道路上仍未停步。本周二&#xff0c;在年度开发者大会Google IO 2026上&#xff0c;这家科技巨头宣布对Gmail的"AI收件箱"功能进行升级扩展&#xff0c;正式引入对话式AI交互能力。这意味着用户今后可以直接向Gmail发问&#xff0c;而无需再…...