mybatis使用foreach标签实现union集合操作

最近遇到一个场景就是Java开发中,需要循环多个表名,然后用同样的查询操作分别查表,最终得到N个表中查询的结果集合。在查询内容不一致时Java中跨表查询常用的是遍历表名集合循环查库,比较耗费资源,效率较低。在查询内容格式一致的情况下,便可以用Java的数据库连接工具模拟mysql中union的操作,这里我用的数据库交互工具是mybatis。

首先介绍下union:

在mysql中被称为集合操作,操作类型分为两种:UNION DISTINCT 和  UNION ALL;其中UNION和UNION DISTINCT是一样的功能。UNION功能为合并多个查询的结果并去重,UNION ALL的功能为合并多个查询的结果不去重。

这里mybatis在实现union操作时,用到的是foreach 标签,foreach标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。最常用的地方就是对于一些 SQL 语句中含有 in 条件,或者批量处理数据需要迭代条件时,可以使用 foreach 。利用foreach这一迭代特性,也满足了union多个表的使用场景,整体思路框架代码如下:

实现层设置每一个union的查询sql的业务代码:

List<Map> queryCondition = new ArrayList<>();
//这里的namelIst代表存储联合查询表名的集合
for (Map nameMap: namelIst) {
            Map conditionMap = new HashMap();
            //查询内容
            String fields = "a.*,b.*";
            //拼接表名
            String tableName = "table_aaa a ," + nameMap.get("tableName") + "` b";
            //查询条件
            String joinsql = "a.nameId = b.id ";
            //将循环一次的查询条件,表名,内容放入一个集合中,当做union的一个查询部分
            conditionMap.put("fields", fields);
            conditionMap.put("tableName", tableName);
            conditionMap.put("joinsql", joinsql);
            //放入总的集合中作为传入mapper查询的条件
            queryCondition.add(conditionMap);
        }
        //执行查询
        List<Map> pages = this.baseMapper.getSelect(queryCondition);

传入的查询参数为一个list<map>集合。

/**
     * union查询示范
     * @param queryCondition
     * @return
     */
    List<Map> getSelect(@Param("queryCondition") List<Map> queryCondition);

xml文件的写法:

<select id="getSelect" resultType="java.util.Map">
        <foreach collection="queryCondition" item="condition" separator="union all">
            SELECT ${condition.fields}
            FROM ${condition.tableName}
            where ${condition.joinsql}
        </foreach>
    </select>

这里对foreach标签中的标签进行一下简单的总结:

foreach 标签有六个属性:item,index,collection,open, close,separator

