ibatis iterator list 参数 查询

list参数查询,据说ibatis官方是有例子,我没有看到,基本上就是通过iterator标签可以循环,拼出sql。 例如批量删除:

 

<select id="queryBatch" resultMap="resultMap" parameterClass="list">
        select * from tableName where
        ID in
        <iterate open="(" close=")" conjunction=",">
            #[]#
        </iterate>
    </select>
 

注意parameterClass 是java.utils.list 而iterate里面的属性直接写成#[]#,而这个时候查询方法的参数则是:list<Long>

 

如果还不明白为什么这么写,看下面的写法。

 

<select id="getProducts" parameterClass="Product"
        resultClass="Product">
  SELECT * FROM Products
  <dynamic prepend="WHERE productType IN ">
    <iterate property="productTypes"
             open="(" close=")"
             conjunction=",">
      productType=#productType#
    </iterate>
  </dynamic>
</select>

 

这里的parameterClass是自己定义的一个对象,而对象里面是有一个list的productTypes的属性。而#productType#则是productType对象的一个属性(小声告诉你,这是我猜的,并且没有求证过~~~)

 

可以参考文章:iBatis: Support for Array or List Parameter with SQL IN Keyword

 

然而上面一种情况可能不会是我们常用的一种方式,我们可能参数直接就是list,在iterate中就无需写property属性了,就像第一个例子中,但是由于我们list中不是单一的long或者string,而是一个封装的对象,需要取里面具体的某个属性,

我在第一种方式的基础上,试验了很多种写法,如:#list[].id# , #[].id# , #id# , #id[]# 。很不幸都失败了。

于是我还是采用了和加property的方式完成。而这个时候注意parameterClass=“map”,其实是将list放到了map中传进来的,并且map的key就是personList。

 

<delete id="deletePerson" parameterClass="map">

     delete from 表名 where      sex=#sex#      
        <iterate prepend="and" property="personList" open="("
          close=")" conjunction="or">
          age=$personList[].age$
        </iterate>
      
  </delete>

 具体细节,可以参考文章:ibatis中iterate的用法 iterator iter

而网上有一些文章说去掉iterator中的propetry的方式,由于没有写的很明确不知道是与这个类似,还是与第一个例子类似。想知道细节的可以看这个文章:  ibatis中iterate问题的解决

 

当然我上面用到了对象,肯定不会是只查一个属性就ok的,肯定是要多个属性动态组合查询,否则我就直接用第一个例子好了,费下面这些事干嘛。而在组合动态查询的时候,也发现了一些问题:

 

select * from tableName where disabled = 0
<dynamic prepend="AND">
            <iterate open="(" close=")" property="list" conjunction=" OR ">
                (
                <isNotNull property="list[].id">
                    ID = #list[].id# AND
                </isNotNull>
                <isNotNull property="list[].channel">
                    CHANNEL = #list[].channel# AND
                </isNotNull>
                <isNotEmpty property="list[].reservationId">
                    RESERVATION_ID = #list[].reservationId# AND
                </isNotEmpty>
                1=1
                )
            </iterate>
        </dynamic>

 

上面的的第一个问题是:为啥 and要自己加,而不是在isNotNull中加prepend=“AND” 原因就是在iterator中,发现只有第一次循环:<isNotNull prepend="and" property="list[].id"> 中不会自动加and,第而次会自动加的。

 

再就是 $personList[].age$ 与 #list[].reservationId# 其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。

 

感觉写的有点乱,但是具体遇到这个问题的时候看看,肯定是可以明白的。

MyBatis流式查询实战:解决大数据查询OOM问题 最近在做一个数据报表导出的功能,业务方要求能导出近一年的订单明细。开发时图省事,直接写了个 SELECT * FROM orders WHERE create_time BETWEEN ... ,然后在 Service 层用 List<Order> 接收。本地测试时数据量小,一切正常。结果上线后,运营在后台一点“导出”,服务内存直接飙到 90%+,紧接着就是一连串的 OutOfMemoryError: Java heap space 告警,服务差点挂掉。 事后复盘,一张大表几百万条记录,用 Li 阅读详情

相关推荐

