news 2026/4/15 19:02:00

理解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/4/15 17:13:16

SpringBoot 开发第二天 学习内容

本次学习核心围绕SpringBoot Web 开发展开&#xff0c;涵盖静态资源映射、模板引擎 Thymeleaf、SpringMVC 整合与扩展、嵌入式 Servlet 容器配置及外置 Servlet 容器部署五大核心模块&#xff0c;同时涉及 SpringBoot 自动配置的底层原理和实际开发中的扩展技巧。 一、Web 开发…

作者头像 李华
网站建设 2026/4/8 12:39:35

你的仓库,还停留在“人找货”的时代吗?

多少库管员在数万平方米的仓库里奔走&#xff0c;只为了一纸调拨单&#xff1b;月底盘点&#xff0c;账实不符是常态&#xff0c;谁也说不清问题出在哪一环&#xff1b;客户急着要货&#xff0c;系统显示有库存&#xff0c;实物却怎么也找不到……如果你的仓库管理依然依赖经验…

作者头像 李华
网站建设 2026/4/12 1:38:11

运算放大器:常用电路

转载&#xff1a;https://cloud.tencent.com/developer/article/1971052 01 反相比例运算电路 02 同相比例运算电路 03 电压跟随器 04 反相求和运算电路 05 同相求和运算电路 06 加减运算电路 07 加减电路 08 积分运算电路 09 实用积分电路 010 微分运算电路 011 实…

作者头像 李华
网站建设 2026/3/26 6:17:44

物联网温室大棚智能监控系统解决方案,赋能智慧农业升级

物联网温室大棚智能监控系统是一套基于物联网、大数据、人工智能与自动化控制技术&#xff0c;实现环境参数自动感知、数据智能分析、设备精准联动、远程可视化管理的农业数字化解决方案&#xff0c;核心目标是为作物创造稳定适宜的生长环境&#xff0c;推动农业生产从“靠经验…

作者头像 李华
网站建设 2026/4/11 1:58:19

Elcomsoft 系统取证工具: 选择正确策略, 冷启动取证 vs 实时系统分析

调查的第一步往往并不简单。你是应该关闭系统并对存储介质制作镜像&#xff0c;选择安全但缓慢的传统路径&#xff1f;还是应该在运行中的系统上使用应急响应工具来获取密码和密钥&#xff0c;或者重新启动进入一个干净的取证环境&#xff1f;传统的智慧可能建议直接断电以保护…

作者头像 李华
网站建设 2026/3/27 8:05:57

Java面试实战:从基础到微服务开发中的关键技术点

Java面试实战&#xff1a;从基础到微服务开发中的关键技术点 场景描述 小白程序员“超好吃”正在参加某互联网大厂的Java开发岗面试&#xff0c;面试官通过一系列循序渐进的问题考察其技术能力。场景聚焦在电商场景中的微服务架构设计与缓存技术应用。第一轮&#xff1a;基础与…

作者头像 李华