属性 作用
item表示集合中每一个元素或子集合进行迭代循环时的别名
index    指定一个名字,表示在迭代过程中每次迭代到的位置
open    表示该语句以什么开始(如in 条件语句,以’('开始)
close    表示该语句以什么结束(如in 条件语句,以’)'结束。
separator    表示在每次进行迭代之间以什么符号作为分隔符(如in 条件语句,以‘,’作为分隔符)
collection    该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:
(1)如果传入的是单参数且参数类型是一个 List,collection 属性值为 list
(2)如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array
(3)如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

通常在使用foreach标签时候,都是用来当做批量查询或者更新,或者where后面的条件使用,大概这样:

<foreach collection="各种集合" item="循环体中的别名" index="index"  open="(" separator="," close=")">
    自定义的各种参数
</foreach>

这里的操作属于mybatis的一个灵活运用,算是一个处理思路,鉴于网上现有相关思路不多,个人完成了测试,可以当做一种解决办法,提高一下程序的执行效率,避免多次连库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/167551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

作为测试你连K8S都不懂,你还有脸说自己是测试?

kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替中间 8 个字符 “ubernete” 而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful)&#xff0c;Kuberne…

高版本Vivado和Linux 4.x内核移植Digilent Driver

移植环境 Vivado 2022.2Ubuntu 22.04petalinux 2022.2Linux内核4.14&#xff08;xilinx-linux-2018.3&#xff09;linux-digilent 主要问题 https://github.com/Digilent/linux-digilent 这些驱动支持Linux kernel release 4.x&#xff0c;然而和Vitis 2022.2 套件对应的内核…

【自我管理】To-do list已过时?学写Done List培养事业成功感

自我管理&#xff1a;已完成清单&#xff08;doneList&#xff09;培养事业成功感 待办事项清单常常让人感到压力山大&#xff0c;让人不想面对工作。但是&#xff0c;你知道吗&#xff1f;除了待办清单之外&#xff0c;还有一个叫做「已完成清单」的东西&#xff0c;它可能更符…

元宇宙外科手术vrar仿真实验室平台提高了培训效率和安全性

在科研与教育的领域中&#xff0c;实验室的作用举足轻重。然而&#xff0c;传统实验室受限于时间、空间、资源等因素&#xff0c;难以满足日益增长的科研与教育需求。在这一背景下&#xff0c;3D元宇宙仿真实验室应运而生&#xff0c;以其独特的优势&#xff0c;成为科研与教育…

【windows 清理redis 缓存】

redis-cli.exe flushall flushdb

大数据时代,怎样通过日志分析保护我们的数据!

在今天的大数据时代&#xff0c;大量的数据被生成和存储。对于IT行业来说&#xff0c;日志文件是宝贵的信息财富。 通过合理的日志分析和解读&#xff0c;可以帮助企业提高运维效率、加强安全防护、改进产品质量和优化用户体验&#xff0c;本文将深入探讨日志分析在IT中的重要性…

成都优优聚美团代运营:塑造卓越优势,引领电商新时代

在当今这个数字化时代&#xff0c;美团作为中国最大的本地生活服务平台之一&#xff0c;正在为消费者和商家搭建一个无缝链接的桥梁。而在成都&#xff0c;有一家名为优优聚美团代运营的公司&#xff0c;他们凭借着专业的技能和高效的服务&#xff0c;成为了美团平台上的佼佼者…

linux上交叉编译qt库

linux上交叉编译qt库 Qt程序从X86平台Linux移植到ARM平台Linux需要做什么 1.在ubuntu上使用qt的源码交叉编译出Qt库 2.将编译好的库拷贝到开发板上并设置相应的环境变量&#xff08;库路径啥的&#xff09; 前两步一劳永逸&#xff0c;做一次就行 3.X86上写好程序代码&…

企业微信将应用安装到工作台

在上篇中介绍了配置小程序应用及指令、数据回调获取第三方凭证&#xff1b; 本篇将介绍如何将应用安装到企业工作台。 添加测试企业 通过【应用管理】->【测试企业配置】添加测试企业。 通过企业微信扫描二维码添加测试企业。 注意&#xff1a;需要扫描的账号为管理员权限…

C#中.NET 7.0 Windows窗体应用通过EF访问已有数据库并实现追加、删除、修改、插入记录

目录 一、前言 1.Database.ExecuteSqlCommand 方法不被EF7.0支持 2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用 3.主键和标识列分离&#xff0c;成功实现插入与修改 二、新建本文涉及的项目 三、程序设计 1.Form1.cs源码 2.Form1.cs[设计] 四、生成和测试 1.原始表 …

【EI会议征稿】2024年电气技术与自动化工程国际学术会议 (ETAE 2024)

2024年电气技术与自动化工程国际学术会议 (ETAE 2024) 2024 International Conference on Electrical Technology and Automation Engineering 2024年电气技术与自动化工程国际学术会议 (ETAE 2024) 将于2024年3月8-10日在中国杭州召开。电气工程及其自动化和人们的日常生活…

Vue3的7种和Vue2的12种组件通信

Vue3 组件通信方式 props$emitexpose / ref$attrsv-modelprovide / injectVuex Vue3 通信使用写法 props 用 props 传数据给子组件有两种方法&#xff0c;如下 方法一&#xff0c;混合写法 // Parent.vue 传送 <child :msg1"msg1" :msg2"msg2">…

CLIP浅谈

CLIP论文地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP代码地址&#xff1a;https://github.com/openai/CLIP 简介 CLIP是OpenAI在2021年2月发表的一篇文章&#xff0c;它的主要贡献有以下2点&#xff1a; 1&#xff09;将图…

MCU内存基础知识

文章目录 一、存储器分类二、C语言内存分区内存区三、STM32启动文件分析四、应用分析 一、存储器分类 RAM&#xff08;Random Access Memory) &#xff1a;掉电之后就丢失数据&#xff0c;读写速度块 ROM (Read Only Memory) &#xff1a;掉电之后仍然可以保持数据 单片机的RA…

【Java SE】 详解java访问限定符

访问限定符 Java中主要通过类和访问权限来实现封装&#xff1a;类可以将数据以及封装数据的方法结合在一起&#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符&#xff1a; 实际只有三种访问限定…

纯CSS动态渐变文本特效

如图所示&#xff0c;这是一个炫酷的文本渐变效果&#xff0c;如同冰岛的极光一般。本次的文章让我们逐步分解代码&#xff0c;了解其实现原理。 基于以上动图效果可以分析以下是本次动效实现的主要几点&#xff1a; 文本中有多个颜色的动画每个颜色显示的半径不同&#xff0…

亚马逊化妆品护肤品等HRIPT/RIPT重复性斑贴测试如何办理?

一、哪类产品需要HRIPT / RIPT斑贴试验&#xff1a; HRIPT&#xff08;人体重复斑点试验&#xff09;和RIPT&#xff08;人体斑点试验&#xff09;是化妆品相关的测试&#xff0c;用于评估化妆品是否可能引起皮肤敏感和过敏反应。只有化妆品类产品需要进行HRIPT / RIPT斑贴试验…

五分钟搭建开源ERP:Odoo,并实现公网远程访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

普通函数VS箭头函数

首先给大家看一个代码 const jonas {year: 1995,calcAge: function () {console.log(this);console.log(2038 - this.year);},greet: () > console.log(Hey ${this.firstName}), };jonas.greet();这个会输出什么&#xff1f; 这个我们上篇文章中讲过&#xff0c;箭头函数…

(五)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (文档加载 Document Loading)

&#x1f604; 大语言模型(Large Language Model, LLM), 可以回答许多不同的问题。但是大语言模型的知识来源于其训练数据集&#xff0c;并没有用户的信息&#xff08;比如用户的个人数据&#xff0c;公司的自有数据&#xff09;&#xff0c;也没有最新发生时事的信息&#xff…