news 2026/6/10 19:02:04

理解mybatis向上抽取的概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
理解mybatis向上抽取的概念

1. 先理解 “向上抽取” 的核心概念

“向上抽取” 本质是面向抽象编程 + 通用逻辑复用的设计思想:把数据库操作(CRUD)中重复、通用、固定的逻辑从业务代码中抽离出来,封装到更上层的抽象层(比如通用父类 / 接口),让业务代码只需要关注自身的个性化逻辑,无需重复编写模板化代码。

MyBatis-Plus 正是基于这个思想,对原生 MyBatis 的 CRUD 操作做了极致的 “向上抽取”,核心解决的问题是:避免每个 Mapper/Service 都重复写相同的增删改查方法

2. MyBatis-Plus 向上抽取的分层实现

MyBatis-Plus 的抽取逻辑主要体现在Mapper 层Service 层两个核心层级,我们逐层拆解:

2.1 第一步:Mapper 层的抽取(基础核心)

原生 MyBatis 中,你需要为每个实体的 Mapper 接口手动定义 CRUD 方法(如insertUserselectUserById),而 MP 把这些通用方法抽取到了BaseMapper<T>这个抽象接口中。

核心实现逻辑

封装所有通用CRUD方法

只关注个性化SQL

只关注个性化SQL

BaseMapper 抽象接口

UserMapper 业务Mapper

OrderMapper 业务Mapper

ProductMapper 业务Mapper

用户表个性化查询

订单表个性化查询

graph TD A[BaseMapper<T> 抽象接口] -->|封装所有通用CRUD方法| B[UserMapper 业务Mapper] A --> C[OrderMapper 业务Mapper] A --> D[ProductMapper 业务Mapper] B -->|只关注个性化SQL| E[用户表个性化查询] C -->|只关注个性化SQL| F[订单表个性化查询]

封装所有通用CRUD方法

只关注个性化SQL

只关注个性化SQL

BaseMapper 抽象接口

UserMapper 业务Mapper

OrderMapper 业务Mapper

ProductMapper 业务Mapper

用户表个性化查询

订单表个性化查询

豆包

你的 AI 助手,助力每日工作学习

