news 2026/4/16 12:29:43

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/4/14 9:36:02

这样做的幂等也太全了吧!

在做票务下单的时候&#xff0c;肯定要做幂等和放重复的&#xff0c;防止用户操作出现重复的订单和重复支付等问题&#xff0c;于是有了本篇文章。幂等设计需分层防护&#xff0c;从接口层到数据层形成完整防线。推荐以下方案&#xff1a;1. 接口层&#xff1a;幂等Token机制&a…

作者头像 李华
网站建设 2026/3/25 18:22:38

CentOS7安装Redis6全攻略

一、介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一款基于内存的高性能键值对存储数据库&#xff0c;它以极快的读写速度和丰富的数据结构&#xff0c;成为了众多开发者解决高并发、低延迟问题的首选方案。CentOS是Red Hat Enterprise Linux&#xff08;RHE…

作者头像 李华
网站建设 2026/4/16 10:54:03

基于腾讯元器搭建智能体“看图写诗词专家”Agent智能体搭建笔记

本文系统梳理基于腾讯元器平台构建“看图写诗词专家”智能体的全流程实操要点&#xff0c;涵盖前期需求锚定、核心功能搭建、Multi_Agent关系配置、测试优化及运维保障等关键环节。该智能体采用Multi_Agent模式开发&#xff0c;核心定位为“图文意境适配的诗词创作智能助手”&a…

作者头像 李华
网站建设 2026/4/16 10:16:25

有实力的金包银有哪些

金包银行业深度剖析&#xff1a;六六珠宝脱颖而出行业痛点分析在金包银领域&#xff0c;当前存在着诸多技术挑战。其中&#xff0c;金层厚度不均、结合力不足以及耐磨性差是较为突出的问题。测试显示&#xff0c;市场上部分金包银产品的金层厚度偏差可达 20%以上&#xff0c;这…

作者头像 李华
网站建设 2026/4/10 11:22:55

AI智能体在识别价值陷阱和价值机会中的作用

AI智能体在识别价值陷阱和价值机会中的作用 关键词:AI智能体、价值陷阱、价值机会、数据分析、金融市场 摘要:本文深入探讨了AI智能体在识别价值陷阱和价值机会方面的作用。首先介绍了相关背景知识,包括研究目的、预期读者、文档结构和术语表。接着阐述了核心概念,如AI智能…

作者头像 李华
网站建设 2026/4/12 9:36:52

c编译器并不难,Turbo c编译器介绍(上篇)

c编译器的产生意义重大&#xff0c;目前市场上有诸多不同c编译器。在往期文章中&#xff0c;小编对gcc c编译器有所介绍。为增进大家对c编译器的认识&#xff0c;本文将对Turbo C c编译器予以讲解。如果你对c编译器具有兴趣&#xff0c;不妨继续往下阅读哦。一、Turbo C 的产生…

作者头像 李华