动态SQL实现原理一-动态SQL的使用
在介绍MyBatis动态SQL实现原理之前,我们先来了解一下MyBatis动态SQL的使用。顾名思义,动态SQL指的是事先无法预知具体的条件,需要在运行时根据具体的情况动态地生成SQL语句。
假设我们有一个获取用户信息查询操作,具体的查询条件是不确定的,取决于Web前端表单提交的数据,可能根据用户的Id进行查询,也可能根据用户手机号或姓名进行查询,还有可能是这几个条件的组合。这个时候就需要使用MyBatis的动态SQL特性了。下面是使用MyBatis动态SQL进行条件查询的一个案例,代码如下:
<select id="getUserByEntity" resultType="com.blog4java.mybatis.example.entity.UserEntity">select<include refid="userAllField"/>from user<where><if test="id != null">AND id = #{id}</if><if test="name != null">AND name = #{name}</if><if test="phone != null">AND phone = #{phone}</if></where></select>
在上面的Mapper配置中,当我们不确定查询条件时,可以使用<where>和<if>标签,通过OGNL表达式判断参数内容是否为空,如果表达式结果为true,则MyBatis框架会自动拼接<if>标签内的SQL内容,否则会对<if>标签内的SQL片段进行忽略。
如上面配置中的<where>标签用于保证至少有一个查询条件时,才会在SQL语句中追加WHERE关键字,同时能够剔除WHERE关键字后相邻的OR和AND关键字。
除了<if>和<where>标签外,MyBatis动态SQL相关的标签还有下面几个。<choose|when|otherwise>:这几个标签需要组合使用,类似于Java中的switch语法,使用如下:
<select id="getUserInfo" resultType="com.blog4java.mybatis.example.entity.UserEntity">select<include refid="userAllField"/>from user where 1 = 1<choose><when test="id != null">AND id = #{id}</when><when test="name != null">AND name = #{name}</when><otherwise>AND phone is not null</otherwise></choose></select>
这组标签与<if>标签不同的是,所有的<when>标签和<otherwise>标签是互斥的,当任何一个<when>标签满足条件时,其他标签均视为条件不成立。
<foreach>:该标签用于对集合参数进行遍历,通常用于构建IN条件语句或者INSERT批量插入语句。例如,当我们需要根据一组手机号查询用户信息时,可以使用如下配置:
<select id="getUserByPhones" resultType="com.blog4java.mybatis.example.entity.UserEntity">select<include refid="userAllField"/>from userwhere phone in<foreach item="phone" index="index" collection="phones"open="(" separator="," close=")">#{phone}</foreach></select>
<trim|set>:这两个标签的作用和<where>标签的作用类似,用于WHERE子句中因为不同的条件成立时导致AND或OR关键字多余,或者SET子句中出现多余的逗号问题。
假如我们使用<if>标签进行动态SQL配置,具体配置内容如下:
<select id="getUserByEntity" resultType="com.blog4java.mybatis.example.entity.UserEntity">select<include refid="userAllField"/>from userwhere<if test="id != null">AND id = #{id}</if><if test="name != null">AND name = #{name}</if><if test="phone != null">AND phone = #{phone}</if></select>
当调用Mapper时传入的id参数和name参数都不为空时,生成的SQL是没问题的。但是当没有传入id参数或传入的id为空,而name参数不为空时,生成的SQL语句如下:
select * from user where AND name=?
显然这种情况下生成的SQL语句是存在语法问题的,此时除了使用<where>标签外,还可以使用<trim>标签来解决这个问题。<trim>标签的使用如下:
<select id="getUserByEntity" resultType="com.blog4java.mybatis.example.entity.UserEntity">select<include refid="userAllField"/>from user<trim><if test="id != null">AND id = #{id}</if><if test="name != null">AND name = #{name}</if><if test="phone != null">AND phone = #{phone}</if></trim></select>
<set>标签的作用和<trim>标签类似,用于避免SET子句中出现多余的逗号。这里就不做过多介绍了,可参考MyBatis官方文档。
相关文章:
动态SQL实现原理一-动态SQL的使用
在介绍MyBatis动态SQL实现原理之前,我们先来了解一下MyBatis动态SQL的使用。顾名思义,动态SQL指的是事先无法预知具体的条件,需要在运行时根据具体的情况动态地生成SQL语句。 假设我们有一个获取用户信息查询操作,具体的查询条件…...
MyBatis动态sql标签帮你轻松搞定sql拼接
动态sql介绍 由于在开发过程不同的业务中会用到不同的操作条件,如果每个业务都拼接不同sql语句的话会是一个庞大的工作量;此时动态sql就能解决这个问题,可以针对不确定的操作条件动态拼接sql语句,根据提交的条件来完成业务sql的执…...
Java课题笔记~ 使用 Spring 的事务注解管理事务(掌握)
通过Transactional 注解方式,可将事务织入到相应 public 方法中,实现事务管理。 Transactional 的所有可选属性如下所示: propagation:用于设置事务传播属性。该属性类型为 Propagation 枚举, 默认值为 Propagation.R…...
UML—浅谈常用九种图
目录 概述: 1.用例图 2.静态图 3.行为图: 4.交互图: 5.实现图: 概述: UML的视图是由九种视图组成的,分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…...
算法与数据结构-跳表
文章目录 什么是跳表跳表的时间复杂度跳表的空间复杂度如何高效的插入和删除跳表索引动态更新代码示例 什么是跳表 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率…...
微信小程序nodejs+vue+uniapp校运会高校运动会报名管理系统
3.1小程序端 小程序登录页面,用户也可以在此页面进行注册并且登录等。 登录成功后可以在我的个人中心查看自己的个人信息或者修改信息等 在广播信息中我们可以查看校运会发布的一些信息情况。 在首页我们可以看到校运会具体有什么项目运动。 在查看具体有什么活动我…...
varint原理 - 负数的编码和解码
前一篇博客 varint原理 - 正数的编码和解码_YZF_Kevin的博客-CSDN博客我们讲了varint的实现原理,举例也分析对于正数的编码,解码过程 本篇博客,我们开始举例分析负数的编码和解码,因为负数有原码,反码,补码…...
大学生口才培训需求分析
标题:大学生口才培训需求分析 摘要: 本论文旨在分析大学生口才培训的需求,通过对大学生口才培训的重要性、现状和挑战进行研究,并结合相关理论和实践经验,提出相应的培训需求和解决方案。通过本论文的研究,…...
C++:合并集合(并查集)
合并集合 一共有n个数,编号是1~n,最开始每个数各自在一个集合中。 现在要进行m个操作,操作共有2种: 1.“M a b”,将编号为a和b的两个数的所在的集合合并,如果两个数已经在同一个集合中则忽略这个操作 2.“…...
【LeetCode】数据结构题解(10)[有效的括号]
有效的括号 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 😘😘😘😘😘😘😘😘😘😘😘…...
5G用户逼近7亿,5G发展迈入下半场!
尽管普遍认为5G投资高峰期正在过去,但是从2023年上半年的情况来看,我国5G建设仍在衔枚疾走。 近日举行2023年上半年工业和信息化发展情况新闻发布会上,工信部人士透露,截至今年6月底,我国5G基站累计达到293.7万个&…...
分布式问题
1. 分布式系统CAP原理 CAP原理:指在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitontolerance(分区容忍性),三者不可得兼。 一致性(C…...
教雅川学缠论06-中枢
本系列文章之前讲的内容都只有上升和下降两类趋势,并没有提及盘整,在缠论中,中枢这个新词汇用来定义盘整,中枢: 1.至少由5条线段(或笔)组成 2.中枢是有方向的,中枢左右两侧外面的线&…...
如何调教让chatgpt读取自己的数据文件(保姆级图文教程)
提示:如何调教让chatgpt读取自己的数据文件(保姆级图文教程) 文章目录 前言一、如何投喂自己的数据?二、调教步骤总结 前言 chatgpt提示不能读取我们提供的数据文件,我们应该对它进行调教。 一、如何投喂自己的数据? 让chatgpt读…...
React Native Camera的使用
介绍 React Native Camera是一个用于在React Native应用中实现相机功能的库。它允许你访问设备的摄像头,并捕获照片和视频。 使用 安装 npm install react-native-camera --save 安装完成后,你需要链接React Native Camera库到你的项目中。可以使用以…...
【Matlab】Elman神经网络遗传算法(Elman-GA)函数极值寻优——非线性函数求极值
往期博客👉 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 本篇博客将主要介绍Elman神…...
@ControllerAdvice注解使用及原理探究 | 京东物流技术团队
最近在新项目的开发过程中,遇到了个问题,需要将一些异常的业务流程返回给前端,需要提供给前端不同的响应码,前端再在次基础上做提示语言的国际化适配。这些异常流程涉及业务层和控制层的各个地方,如果每个地方都写一些…...
Error: Design has unresolved cell reference
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 所有的unresolved cell reference问题都是cell信息没读到引起的,在dc/pt里就是db没读到,在ICC2里就是ndm没读。 ICC2中午饭这个问题可以report_design_…...
uni-app 封装api请求
前端封装api请求 前端封装 API 请求可以提高代码的可维护性和重用性,同时使得 API 调用更加简洁和易用。 下面是一种常见的前端封装 API 请求的方式: 创建一个 API 封装模块或类:可以使用 JavaScript 或 TypeScript 创建一个独立的模块或类来…...
SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心
目录 1 微服务1.1 微服务的演变1.2 微服务1.3 SpringCloud1.4 小结 2 服务拆分及远程调用2.1 服务拆分2.2 服务拆分案例2.3 实现远程调用2.4 提供者与消费者 3 Eureka注册中心3.1 Eureka的结构和作用3.2 搭建eureka-server3.3 服务注册3.4 服务发现 4 Ribbon负载均衡4.1 负载均…...
大模型实战:AgentScope ReActAgent 多智能体框架实战指南,小白程序员必备收藏!
本文介绍了如何利用 AgentScope 框架及其新版本 Spring AI Alibaba 来构建基于大模型的多智能体应用。文章首先强调了从单智能体优先原则出发,然后详细阐述了 AgentScope 支持的多智能体模式,包括 Pipeline、Routing、Skills、Subagents、Supervisor、Ha…...
【软考高级架构】论文预测——论基于ATAM的架构评估方法
论基于ATAM的架构评估方法 摘要 软件架构评估是保障系统质量属性满足业务目标的关键环节。架构权衡分析方法(Architecture Trade-off Analysis Method,ATAM)作为一种系统化的架构评估方法,通过场景捕获、质量属性分析、敏感点与权衡点识别、风险与非风险决策分类等结构化…...
PHP Intelephense项目结构解析:多工作区、虚拟工作区与远程开发
PHP Intelephense项目结构解析:多工作区、虚拟工作区与远程开发 【免费下载链接】vscode-intelephense PHP intellisense for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-intelephense PHP Intelephense是一款为Visual Studio …...
C++的内存管理详细解释
一、C/C内存分布栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分…...
摆脱论文困扰!盘点2026年普遍认可的的降AI率软件
轻松降低论文AI率在2026年已不再是天方夜谭。最新实测数据显示,2026年降AI率软件正以惊人的效率和精准度颠覆传统方法,覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景,真正实现高效降AI率,帮你告别论文焦虑。…...
HS2-HF_Patch终极增强补丁:5分钟解锁Honey Select 2完整创作生态
HS2-HF_Patch终极增强补丁:5分钟解锁Honey Select 2完整创作生态 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的语言障碍和…...
STM32F429实时IIR滤波避坑指南:arm_biquad_cascade_df1_f32的群延迟与状态缓存管理
STM32F429实时IIR滤波工程实践:群延迟补偿与状态缓存优化策略 在嵌入式信号处理领域,实时滤波是许多应用的核心需求。当我们在STM32F429平台上使用arm_biquad_cascade_df1_f32函数实现IIR滤波时,会遇到两个关键挑战:群延迟对实时性…...
AI 不锈钢保温杯智能功率 MOSFET 完整选型方案
2026年随着 AI 技术在智能保温杯领域的深度渗透(如精准温控、语音交互、健康监测、无线充电管理),对功率 MOSFET 提出更高要求:高集成度、低功耗、小封装、高可靠性。微碧半导体(VBsemi)基于 SGT 及 Trench…...
OmenSuperHub:惠普游戏本性能优化的终极免费解决方案
OmenSuperHub:惠普游戏本性能优化的终极免费解决方案 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普OMEN游戏本设…...
Real-ESRGAN终极指南:5分钟掌握AI图像超分辨率技术,让模糊照片秒变高清
Real-ESRGAN终极指南:5分钟掌握AI图像超分辨率技术,让模糊照片秒变高清 【免费下载链接】Real-ESRGAN Real-ESRGAN aims at developing Practical Algorithms for General Image/Video Restoration. 项目地址: https://gitcode.com/gh_mirrors/re/Real…...
