MyBatis操作数据库(动态SQL)
1 动态SQL
动态SQL是MyBatis的特征之一,能够完成不同条件下不同的SQL拼接
1.1 <if>标签
在注册用户的时候,可能会有这样一个问题,由于注册分为两种字段:必填字段和非必填字段,如果在添加用户的时候有不确定的字段传入,程序应该如何实现,此时就需要用到动态标签来判断了
例如添加的时候性别gender为非必填字段
@Mapper
public interface UserInfoXMLMapper {Integer insertByXML(UserInfo userInfo);
}
<insert id="insertByXML">insert into userinfo (username,password,age,<if test="gender != null">gender,</if>phone)values (#{username},#{password},#{age},<if test="gender != null">#{gender},</if>#{phone})
</insert>
@Slf4j
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid insertByXML() {UserInfo userInfo = new UserInfo();userInfo.setUsername("222");userInfo.setPassword("222");userInfo.setAge(10);userInfo.setGender(1);userInfo.setPhone("123456");Integer integer = userInfoXMLMapper.insertByXML(userInfo);log.info(integer.toString());}
}
首先观察填写gender的情况
@Slf4j
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid insertByXML() {UserInfo userInfo = new UserInfo();userInfo.setUsername("222");userInfo.setPassword("222");userInfo.setAge(10);//userInfo.setGender(1);userInfo.setPhone("123456");Integer integer = userInfoXMLMapper.insertByXML(userInfo);log.info(integer.toString());}
}
没有填写gender的情况,此时gender这一选项就没有被拼接
1.2 <trim>标签
之前的插入用户功能,只有一个gender字段是选择项,如果有多个字段,一般考虑使用标签结合标签,对多个字段都采用动态生成的方式
标签中有如下属性:
1)prefix:表示整个语句块,以prefix的值作为前缀
2)suffix:表示整个语句块,以suffix的值作为后缀
3)prefixOverrides:表示整个语句块要去除掉的前缀
4)suffixOverrides:表示整个语句块要去除掉的后缀
<insert id="insertByXML">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">username,</if><if test="password != null">password,</if><if test="age != null">age,</if><if test="gender != null">gender,</if><if test="phone != null">phone,</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">#{username},</if><if test="password != null">#{password},</if><if test="age != null">#{age},</if><if test="gender != null">#{gender},</if><if test="phone != null">#{phone},</if></trim>
</insert>
上述代码在整个语句前加'(',在整个语句后加')',去掉','的后缀
@Slf4j
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid insertByXML() {UserInfo userInfo = new UserInfo();userInfo.setUsername("222");userInfo.setPassword("222");userInfo.setAge(10);//userInfo.setGender(1);//userInfo.setPhone("123456");Integer integer = userInfoXMLMapper.insertByXML(userInfo);log.info(integer.toString());}
}
让性别和电话号码两项编程非必填项,再次观察结果
可以看出,左右括号都添加上了,并且去掉了最后面的','
在以上SQL动态解析时,会将第一个部分做如下处理:
1)基于prefix配置,开始部分加上 (
2)基于suffix配置,结尾部分加上 )
3)多个组织语句都以','结尾,在最后拼接好的字符串还会以','结尾的,会基于suffixOverrides配置去掉最后一个','
1.3 <where>标签
在以下场景,系统会根据我们筛选的条件,动态的组装where条件
List<UserInfo> selectByXML(UserInfo userInfo);
<select id="selectByXML" resultType="com.example.demo.UserInfo">select * from userinfo<where><if test="username != null">username = #{username}</if><if test="age != null">and age = #{age}</if><if test="gender != null">and gender = #{gender}</if></where>
</select>
@Test
void selectByXML() {UserInfo userInfo = new UserInfo();userInfo.setUsername("222");userInfo.setAge(10);userInfo.setGender(1);List<UserInfo> userInfoList = userInfoXMLMapper.selectByXML(userInfo);log.info(userInfoList.toString());
}
去掉username和gender再次观察
@Test
void selectByXML() {UserInfo userInfo = new UserInfo();//userInfo.setUsername("222");userInfo.setAge(10);//userInfo.setGender(1);List<UserInfo> userInfoList = userInfoXMLMapper.selectByXML(userInfo);log.info(userInfoList.toString());
}
可以看到,<where>自动帮我们去除了开头的and, 当查询的条件都为空时,<where>标签还会自动去掉where关键字
以上标签也可以使用 <trim prefix="where" prefixOverrides="and"> 替换,但是有些情况下,当子元素都没有内容时,where关键字也会保留
1.4 <set>标签
根据传入的用户对象属性来更新用户数据,可以使用标签指定动态内容
使用trim标签
Integer updateByXML(UserInfo userInfo);
<update id="updateByXML">update userinfo set<trim prefix="set" suffixOverrides=","><if test="username != null">username = #{username},</if><if test="age != null">age = #{age},</if><if test="gender != null">gender = #{gender},</if></trim>where id = 14
</update>
@Test
void updateByXML() {UserInfo userInfo = new UserInfo();userInfo.setUsername("456");userInfo.setAge(4);userInfo.setGender(2);Integer integer = userInfoXMLMapper.updateByXML(userInfo);log.info(integer.toString());
}
将username和gender去掉,再观察
使用<set>标签
@Test
void updateByXML() {UserInfo userInfo = new UserInfo();//userInfo.setUsername("456");userInfo.setAge(4);//userInfo.setGender(2);Integer integer = userInfoXMLMapper.updateByXML(userInfo);log.info(integer.toString());
}
<update id="updateByXML">update userinfo<set><if test="username != null">username = #{username},</if><if test="age != null">age = #{age},</if><if test="gender != null">gender = #{gender},</if></set>where id = 14
</update>
使用<set>标签可以再动态SQL语句中插入set关键字,并且会删除额外的逗号(用于update语句中)
1.5 <foreach>标签
对集合进行遍历时使用该标签,标签有如下属性:
1)collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象
2)item:遍历时的每⼀个对象
3)open:语句块开头的字符串
4)close:语句块结束的字符串
5)separator:每次遍历之间间隔的字符串
Integer deleteByIds(List<Integer> ids);
<delete id="deleteByIds">delete from userinfo where id in<foreach collection="ids" separator="," item="id" open="(" close=")">#{id}</foreach>
</delete>
@Test
void deleteByIds() {Integer integer = userInfoXMLMapper.deleteByIds(Arrays.asList(12, 13, 14, 15));log.info(integer.toString());
}
1.6 <include>标签
在XML映射文件中配置SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码
此时可以对重复的代码片段进行抽取,将其通过<sql>标签封装到一个SQL片段 ,然后通过<include>标签进行引用
1)<sql>:定义可重用的SQL片段
2)<include>:通过属性refid,指定包含的SQL片段
<sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time
</sql>
<select id="queryAllUser" resultMap="BaseMap">select<include refid="allColumn"></include>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)
1 动态SQL 动态SQL是MyBatis的特征之一,能够完成不同条件下不同的SQL拼接 1.1 <if>标签 在注册用户的时候,可能会有这样一个问题,由于注册分为两种字段:必填字段和非必填字段,如果在添加用户的时候有不确定的…...
python发票真伪查验开发文档、票据OCR、数电票查验
想象一下,只需一行行简洁的代码,复杂繁琐的发票审核工作瞬间变得井然有序。翔云发票查验开发文档详尽易懂,即便是Python新手也能迅速上手,搭建起自己的发票真伪查验系统。无论是纸质发票的扫描图像,还是电子发票的数据…...
Unity构建详解(12)——自动构建
【前言】 自动构建是指整个构建流程不需要人工操作,只需要输入启动构建指令即可获取构建结果。实现这样的自动构建需要满足以下条件: 支持命令行参数启动 我们不可能每次构建时都打开Unity去手动点击构建,必须支持通过命令行启动Unity自动执…...
中文编程降低了中文环境下编程入门的门槛
近年来,随着编程技术的普及和中文编程环境的日益成熟,越来越多的开发者开始使用中文进行编程。中文编程不仅提高了代码的可读性和理解性,而且在一定程度上降低了中文环境下编程的入门门槛。本文将详细探讨中文编程的优势,以及它如…...