代码示例:
  • MP 提供的抽象父接口BaseMapper<T>(核心抽取的通用方法):

    java

    运行

    public interface BaseMapper<T> extends Mapper<T> { // C: 新增 int insert(T entity); // D: 根据ID删除 int deleteById(Serializable id); // U: 根据ID更新 int updateById(@Param("et") T entity); // R: 根据ID查询 T selectById(Serializable id); // R: 查询所有 List<T> selectList(Wrapper<T> queryWrapper); // 还有分页查询、批量操作等数十个通用方法... }
  • 你的业务 Mapper 只需继承这个抽象接口(无需写任何通用方法):

    java

    运行

    // 继承BaseMapper<User>,自动拥有User表的所有通用CRUD方法 public interface UserMapper extends BaseMapper<User> { // 只需要写User表的个性化查询(比如复杂联表),通用方法无需重复写 List<User> selectUserByAgeRange(@Param("minAge") Integer minAge, @Param("maxAge") Integer maxAge); }
2.2 第二步:Service 层的抽取(进阶复用)

MP 不仅抽取了 Mapper 层,还对 Service 层做了更上层的抽取,提供了IService<T>接口和ServiceImpl<M, T>实现类,封装了通用的业务层逻辑(比如批量新增、分页查询、逻辑删除、乐观锁等)。

核心实现逻辑:

只关注个性化业务逻辑

只关注个性化业务逻辑

IService 抽象接口

ServiceImpl, T> 实现类

UserService 业务Service

OrderService 业务Service

用户登录/权限校验等

订单状态流转等

graph TD A[IService<T> 抽象接口] --> B[ServiceImpl<BaseMapper<T>, T> 实现类] B --> C[UserService 业务Service] B --> D[OrderService 业务Service] C -->|只关注个性化业务逻辑| E[用户登录/权限校验等] D -->|只关注个性化业务逻辑| F[订单状态流转等]

只关注个性化业务逻辑

只关注个性化业务逻辑

IService 抽象接口

ServiceImpl, T> 实现类

UserService 业务Service

OrderService 业务Service

用户登录/权限校验等

订单状态流转等

豆包

你的 AI 助手,助力每日工作学习

代码示例:
  • 业务 Service 接口继承IService<T>

    java

    运行

    // 继承IService<User>,自动拥有User表的通用业务方法 public interface UserService extends IService<User> { // 只写User的个性化业务逻辑,通用CRUD无需重复写 boolean login(String username, String password); }
  • 业务 Service 实现类继承ServiceImpl

    java

    运行

    @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { // 实现个性化业务逻辑 @Override public boolean login(String username, String password) { // 调用父类提供的通用查询方法 User user = lambdaQuery().eq(User::getUsername, username).one(); return user != null && user.getPassword().equals(password); } }
2.3 第三步:抽取的 “可扩展” 设计(不是硬编码)

MP 的向上抽取不是 “一刀切” 的固定逻辑,而是保留了个性化扩展的入口,体现了 “抽取通用、保留个性” 的核心思想:

  • 通用方法满足 80% 场景:比如insertselectByIdupdateById等,直接用即可;
  • 个性化场景可扩展
    • Mapper 层:通过注解 / XML 编写个性化 SQL;
    • Service 层:通过lambdaQuery()lambdaUpdate()等链式 API 快速构建个性化查询,或重写父类方法;
    • 全局配置:通过MybatisPlusConfig自定义主键生成策略、逻辑删除字段等,让通用逻辑适配你的业务。

3. 对比原生 MyBatis,理解 “向上抽取” 的价值

表格

维度原生 MyBatisMyBatis-Plus(向上抽取)
Mapper 层代码量每个实体都要写全套 CRUD 方法 + XML只需继承 BaseMapper,零通用代码
Service 层代码量每个 Service 都要封装 CRUD 业务逻辑继承 IService/ServiceImpl,零通用代码
扩展成本新增实体需重复写模板代码,易出错只需关注个性化逻辑,扩展成本极低
维护成本通用逻辑修改需改所有 Mapper/Service通用逻辑修改只需改 MP 底层,全局生效

4. 向上抽取的底层支撑(为什么能实现)

MP 能做到高效的向上抽取,核心依赖两个技术:

  • 泛型(Generic)BaseMapper<T>IService<T>中的<T>是实体类泛型,MP 通过泛型反射获取实体类的表名、字段名等信息,动态生成通用 SQL;
  • 动态代理(Dynamic Proxy):MP 基于 MyBatis 的动态代理机制,为继承BaseMapper的接口动态生成通用方法的实现,无需手动写 SQL。

总结

  1. MyBatis-Plus 的 “向上抽取” 核心是把通用的 CRUD 逻辑抽离到抽象层,让业务代码只关注个性化逻辑,避免重复造轮子;
  2. 抽取分为两层:BaseMapper<T>抽取代码层通用 SQL 操作,IService<T>抽取业务层通用逻辑;
  3. 抽取不是 “固定死” 的,而是保留扩展入口,通用 + 个性化结合,既提升开发效率,又满足业务定制化需求。

这种思想不仅适用于 MyBatis-Plus,也是整个 Java 开发中 “高内聚、低耦合” 设计原则的典型体现 ——将不变的部分抽象,将变化的部分留空

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

Python爬虫代理,选短效IP还是长效IP?

Python爬虫代理是网络数据采集中不可或缺的技术手段&#xff0c;尤其在高频请求、分布式任务或大规模抓取中&#xff0c;代理IP的选择对爬虫运行效率和成功率影响极大。那么问题来了&#xff1a;在实际应用中&#xff0c;应该选择短效IP还是长效IP&#xff1f;本文将结合Python…

作者头像 李华
网站建设 2026/6/9 22:41:43

31-建筑工地安全AI-安全帽与危险行为检测标注实战

&#x1f3d7;️ 引言&#xff1a;AI守护工地安全 建筑行业是高危行业之一。根据国家统计局数据显示&#xff0c;近年来我国建筑业年均发生安全事故超过千起&#xff0c;死亡人数常年位居工矿商贸事故死亡人数前三&#xff0c;其中高处坠落、物体打击、触电和机械伤害是主要致…

作者头像 李华
网站建设 2026/5/31 15:03:00

基于SpringBoot和Vue的在线招标系统的设计与实现

文章目录详细视频演示项目介绍技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 基于 SpringBoot 的在线招标系统是一款聚焦招投标全流程数字化管理的平台&#xff0c;整合 “…

作者头像 李华
网站建设 2026/6/10 15:07:44

【jieba词云实战】词云蒙版制作:从图片提取轮廓的三种方法

前篇&#xff1a;【Jieba实战】jieba WordCloud 生成中文词云 想让词云填满一只米老鼠的轮廓&#xff1f;关键在于制作一张合格的蒙版图片。 一、什么是蒙版&#xff1f; ​ WordCloud 的 mask 参数接受一张图片&#xff0c;用它来控制词云的填充区域&#xff1a; 白色像素&a…

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

基于YOLO26的智能道路监测的坑洼分割系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLO26的智能道路监测的坑洼分割检测系统&#xff0c;阐述了整个数据制作和训练可视化过程 博主简介 ​ AI小怪兽 | 计算机视觉布道者 | 视觉检测领域创新者 深耕计算机视觉与深度学习领域&#xff0c;专注…

作者头像 李华