MyBatis操作数据库进阶——动态SQL
动态 SQL 是根据程序运行时的条件灵活生成不同 SQL 语句的技术。它的核心目的是在不修改代码 的前提下,通过条件判断、循环等逻辑,动态拼接 SQL 片段,解决传统 SQL 语句死板、难以应对复杂业务场景的问题。
一、<if> 标签
先来观察下面的图片:
我们在成功注册一个新账号时,可能会让我们填写如上图的用户信息表,但是我们可以选择跳过,也可以选择填写,若选择填写,我们可以选择填写全部信息,也可以选择填写部分信息(入只填写名字和出生日期),将图片提交给后端后,后端需要使用insert语句将这些个人信息保存到数据库,但是并不是所有人都将表中信息完整填写,难道后端需要写多条insert语句吗?显然这非常麻烦,因此我们可以使用动态SQL的标签,如 <if> 来解决这个问题:
一、接口定义
Integer insertUserByCondition(UserInfo userInfo);
二、Mapper.xml实现
更改后:
<insert id="insertUserByCondition">insert into user_info (username,password,age,<if test="gender!=null">gender,</if>phone) values (#{username},#{password},#{age},<if test="gender!=null">#{gender},</if>#{Phone});</insert>
测试代码,以及测试结果:
<1>gender为空
<2>gender不为空
在上面的,似乎只需要 if 标签就可以完成所有的动态查询操作,但是为什么后面还有 trim 等标签,这是因为只使用 if 标签是有可能出错的,如:
代码测试:
(1)插入phone字段:
执行成功
(2)不插入phone字段:
可以看到,程序报错,接下来查看MyBatis日志,
可以看到,由于没有填入最后一个字段,导致SQL语句多了一个逗号
为了避免 if 标签可能带来的SQL语法错误问题,可以使用 trim 标签解决
二、<trim> 标签
在前面的 if 标签报错的例子中,虽然通过将逗号放在 if 标签内来避免出错,但如果有多个可选字段甚至全部字段都可选,就无法避免了,因此,如果是有多个可选标签,一般使用标签结合标签的方式
<trim> 标签有4个属性,分别为:
• prefix:表示整个语句块,以prefix的值作为前缀
• suffix:表示整个语句块,以suffix的值作为后缀
• prefixOverrides:表示整个语句块要去除的前缀
• suffixOverrides:表示整个语句块要去除的后缀
接下来将上面出错的例子再加上一层 trim 标签:
<insert id="insertUser3">insert into user_info<trim prefix="(" suffix=")" suffixOverrides=",">username,password,age,gender,<if test="phone!=null">phone</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=",">#{username},#{password},#{age},#{gender},<if test="phone!=null">#{phone}</if></trim></insert>再次测试代码:
可以看到经过修改,成功插入数据
三、<where> 标签
前面我们使用的动态插入语句,主要是用在存储用户信息等方面的(如注册时可能要求填写个人爱好,性别的数据),而这里的动态查询语句,主要是对某方面的数据进行过滤筛查(如下图中当我们选择机身内存为1TB或其它时,就会触发动态查询,只显示内存为1TB的手机)
那么,如何使用 <where> 标签进行动态查询?
我们将下面的SQL改造为动态SQL:
SELECT* FROMuserinfo WHEREage = 18 AND gender = 1 AND delete_flag =0改造后代码:
<select id="queryByCondition" resultType="spring.mybatis.demo.model.UserInfo">select * from user_info<where><if test="age!=null">age = #{age}</if><if test="gender!=null">and gender = #{gender}</if><if test="deleteFlag!=null">and delete_flag = #{deleteFlag}</if></where></select>
代码测试:
代码执行成功
四、<set> 标签
同样,在更新数据时有选择性的更新(如在只将性别更改为男,而其它信息如兴趣爱好等不做改变),下面学习 <set> 标签的使用方法:
<update id="updateUserByCondition">update user_info<set><if test="username!=null">username = #{username},</if><if test="age!=null">age = #{age},</if><if test="deleteFlag!=null">delete_flag = #{deleteFlag}</if></set>where id = #{id}</update>代码测试:
代码执行成功
五、<foreach> 标签
当对一组数据进行批量操作时(如批量删除、批量更新),就可以使用 <foreach> 标签,它有几个核心属性:
• collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
• item:遍历时的每⼀个对象
• open:语句块开头的字符串
• close:语句块结束的字符串
• separator:每次遍历之间间隔的字符串
如根据id批量删除:
<delete id="deleteByIds">delete from user_infoin<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></delete>
六、<include> 标签
在xml文件中的SQL语句中,可能存在很多有相同SQL语句片段,<include>标签可以将这项重复的片段提取出来,减少冗余。

接下来学习 <include> 标签的使用:
一、提取重复SQL片段,放入 <sql> 标签中,并设置 id 属性(用于后面引用),如:
<sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time </sql>二、被提取SQL片段的位置加入<include>标签,并用 refid 属性指定某个<sql>,引用其中的SQL片段,如:
<select id="queryAllUser" resultMap="BaseMap">select<include refid="allColumn"></include>//将 <sql> 定义的片段插入到当前 SQL 语句中,实现逻辑复用from userinfo </select><select id="queryById" resultType="com.example.demo.model.UserInfo">select<include refid="allColumn"></include>from userinfo where id= #{id} </select>
相关文章:
MyBatis操作数据库进阶——动态SQL
动态 SQL 是根据程序运行时的条件灵活生成不同 SQL 语句的技术。它的核心目的是在不修改代码 的前提下,通过条件判断、循环等逻辑,动态拼接 SQL 片段,解决传统 SQL 语句死板、难以应对复杂业务场景的问题。 一、<if> 标签 先来观…...
使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)
引言:一套快速实现 Llama3 中文微调的教程 主要参考:胖虎遛二狗的 B 站教学视频《【大模型微调】使用Llama Factory实现中文llama3微调》 ✅ 笔者简介:Wang Linyong,西工大,2023级,计算机技术 研究方向&am…...
LabVIEW发电平台数据采集系统
本文详细介绍了基于LabVIEW的摇臂式波浪发电平台数据采集系统的设计与实现。通过整合LabVIEW软件与多种传感器技术,本系统能够有效提升数据采集的准确性和效率,为波浪能的利用和发电设备的优化提供科学依据。 项目背景 随着全球能源需求增长和环境保…...
气象可视化卫星云图的方式:方法与架构详解
气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…...
abaqus 二次开发 No module named ‘abaqusConstants
在 Python 中遇到 “No module named ‘abaqusConstants’” 错误通常意味着 Python 无法找到名为 abaqusConstants 的模块。这可能是由以下几个原因造成的: 拼写错误:首先确认模块名是否正确。通常在 Abaqus 的 Python 环境中,正确的模块名…...
【蓝桥杯】每日练习 Day7
目录 前言 领导者 分析 代码 空调 分析 代码 面包店 分析 代码 前言 今天是第一部分的最后一天(主打记忆恢复术和锻炼思维),从明天开始主播会逐步更新从位运算到dp问题的常见题型。 领导者(分类讨论) 分析 …...
贪心算法(11)(java)加油站
题目:在一条环路上有n个加油站,其中第i个加油站有汽油 gas[i]升.。 你有一辆油箱容量无限的的汽车,从第i个加油站开往第i1个加油站需要消耗汽油 cost[i]升。你从其中的一个加油站出发,开始时油箱为空。 给定…...
Python(4)Python函数编程性能优化全指南:从基础语法到并发调优
目录 一、Lambda性能优化原理1.1 内联执行优势1.2 并行计算加速 二、工程级优化策略2.1 内存管理机制2.2 类型提示增强 三、生产环境最佳实践3.1 代码可读性平衡3.2 异常处理模式 四、性能调优案例4.1 排序算法优化4.2 数据管道加速 五、未来演进方向5.1 JIT编译优化5.2 类型系…...
本地部署Stable Diffusion生成爆火的AI图片
直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…...
qiankun微前端的使用
qiankun使用时注意以下几个点 1,子应用项目框架(react,vue)使用的打包格式需要为 umd 格式 2,子应用项目最好配置不受同源策略(跨域)的影响 3,子应用最好使用的路由模式是 histor…...
从国家能源到浙江交通投资,全息技术在能源交通领域的创新应用
一、3D全息技术行业应用参数及设计制作要求 全息投影 全息投影技术通过激光器、全息片等设备,将物体的三维信息记录下来,并在特定条件下再现。应用参数包括投影距离、投影面积、投影亮度等。设计制作要求:高清晰度、高亮度、低噪音、稳定性好…...
PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一
PageHiOffice网页组件作为最新一代的WebOffice文档控件,这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件,是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年,不管是功能性还是稳定性都已经有了长…...
【人工智能】机器学习中的评价指标
机器学习中的评价指标 在机器学习中,评估指标(Evaluation Metrics)是衡量模型性能的工具。选择合适的评估指标能够帮助我们更好地理解模型的效果以及它在实际应用中的表现。 一般来说,评估指标主要分为三大类:分类、…...
本地安装deepseek大模型,并使用 python 调用
首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步,就可以 点击搜索 Models : https://ollama.com/search然后点击下载: 选择后复制: ollama run deepseek-r1:32b例如: 让它安装完成后࿱…...
Android:蓝牙设置配套设备配对
一、概述 在搭载 Android 8.0(API 级别 26)及更高版本的设备上,配套设备配对会代表您的应用对附近的设备执行蓝牙或 Wi-Fi 扫描,而不需要 ACCESS_FINE_LOCATION 权限。这有助于最大限度地保护用户隐私。使用此方法执行配套设备&am…...
AI知识补全(二):提示工程(Prompting)是什么?
名人说:人生如逆旅,我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(一):tokens是什么? 目录 一、什么是提示工程?二、为什么提示工程如此重要?三、核心提示工程技术1. 少样本学习(Few-Sho…...
Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分
## 三、闭包作用域的存在原因及适用场景 ### 3.1 闭包作用域存在的原因 #### 3.1.1 数据封装与隐藏 闭包可以把数据封装在外部函数的作用域中,只有内部函数能够访问这些数据,这有助于实现数据的隐藏和保护。 python def counter(): count 0 def incre…...
zookeeper使用
下载 官网 链接 1. 2. 然后解压: 启动 先复制一份这个文件, 双击启动 默认占用8080,和Tomcat冲突, 解决方法:链接 然后重启...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Java面试黄金宝典11
1. 什么是 JMM 内存模型 定义 JMM(Java Memory Model)即 Java 内存模型,它并非真实的物理内存结构,而是一种抽象的概念。其主要作用是规范 Java 虚拟机与计算机主内存(Main Memory)之间的交互方式&#x…...
使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug
最近在给客户开发一个CRM系统,其中用到了BOOTSTRAP的模态框。版本是3。由于是刚开始用该框架。所以在正式部署到项目中前,需要测试一下,找到框架中的如下部分。需要说明的是。我用的asp.net mvc框架开发。测试也是在asp.net mvc环境下。 复制…...
【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Networking】系列。 前言 最近公司的安全部门在审计云环境安全性时经常提到service endpoint(SE)和priavate endpoint(PE)的术语,为此做了一些研究储备。 云…...
Excel第41套全国人口普查
2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...
VUE2导出el-table数据为excel并且按字段分多个sheet
首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…...
PDF文件转Markdown,基于开源项目marker
首先我们来问下deepseek 为啥要选marker呢 基于深度学习,一看就逼格拉满。搞科研必备,效果应该不会太差。 看下官网 https://github.com/VikParuchuri/marker 一看头像是个印度佬,自吹——又快又好。那就试试吧。 安装步骤 安装…...
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析 引言1. 什么是 Web Workers?Web Workers 的特点: 2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1:创建 Worker 文件步骤 2:在主线程中调用 Worker 3…...
【蓝桥杯速成】| 9.回溯升级
题目一:组合综合 问题描述 39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返…...
【uni-app】引用公共组件
目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…...
API-Arrays
Arrays 操作数组的工具类 1.tostring import java.util.Arrays;public class demo1 {public static void main(String[] args) {Integer[] arr {2, 3, 1, 5, 6, 7, 8, 4, 9};System.out.println(Arrays.toString(arr));//[2, 3, 1, 5, 6, 7, 8, 4, 9]} } 2.binarySearch 二…...
尝试在软考62天前开始成为软件设计师-信息系统安全
安全属性 保密性:最小授权原则(能干活的最小权限)、防暴露(隐藏)、信息加密、物理保密完整性(防篡改):安全协议、校验码、密码校验、数字签名、公证 可用性:综合保障( IP过滤、业务流控制、路由选择控制、审计跟踪)不可抵赖性:数字签名 对称加密 DES :替换移位 3重DESAESR…...















代码测试:
代码执行成功