通过内网穿透免费部署我们的springboot+vue项目 实现跟服务器一样的效果
前文讲到通过内网穿透能够实现远程访问个人电脑的静态资源。本文将讲解通过内网穿透实现远程访问本地的项目,实现跟部署到服务器一样的效果:前文链接:通过内网穿透实现远程访问个人电脑资源详细过程(免费)(…...

SMB攻击利用之-mimikatz上传/下载流量数据包逆向分析
SMB协议作为windows环境下最为常见的一种协议,在历史上出现过无数的通过SMB协议进行网络攻击利用的案例,包括针对SMB协议本身以及通过SMB协议实施网络攻击。 本文将介绍一种通过SMB协议的常见利用方式,即向远程主机传输mimikatz,作为我的专栏《SMB攻击流量数据包分析》中的…...
Mysql常见数据类型探索
Mysql常见数据类型探索 数值类型 MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。 关键字INT是INTEGER的同义词,关键字DEC是…...

2024 年第四届长三角高校数学建模竞赛赛题B题超详细解题思路+问题一二代码分享
2024年第四届长三角数学建模竞赛B题详细解题思路 赛道B:人工智能范式的物理化学家 长三角分享资料(问题一代码论文思路)链接(18点更新): 链接:https://pan.baidu.com/s/1lteKvIWNZ4v-Gd7oOcg…...

干货速学!1+X电子商务数据分析:电子商务数据分析的流程
电商数据采集API接口 生活中的数据分析 日常工作和生活中处处都有数据分析的存在,比如消费者在购买不同商品前,经常会对儿“性价比”进行简单分析,价格表现为固定的货币数字。性能则具体体现在商品质量、客户收务等客观因素和客户对该商品的需…...

618好物推荐大赏:2024年必囤好物一网打尽,购物攻略助你抢购无忧!
在618购物狂欢节来临之际,我为大家精心挑选了一系列好物,它们不仅品质卓越,更能在日常生活中为我们带来无限便利与乐趣。这里的每一款产品都经过我严格筛选,只为给你最优质的购物体验。让我们一起在这个618,发现生活中…...
【MySQL】基础操作(DDL,DML,DCL,DQL)
安装教程自行搜索,网上有很多 用户名设置为 root密码设置为 123456可以不这样设置,但要记好用户名密码,相关的代码也要自行更改 打开命令提示符程序(winR打开输入cmd回车) 输入:mysql -uroot -p 回车输入密码即可进入命令行环境…...
工厂自动化升级改造(3)-Modbus与MQTT的转换
什么是MQTT,Modbus,见下面文章 工厂自动化升级改造参考(01)--设备通信协议详解及选型-CSDN博客文章浏览阅读608次,点赞9次,收藏6次。>>特点:基于标准的以太网技术,使用TCP/IP协议栈,支持高速数据传输和局域网内的设备通信。>>>特点:跨平台的通信协议,…...

InnoDB 事务处理机制
文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…...

Thymeleaf
替代jsp 功能:服务器渲染(就是将服务器的数据展示在网页上) 1、MVC概念 model 模型 javaBean(User/Book/Order...) View视图 html 服务器的动态数据 Controller控制器 Servlet MVC是在表述层开发运用的一种设计理念。主张把封装数据…...
网络学习(一)|深入了解API网关:定义、功能和关键术语
文章目录 定义主要功能关键术语 定义 API 网关(API Gateway)是一个核心的服务架构组件,用于管理、路由和保护对后端服务的访问。它充当了系统内外的接口,负责接收来自客户端的请求,并将其路由到相应的后端服务&#x…...

基于yolov8+flask搭建一个web版本的网页模型预测系统
测试环境: anaconda3python3.8 torch1.9.0cu111 ultralytics8.2.2 首先我们将训练好的权重放在weights目录下面 并将名字改成yolov8n.pt,如果不想改可以在代码app.py都把路径改过来即可。然后我们打开 python app.py之后看到 我们点击选择文件支持图…...

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第8章 安装编译所需要的依赖包
RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...

牛客热题:合并二叉树
牛客热题:二叉树与双向链表> 📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题…...
conda 常用20个命令
conda常用20个命令 这些命令涵盖了Conda环境管理和包管理的常用功能,可帮助你有效地管理Python环境和软件包。 创建环境: conda create --name myenv这个命令用于创建一个名为myenv的新环境。你可以在--name后面指定环境的名称,并在其后加上…...

Git泄露(续)
接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区,没有使用 -m,默认用vim 来编辑和提交信息 输入要提交的内容,然后按ESC建回到命令…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...