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

MyBatis (where、set、foreach)标签

where标签

 在上一节SQL 语句中加入了一个条件“1=1”,如果没有加入这个条件,那么可能就会变成下面这样一条错误的语句。

SELECT id,name,url,age,country FROM website AND name LIKE CONCAT('%',#{name},'%')

显然以上语句会出现 SQL 语法异常,但加入“1=1”这样的条件又非常奇怪,所以 MyBatis 提供了 where 标签。
where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件,语法如下

<where><if test="判断条件">AND/OR ...</if>
</where>

if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。

示例:

<select id="selectWebsite" resultType="net.cc.po.Website">select id,name,url from website<where><if test="name != null">AND name like #{name}</if><if test="url!= null">AND url like #{url}</if></where>
</select>

测试

public class Test {public static void main(String[] args) throws IOException {// 读取配置文件mybatis-config.xmlInputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);// 通过SqlSessionFactory创建SqlSessionSqlSession ss = ssf.openSession();Website site = new Website();site.setname("编程");List<Website> siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", site);for (Website ws : siteList) {System.out.println(ws);}}
}

set标签

在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.cc.mapper.WebsiteMapper"><select id="selectWebsite" resultType="net.cc.po.Website">SELECT * FROM website<where><if test="id!=null and id!=''">id=#{id}</if></where></select><!--使用set元素动态修改一个网站记录 --><update id="updateWebsite"parameterType="net.cc.po.Website">UPDATE website<set><if test="name!=null">name=#{name}</if><if test="url!=null">url=#{url}</if></set>WHERE id=#{id}</update>
</mapper>

测试

public class Test {public static void main(String[] args) throws IOException {InputStream config = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);SqlSession ss = ssf.openSession();Website site = new Website();site.setId(1);site.setUrl("www.cc.net");// 执行update语句前List<Website> siteList = ss.getMapper(WebsiteMapper.class).selectWebsite(site);for (Website st : siteList) {System.out.println(st);}int num = ss.getMapper(WebsiteMapper.class).updateWebsite(site);System.out.println("影响数据库行数" + num);// 执行update语句后List<Website> siteList2 = ss.getMapper(WebsiteMapper.class).selectWebsite(site);for (Website st : siteList2) {System.out.println(st);}ss.commit();ss.close();}
}

foreach标签

对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。 

Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。

<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">参数值
</foreach>

foreach 标签主要有以下属性,说明如下。

  • item:表示集合中每一个元素进行迭代时的别名。
  • index:指定一个名字,表示在迭代过程中每次迭代到的位置。
  • open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
  • separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
  • close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。


使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

  • 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
  • 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
  • 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

示例

<select id="selectWebsite"parameterType="net.cc.po.Website"resultType="net.biancheng.po.Website">SELECT id,name,url,age,countryFROM website WHERE age in<foreach item="age" index="index" collection="list" open="("separator="," close=")">#{age}</foreach>
</select>

 测试

public class Test {public static void main(String[] args) throws IOException {// 读取配置文件mybatis-config.xmlInputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);// 通过SqlSessionFactory创建SqlSessionSqlSession ss = ssf.openSession();List<Integer> ageList = new ArrayList<Integer>();ageList.add(10);ageList.add(12);List<Website> siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", ageList);for (Website ws : siteList) {System.out.println(ws);}}
}

在使用 foreach 标签时,应提前预估一下 collection 对象的长度。因为大量数据的 in 语句会影响性能,且还有一些数据库会限制执行的 SQL 语句长度。 

相关文章:

MyBatis (where、set、foreach)标签

where标签 在上一节SQL 语句中加入了一个条件“11”&#xff0c;如果没有加入这个条件&#xff0c;那么可能就会变成下面这样一条错误的语句。 SELECT id,name,url,age,country FROM website AND name LIKE CONCAT(%,#{name},%)显然以上语句会出现 SQL 语法异常&#xff0c;但…...

flutter开发之安装dart

1、在MacOS系统中打开终端&#xff0c;进入到官网Get the Dart SDK | Dart brew tap dart-lang/dartbrew install dart 注意&#xff1a;若显示没有brew&#xff0c;请先执行第二步骤&#xff0c;如下&#xff1a; 2、打开homebrew的官网Homebrew — The Missing Package Man…...

向量召回:深入评估离线体系,探索优质召回方法

向量召回:深入评估离线体系,探索优质召回方法 1.简介 近年来,基于向量进行召回的做法在搜索和推荐领域都得到了比较广泛的应用,并且在学术界发表的论文中,基于向量的 dense retrieve 的方法也在不少数据集上都战胜了 sparse retrieve,吸引了越来越多的关注。在内网的不…...

播放器缓存队列bug解决方案

背景 我在开发一个播放器的缓存队列时&#xff0c;遇到一个bug,导致包和帧无法被下一个模块读取 找了半天&#xff0c;原来是队列中的包和帧数据要进行内容的刷新暂存 包数据和帧数据不能直接放入队列 //入队&#xff0c;包进队列 int AVPacketQueue::Push(AVPacket *val,i…...

React拖拽实践

当涉及到前端开发中的用户体验时&#xff0c;拖拽功能是一个常见而重要的需求。在React中&#xff0c;实现拖拽功能可以通过多种方式完成&#xff0c;但通常需要深刻理解React的状态管理、事件处理和DOM操作。本文将探讨React中拖拽的实践&#xff0c;包括基本原理、拖拽库的使…...

Stable Diffusion绘图,lora选择

best quality, ultra high res, (photorealistic:1.4), 1girl, off-shoulder white shirt, black tight skirt, black choker, (faded ash gray hair:1), looking at viewer, closeup <lora:koreandolllikeness_v20:0.66> 最佳品质&#xff0c;超高分辨率&#xff0c;&am…...

kube-controller-manager和kube-scheduler不能正常启动

kube-controller-manager-k8s-worker01和kube-scheduler-k8s-worker01没有启动起来 原因&#xff1a; 解决&#xff1a;进入/etc/kubernetes/manifests 编辑 将镜像地址修改为 然后重启kubelet&#xff1a;systemctl restart kubelet.service...

Mac OS m1 下安装Gradle5.1

1. 下载、解压 1.1 下载地址 https://gradle.org 往下翻 选择 5.1 或者选择 任何 你想要的版本 ,点击 binary-only 即可下载 . 1.2 解压到指定目录 2. 配置环境变量 2.1 编辑环境文件 vi ~/.bash_profile #GRADLE相关配置 GRADLE_HOME/Users/zxj/Documents/devSoft/grad…...

JUC并发编程面试题(自用)

线程池 1 线程池的作用&#xff1a;提高线程的利用率&#xff0c;线程复用&#xff0c;频繁的创建和销毁线程非常浪费资源 线程池的七大参数&#xff1a; corePoolSize&#xff08;核心线程数&#xff09;&#xff1a;线程池中始终保持的活动线程数&#xff0c;即使它们处于空…...

Redis分布式会话

当探讨Redis分布式会话管理时&#xff0c;以下是更加详细的知识点&#xff1a; 1. 会话管理的挑战&#xff1a; 在分布式应用程序中&#xff0c;每个用户请求可能由不同的服务器处理。这导致了会话数据的分散性&#xff0c;需要一种方法来维护一致性的用户会话状态。 2. Redi…...

程序员大厂之鹅厂探秘

...

【Java 进阶篇】深入理解 JavaScript DOM Node 对象

在前端开发中&#xff0c;与HTML文档进行交互是一项基本任务。文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09;为开发者提供了一种以编程方式访问和操作HTML文档的方式。DOM的核心是节点&#xff08;Node&#xff09;对象&#xff0c;它代表了文…...

测试用例基础

测试用例的基本要素 测试环境, 操作步骤, 测试数据, 预期结果 测试用例的设计方法 基于需求的设计方法 需求文档 -> 梳理需求(掌握需求) -> 针对文档设计测试用例 只是针对需求进行大概的测试 具体的设计方法 等价类 等价类: 依据需求将输入&#xff08;特殊情况…...

“Flex弹性布局、轮播图mock遍历数据和首页布局解析与实践“

目录 引言1. Flex弹性布局介绍及使用什么是Flex弹性布局&#xff1f;Flex容器与Flex项目Flex属性详解 2. 轮播图mock遍历数据简述轮播图的作用和意义处理mock数据的重要性使用Mock模拟数据遍历 3. 首页布局总结 引言 在现代网页开发中&#xff0c;灵活性和响应式布局是至关重要…...

自动化办公篇之python

1、如果没有安装xlwings库&#xff0c;先在控制台pip install xlwings,然后点击运行&#xff0c;创建四个空excel表 。 import xlwings as xw app xw.App(visibleTrue,add_bookFalse) for dept in ["技术部","销售部","运营部","财务部&q…...

华为云云耀云服务器L实例评测|使用sysbench对云耀云服务器mysql的性能测试

目录 引言 1 在centos上安装mysql 1.1 在云服务器上安装 Docker 1.2 在 Docker 中运行 MySQL 容器 2 安装sysbench并进行性能测试 2.1 安装和配置 sysbench 2.2 运行 sysbench 性能测试 3 分析测试结果 3.1 运行结果 3.2 对运行结果进行翻译 3.3 性能分析 4 清理…...

【译】快速开始 Compose 跨平台项目

原文&#xff1a; Compose Multiplatform application 作者&#xff1a;JetBrains 注意 Compose Multiplatform 中的 iOS 部分目前处于 Alpha 状态。以后可能会有不兼容的更改&#xff0c;届时也许需要手动进行迁移。 你可以使用这个模板来开发同时支持桌面、安卓和 iOS 的跨平…...

高性能服务器之mysql数据库连接池设计与实现

高性能服务器之mysql数据库连接池设计与实现 链接&#xff1a;https://pan.baidu.com/s/1ISZ1Sy087GUeaekW3sV_oA?pwd0t9q 内存泄漏 链接&#xff1a;https://pan.baidu.com/s/1AWPnbuzVSpoP-CnEgJk5hg?pwdaieq 提取码&#xff1a;aieq 线程池 链接&#xff1a;https://pan…...

黑客技术(自学)——网络安全

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学&#xff1f;如何学&#xff1f; 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c…...

day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…...

20260518 Swift实验

Swift实验 控制节点新添加一块20GB磁盘 新添磁盘分成两个区&#xff0c;并格式化 分区一&#xff1a;挂载到obs1目录 分区二&#xff1a;挂载到obs2目录 [rootcontroller ~ 11:45:09]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.32.1). Changes will remain in memory onl…...

2026上海楼宇自控系统 / DDC 自控系统/能耗监测系统厂家知名厂家推荐 品牌选型指南!

根据 2026 年最新行业调研数据&#xff0c;楼宇自控市场已迎来深刻变革。在 “双碳” 战略深入推进与国产替代进程加速的双重驱动下&#xff0c;国产品牌已正式跻身行业第一梯队&#xff0c;与霍尼韦尔、江森自控、西门子等国际巨头同台竞技。在此行业格局重组的浪潮中&#xf…...

别再用理想模型了!手把手教你用Multisim仿真LM741反相放大电路(含电源、电容、失真全避坑)

从理想模型到实战避坑&#xff1a;Multisim仿真LM741反相放大电路全流程解析 1. 为什么你的仿真结果总与教科书不符&#xff1f; 许多电子工程初学者在课本上学完"虚短虚断"原理后&#xff0c;第一次用Multisim搭建LM741反相放大电路时都会遇到这样的困惑&#xff1a…...

Windows HEIC缩略图预览:告别iPhone照片在Windows的“盲盒“时代

Windows HEIC缩略图预览&#xff1a;告别iPhone照片在Windows的"盲盒"时代 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails …...

量子纠缠与动态电路:CHSH不等式在NISQ时代的应用

1. 量子纠缠与CHSH不等式&#xff1a;动态电路性能评估在量子计算领域&#xff0c;高质量的量子纠缠是实现量子优势的关键资源。就像建筑需要坚固的钢筋骨架一样&#xff0c;量子算法依赖于稳定的纠缠态作为其计算基础。然而在当前的NISQ&#xff08;Noisy Intermediate-Scale …...

通过Taotoken用量看板清晰掌握各模型调用成本与消耗趋势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken用量看板清晰掌握各模型调用成本与消耗趋势 在将大模型能力集成到实际项目时&#xff0c;除了关注功能实现&#xff0…...

不只是驱动问题!深挖华硕飞行堡垒风扇控制逻辑:ATK、热键服务与系统电源管理的三角关系

华硕飞行堡垒风扇控制逻辑深度解析&#xff1a;ATK、热键服务与系统电源管理的协同机制 当你的华硕飞行堡垒笔记本按下FNF5组合键却毫无反应时&#xff0c;多数教程会告诉你"重装驱动就能解决"。但作为技术爱好者&#xff0c;我们更关心的是&#xff1a;为什么驱动安…...

技术从业者的简历优化:如何写出让HR眼前一亮的简历

一、精准匹配&#xff1a;用关键词敲开面试大门在HR筛选简历的“黄金30秒”里&#xff0c;关键词匹配度是第一门槛。对于软件测试从业者来说&#xff0c;精准对接岗位JD&#xff08;职位描述&#xff09;中的核心关键词&#xff0c;是让简历脱颖而出的第一步。首先&#xff0c;…...

Gofile下载神器:5分钟快速上手的高效命令行工具

Gofile下载神器&#xff1a;5分钟快速上手的高效命令行工具 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 你是否经常需要从Gofile.io下载大量文件&#xff0c;却厌倦了手…...

graph-autofusion:CANN 的自动算子融合引擎

GE 的图优化 pass 里&#xff0c;算子融合是对推理性能影响最大的一个。但 GE 的融合规则是硬编码的——ConvBNReLU 写一条规则&#xff0c;BMMSoftmaxBMM 写一条规则。规则多了维护成本直线上升&#xff0c;总有覆盖不到的融合场景。 graph-autofusion 解决了这个问题。它是一…...