Mybatis 获取当前月、指定月 或 两个指定时间间隔 的数据集合

当前月:

and DATE_FORMAT(a.createTime,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m')

指定月:

<if test="month!=null and month!=''">
    and DATE_FORMAT(a.createTime,'%Y-%m')=#{month}
</if>


两个指定时间间隔:

<if test="startDate!=null and startDate!=''and endDate!=null and endDate!=''">
    and a.createTime between #{startDate} and #{endDate}
</if>


 

### MyBatis 占位符数量限制的原因 数据库驱动程序和特定的数据库实现通常会对SQL语句中的参数个数有所限制。当使用MyBatis执行批量操作时,如果单次操作涉及过多的占位符(例如超过一千个),可能会遇到性能下降甚至失败的情况[^3]。 对于MySQL而言,默认情况下存在最大允许包长度(`max_allowed_packet`)以及查询字符串的最大长度等约束条件,这些都会影响到可以传递给预编译语句的最大参数数目。此外,在某些版本中还可能存在内部处理上的局限性,使得大量参数无法被有效支持。 ### 解决方案 #### 方法一:分批提交 通过控制每次插入的数据量来规避这个问题。将大数据集拆分成较小的部分逐一批量写入数据库是一个常见做法。这不仅能够避开占位符的数量上限问题,而且有助于提高整体效率并降低内存消耗。 ```java int batchSize = 100; // 每批次大小 for (int i = 0; i < largeDataset.size(); i += batchSize) { List<Record> batchRecords = largeDataset.subList(i, Math.min(largeDataset.size(), i + batchSize)); mapper.insertBatch(batchRecords); } ``` 这种方法利用了Java集合类库提供的`subList()`函数轻松实现了按指定间隔切片的功能,并调用了自定义Mapper接口里的`insertBatch()`方法完成实际的数据持久化工作。 #### 方法二:优化SQL设计 重新审视业务逻辑与数据模型之间的关系,尝试重构原有的大批量插入需求为更合理的模式。比如采用临时表加载方式先导入全部记录再做关联更新;者是借助存储过程的力量把部分计算任务交给DBMS本身去完成等等。 以上两种策略都可以有效地缓解因占位符过多而引发的各种麻烦,同时也体现了灵活性与可扩展性的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值