news 2026/7/14 20:27:58

MyBatis隐形炸弹:selectByExampleWithBLOBs使用不当性能下降80%

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis隐形炸弹:selectByExampleWithBLOBs使用不当性能下降80%

01 引言

在MyBatis项目开发中,你是否遇到过查询突然变慢、内存占用飙升的困扰?这很可能是selectByExampleWithBLOBs使用不当导致的性能陷阱。

本文将为你揭秘这个看似简单却暗藏玄机的方法,从使用场景到性能优化,助你掌握BLOB字段查询的精髓,避免常见坑点。

02 缘起

这两天遇到一个线上BUG,就是因为selectByExampleWithBLOBs问题导致的。如图所示:

从报错的日志信息来看,是因为selectByExampleWithBLOBs没有绑定Mapper.xml文件。

问题很快就排查了,因为新加了字段需要使用逆向工程(MBG)重新生成实体。而生成的实体的时候,开发者对Text类型的字段直接指定了类型,导致BLOB字段丢失,Mapper.xml也不会有xxxxWithBLOBs的方法,导致问题产生。

默认的映射是将Text字段单独拿出来,使用xxxWithBLOBs单独接收,对应的xml也会生成类似selectByExampleWithBLOBs的方法,如图:

接下我们将一起探索xxxWithBlobs的用法。

03 概述

selectByExampleWithBLOBs是MyBatis Generator(MBG)自动生成代码时针对包含BLOB(Binary Large Object)字段的表的查询方法。它允许通过Example条件对象进行查询,同时包含对BLOB字段的检索。

当数据库表中包含BLOB、CLOB、TEXT等大字段类型时,MBG会生成两个查询方法:

  • selectByExample:查询时不包含BLOB字段
  • selectByExampleWithBLOBs:查询时包含BLOB字段

04 代码示例

4.1 数据库表结构

sql CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL, `author` varchar(100) DEFAULT NULL, `content` longtext, -- BLOB类型字段 `summary` text, -- BLOB类型字段 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4.2 自动生成实体以及配置

MyBatis Generator自动生成代码工具这里就详细说明了,直接使用工具生成。

我们可以看到ArticleWithBLOBs继承BaseArticle数据库实体类,content和summary已经单独处理了。

xml配置文件也有类似的方法:

4.3 使用

xxxWithBLOBs的使用很简单,就和selectByExample几乎一样。

java // 创建Example对象 ArticleExample example = new ArticleExample(); ArticleExample.Criteria criteria = example.createCriteria(); // 设置查询条件 criteria.andAuthorEqualTo("张三") .andCreateTimeGreaterThan(DateUtils.addDays(new Date(), -7)); // 排序 example.setOrderByClause("create_time DESC"); // 1. 普通查询(不获取content字段) List<Article> articles1 = articleMapper.selectByExample(example); // 2. 包含BLOB字段的查询 List<ArticleWithBLOBs> articles2 = articleMapper.selectByExampleWithBLOBs(example); // 此时articles2中的每个Article对象都包含content字段的数据

selectByExample和selectByExampleWithBLOBs的返回值不一样哦。

05 注意事项

5.1 性能问题

MBG为什么要把Text类型的字段单独处理呢?会有什么性能问题么?

Text字段通常存储大量数据,如文章内容、协议内容等,大数据量传递会消耗带宽以及IO等,从而影响性能。

所以,查询时不需要Text类型的字段时,尽量不要查询。遵循需要什么查什么的最少资源的模式,可以提高接口性能。

java // 不推荐:不必要的BLOB查询 ArticleExample example = new ArticleExample(); example.createCriteria().andStatusEqualTo(1); // 如果只需要统计数量或非BLOB字段,应使用普通查询 List<Article> articles = articleMapper.selectByExample(example); // 更好 // 需要BLOB数据时才使用WithBLOBs List<ArticleWithBLOBs> articlesWithBlobs = articleMapper.selectByExampleWithBLOBs(example);

5.2 字段排除与包含

MBG配置中可以控制BLOB字段的生成策略:

xml <table tableName="article" domainObjectName="Article"> <property name="useActualColumnNames" value="false" /> <property name="domainPackage" value="base" /> <columnRenamingRule searchString="is_" replaceString="" /> <!-- 默认映射 --> <columnOverride column="content" javaType="String" jdbcType="LONGVARCHAR"/> </table>

columnOverride用来指定生成的字段类型,上述代码为默认映射,可以通过指定jdbcType或者javaType来干涉生成的字段。

5.3 ResultMap差异

MBG会生成两个ResultMap:

  • BaseResultMap:不包含BLOB字段
  • ResultMapWithBLOBs:包含BLOB字段

5.4 Mapper兼容

selectByExampleWithBLOBs为MGB默认方法,生成的xxxMapper可能会不包此方法,这个和MGB这个工具有关系。我的工具里面就没有。

需要手动处理。

06 小结

小编觉得selectByExampleWithBLOBs应该做到非必要不使用,减少资源的消耗。如果存储的数据没有非常大的时候,应该避免使用text等大数据类型的。合理使用才是性能优化的关键,让大数据字段不再成为系统负担。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 18:35:18

CFD软件怎么选?实用选型指南——从需求匹配到工具价值的深度解析

在科研与工程领域&#xff0c;计算流体动力学&#xff08;CFD&#xff09;已成为“虚拟实验”的核心工具——从航空航天的气动外形优化&#xff0c;到新能源汽车的电池热管理&#xff0c;再到电子设备的散热设计&#xff0c;CFD通过数值模拟还原流体流动、传热、多相流等复杂物…

作者头像 李华
网站建设 2026/7/2 16:55:26

用QuantConnect Lean打造算法交易的利器

LEAN算法交易引擎概述 LEAN是一个专业级的算法交易平台&#xff0c;由QuantConnect团队开发&#xff0c;支持 Python 和 C# 语言。该平台具备事件驱动的架构&#xff0c;适用于量化开发者&#xff0c;旨在帮助用户轻松构建和测试交易算法。LEAN不仅支持多种金融市场的回测和实…

作者头像 李华
网站建设 2026/7/13 1:56:44

医疗数据用Git-LFS存储大文件稳住协作

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 医疗数据协作新范式&#xff1a;Git-LFS如何稳住大文件存储目录医疗数据协作新范式&#xff1a;Git-LFS如何稳住大文件存储 引言&#xff1a;医疗数据协作的“大文件困境” 现在时&#xff1a;Git-LFS在医疗协作的落地实…

作者头像 李华
网站建设 2026/7/1 13:26:42

JDK各版本新增特性详解

一、JDK 8&#xff08;LTS&#xff0c;2014年3月&#xff09;- 革命性更新 核心特性 Lambda表达式 // 旧方式 Collections.sort(list, new Comparator<String>() {Overridepublic int compare(String a, String b) {return a.compareTo(b);} });// Lambda方式 Collect…

作者头像 李华
网站建设 2026/7/5 16:56:04

Java计算机毕设之基于SpringBoot社区医疗预约挂号平台的设计与实现基于springboot的医院挂号就诊系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/29 17:20:06

如何跟上当今AI高速发展的步伐

如何跟上当今AI高速发展的步伐&#xff0c;这正是我们时代最关键的问题之一。跟上AI时代的步伐&#xff0c;并非要每个人都成为技术专家&#xff0c;而是要建立一种“AI优先”的思维模式和行动策略。以下是一套从思想到行动的系统性建议&#xff0c;希望能为你提供清晰的路径&a…

作者头像 李华