MyBatis流式查询实战:解决大数据查询内存溢出问题

你有没有遇到过这样的场景:一个看似简单的查询,只是数据量稍微大了一点,比如几十万条记录,程序运行几分钟后突然卡死,然后控制台无情地抛出一个 OutOfMemoryError ?你检查代码,发现就是一行普通的 List<User> users = userMapper.selectList(queryWrapper); ,怎么就“一行代码挤爆内存”了呢? 这绝不是危言耸听。在数据驱动的今天,处理海量数据导出、大数据分析、实时日志处理等场景时,传统的“一次性加载全部结果到内存”的查询模式,就像用脸盆

weixin_30325487的博客 412

Mybatis <foreach >与 ibatis<iterate> ,list作为集合条件查询

mybatis 用法 <select id="getUserList" parameterType="java.util.List" resultType="java.util.Map"> select * from user where name IN <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </sele

javahhhhhh的博客 938

MyBatis流式查询实战:解决大数据查询OOM,实现高效内存管理

在Java企业级应用开发中,数据库查询性能优化是核心技术挑战之一。当查询返回海量数据时,传统的一次性加载方式极易引发JVM内存溢出(OOM),导致服务崩溃。其原理在于JDBC默认会将整个结果集加载至应用内存。为解决此问题,MyBatis框架提供了流式查询(Streaming Query)技术,它通过控制JDBC的fetchSize和结果集类型,实现数据分批传输与处理,将内存占用从与数据量线性相关降至常数级别。这项技术的核心价值在于保障系统稳定性,避免因大数据量查询导致的服务中断。它尤其适用于数据导出、ETL

weixin_30883311的博客 404

ibatis实现Iterate的使用

  &lt;iterate         property="" /*可选,              从传入的参数集合中使用属性名去获取值,            这个必须是一个List类型,            否则会出现OutofRangeException,            通常是参数使用java.util.Map时才使用,      ...

hongguanzh的专栏 893

MyBatis流式查询实战:百万数据导出如何避免OOM内存溢出

最近在排查一个线上服务的内存溢出问题时,发现一个典型的“性能陷阱”:一个看似简单的全量数据导出功能,在数据量增长到百万级别后,服务器内存直接被“打满”,导致服务频繁重启。问题的根源,正是开发者在处理大数据量查询时,习惯性地使用了 List<T> 来接收数据库结果集。本文将深入剖析这种做法的风险,并手把手教你使用 MyBatis 的 流式查询(Streaming Query) 来优雅地解决这个问题,让你告别 OOM(OutOfMemoryError)的困扰。 本文适合所有使用 MyBatis 进行

weixin_30859423的博客 456

MyBatis流式查询实战:千万级数据导出与性能优化指南

在处理海量数据时,传统的一次性加载到内存的查询方式极易引发内存溢出(OOM)和性能瓶颈。其核心原理在于JDBC默认会将整个结果集传输到应用端,当数据量达到百万甚至千万级时,对JVM堆内存和数据库连接造成巨大压力。流式查询技术通过改变数据获取范式,实现了类似迭代器的逐条或分批数据拉取,从而将内存占用保持在极低水平,其技术价值在于以可控的时间开销换取确定性的空间安全。这一特性使其在数据导出、ETL同步、实时报表生成等需要处理全量结果集但无需一次性展示的场景中成为必选方案。本文聚焦于**MyBatis流式查询**

weixin_30920597的博客 485

在ibatis中Iterate属性用法

Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。Iterate的属性:prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)property - 类型为java.util.List的用于遍历的元素(必选)open - 整个遍历内容体开始的字符串,用于定义括号(可选)close -整个遍历内容体结束的字符串,用于定义括号(可选)conjunction

dinglinhu的专栏 6030

MyBatis流式查询实战:解决千万级数据导出的内存溢出问题

在数据库应用开发中,处理大规模数据集是常见的挑战。传统的一次性加载查询方式,当面对百万甚至千万级数据时,极易引发应用服务器的内存溢出(OOM)问题。其核心原理在于JDBC默认会将整个ResultSet加载到客户端内存,而流式查询通过设置特定的fetchSize和游标类型,实现了数据的逐行或分批懒加载,从而将内存消耗降至最低。这项技术对于构建稳定、可扩展的数据处理系统具有重要价值,尤其适用于数据中台、实时报表生成、ETL数据同步等需要处理海量数据的应用场景。本文以MyBatis框架为例,深入探讨如何通过Cur

weixin_30475039的博客 333

Ibatis Iterator用法小结

1、要在ibatis里面使用命名空间需要在sqlMapConfig.xml中增加如下设置          &lt;settings useStatementNamespaces="true" /&gt; 2、写JavaBean类时  建议把属性全部写成引用类型  对于基本类型写成它对应的包装类型       这样可以避免数据库中对应的字段可以为空时   查询结果在映射时报错 3、 &lt...

f04062115的专栏 718

OBS直播美颜全攻略:从插件下载到参数调校一站式指南

本文提供OBS直播美颜插件从下载安装到参数调校的一站式指南。详细介绍了如何安全获取并安装OBS美颜插件,重点讲解了在OBS中添加美颜滤镜的核心步骤,并分享了磨皮、肤色调整、细节增强等关键参数的实战调校技巧,帮助主播打造自然、专业的直播形象。

weixin_29197835的博客 327

前端埋点的实践

1、前言 开始正文前先介绍一下埋点的概念~,(熟悉的朋友可以略过) 前端埋点: 是一种手段,它的目的是上报相关行为数据,相关人员以数据为依据来分析产品在用户端的使用情况,根据分析出来的结果辅助产品优化、迭代。 BI:商业智能,公司内部做数据分析相关的部门。 2、背景 在流量红利逐渐消失的现在,数据的采集、分析和精细化的运营显得更加重要,所以埋点的需求在互联网产品中是很常见的,目的上面也提到了。我们的追求就是又快又好的做好埋点工作,但是现实却不那么美好;目前我们团队在前端埋点方面存在一些痛点: 在构造埋点字段

Arui_0的博客 1772

ibatis iterator list 参数 查询

本文系转载,十分感谢原作者。 点击打开原文 list参数查询,据说ibatis官方是有例子,我没有看到,基本上就是通过iterator标签可以循环,拼出sql。例如批量删除:   select * from tableName where ID in #[]#

mzglzzc的专栏 6942

【UE5_蓝图】实时音频采集与动态WAV文件保存实战指南

本文详细介绍了在UE5中使用蓝图实现实时音频采集与动态WAV文件保存的完整流程。从插件配置、录音框架搭建到动态文件名生成和音频参数优化,提供了实用技巧和常见问题解决方案,特别适合需要快速实现音频采集功能的开发者。

weixin_29009669的博客 408

Ibatis动态Sql语句 -- iterator

[quote] [size=x-large][color=blue]Ibatis动态Sql语句 -- iterator[/color][/size] [size=medium][color=darkblue] 需求:从查询列表中删除被选中记录(复选框)。 [/color][/size] [code="java"] String[] checkedIds = request...

lianghua840716的专栏 260

【EMC电磁兼容】02.04——原理图的实战落地细节

原理图上的关于EMC的落地体现一、元器件的选型二、原理图上的EMC体现在哪里?1.芯片电源管脚滤波去耦:2.时钟电路滤波设计3.低速电路滤波抗干扰设计4.通讯接口电路的防护滤波5.系统输入电源端口电路的防护滤波6.系统接地的定义7.芯片软件功能的审查 一、元器件的选型 ​ 原理图最初设计涉及到选型元器件方面: 元器件选型 不仅仅功能需要满足要求,还需要考虑其它细节参数在不同应力下的反应,封装的不同也会产生不同的变化。 元器件替代 常常因为成本原因进行器件替代,除了要考虑功能参数相同时也要考虑系统参数

Time to Forget 2243

京东风控算法工程师带你解读Action Model-精细化运营(上篇)

电影《蝴蝶效应》中,男主拥有回到童年改变过去的能力,虽然在剧中男主一次次穿越时空拯救世界,但由于他无法预见自己做出的抉择对未来产生的其他影响,最终还是没能阻止悲剧的发生。可见,一个好的决策需要衡量其对未来产生的影响。JDD风控算法团队本期为大家解惑最优决策难题的解决方法-Action Model。

JDD风控算法的博客 1916

Mybatis/Ibatis框架--动态SQL, foreach标签与List<T>、数组参数案例

       在根据刘增辉老师编写的《Mybatis从入门到精通》一书中, "4.4 foreach用法"一节中, 对于foreach标签与List&lt;T&gt;参数、数组参数的案例,我自己扩展了一些,希望能够帮到小伙伴们。        项目目录结构如下图图一所示:                                                         ...

dear_Alice_moon的专栏 3236

安全与加密常识(10)linux系统证书管理

1. 将自定义CA证书(如my-ca.crt)放到源目录# 2. 编辑配置文件,启用该证书(末尾添加一行 my-ca.crt)# 3. 执行命令同步(核心工作环节)# 4. 验证结果:检查是否生成哈希链接和合并到证书束ls /etc/ssl/certs/my-ca.pem # 证书文件ls /etc/ssl/certs/$(openssl x509 -hash -noout -in /usr/share/ca-certificates/my-ca.crt).0 # 哈希链接。

二进制君 285

ibatis简略

代码审计看到 系统采用SSI架构,之前没有正式这样运用过,看看实例,记录下ibatis一些注意项: 一、# 和 $符号的区别 1.#把传入的数据当作字符串处理,相当于jdbc预处理中的?,这样,在很大程度上能防止SQL注入 2.$把传入的数据直接生成在SQL里,无法防止SQL注入 3.能用#的就别用$符号 二、iterator

timesongjie的专栏 690

ican项目四汽车零件智能测量

ican项目四汽车零件智能测量

weixin_72050316的博客 561

把事务数据变成可分析数据:用 ABAP CDS 构建 Cube View 与 Query View,并拆解 OData 取数的底层路径

ABAP CDS分析建模:Cube与Query视图的实践解析 本文探讨了ABAP CDS分析建模中Cube View与Query View的核心区别与应用场景: 架构定位 Cube View作为分析型数据源,定义维度和度量的基础语义 Query View作为消费投影,控制查询可见字段和聚合逻辑 关键实现 通过@Analytics.dataCategory: #CUBE声明分析数据源 使用@DefaultAggregation确保指标口径一致性 @Analytics.query: true启用分析引擎特性 运

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 141

iBatis之Iterator的使用

一:前言 现在这个项目使用的是iBatis,我刚刚开始的时候说是用MyBatis,因为我以前用过,觉得还是比较好用的啊,而且不像iBatis样,查什么一个字段不能多也不能少,觉得好无语啊。 二:内容 自己现在接触的iterator有如下两种用处   (一):批量循环插入       批量插入的话有可以分开说,一种是在后台代码中,批量插入,一种是在数据库中循环插入   ...

weixin_30319097的博客 289

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于ibatis批量问题

我们到底能走多远系列(26) 推荐:  推荐使用 evernote 或其他类似工具浏览网页,现如今,我们大多数的阅读都是通过现实屏作为窗口实现的,记笔记或者再要一下是非常必要的尤其是看那些技术类的文章时,最近使用 evernote后,发现很不错,可以在浏览器上装一个插件,遇到好文,就可以方便的记录下来,然后同步到自己的移动设备上去,evernote没有免费 的离线,如果不想用流量,可以在w...

www.itmmd.com 144

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IBATIS Iterate用法——一些疑惑

IBATIS里的iterate标签提供了遍历List 来动态构造SQL。   主要写下使用的时候的注意点:   在BabyDAOImpl类里面些这么一个方法   Java代码 /** * 测试iterator */ public List&lt;BabyDO&gt; queryByIds(Map idsMap) throws SQLException { ...

wanxiaotao12-126-com 241

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Hibernate性能调优,优化

[url]http://cczakai.iteye.com/blog/963536[/url] Hibernate优化_Hibernate性能优化_Hibernate优化方案(上):[url]http://xiexiejiao.cn/hibernate/hibernate-performance-optimization-a.html[/url] Hibernate优化_Hibernate...

pyzheng的专栏 179
上一篇: spring 循环依赖引出的问题
下一篇: Hibernate DetachedCriteria 一对多查询
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值