当前位置: 首页 > news >正文

【Java后端】MyBatis-Plus 原理解析

MyBatis-Plus 原理解析

其实 MyBatis-Plus 的 Service 层设计就是为了让开发者不用重复写很多样板代码。我们来一点点剖析 UserServiceImplIServiceUserServiceServiceImpl 之间的关系和调用链。


1. 类/接口关系图

             IService<T>▲│UserService (接口)   <-- 自定义的接口▲│ServiceImpl<M, T> (抽象类,提供默认实现)▲│UserServiceImpl (写的实现类)

2. 各个角色的作用

(1) IService<T>

  • MP 提供的 通用 Service 接口,定义了最常用的 CRUD 方法。
  • 例如:
public interface IService<T> {boolean save(T entity);boolean removeById(Serializable id);boolean updateById(T entity);T getById(Serializable id);List<T> list();// ... 还有很多
}

(2) UserService

  • 你的业务接口,继承了 IService<User>
  • 这样 UserService 就自动拥有了所有 CRUD 方法,不用自己再声明。
  • 但你也可以在里面 加自定义业务方法
public interface UserService extends IService<User> {User findByEmail(String email); // 自定义方法
}

(3) ServiceImpl<M, T>

  • MP 提供的 通用实现类,实现了 IService<T> 里的所有方法。
  • 内部通过调用 BaseMapper<T> 来完成数据库操作。

源码片段(简化):

public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {@Autowiredprotected M baseMapper; // Mapper 注入进来@Overridepublic boolean save(T entity) {return baseMapper.insert(entity) > 0;}@Overridepublic T getById(Serializable id) {return baseMapper.selectById(id);}
}

(4) UserServiceImpl

  • 你的实现类,继承了 ServiceImpl<UserMapper, User> 并实现 UserService
  • 因为 ServiceImpl 已经实现了 IService 的方法,所以你啥都不用写,就自动拥有 savegetByIdlist 等方法。
  • 你可以在里面实现自定义的业务逻辑:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic User findByEmail(String email) {return lambdaQuery().eq(User::getEmail, email).one();}
}

3. 调用链条

比如调用 userService.save(user) 的时候,流程是这样的:

  1. Controller 调用
userService.save(user);
  1. Spring 容器注入的其实是 UserServiceImpl 对象
    所以进入 UserServiceImpl.save()
  2. UserServiceImpl 继承自 ServiceImpl,没有重写 save(),于是调用的是 ServiceImpl.save()
  3. ServiceImpl.save() 内部会调用 baseMapper.insert(user),而 baseMapper 是注入的 UserMapper,继承了 BaseMapper<User>
  4. BaseMapper 底层最终由 MyBatis 执行 SQL,完成插入操作。

4. 关键总结

  • IService<T>定义通用方法(接口)。
  • UserService业务接口,扩展 IService<User>
  • ServiceImpl<M, T>默认实现,帮你实现了 IService 的所有方法。
  • UserServiceImpl实现类,继承 ServiceImpl,可以直接用 CRUD,也可以扩展业务方法。

所以:
👉 写的代码只需要关心业务逻辑,CRUD 全交给 MyBatis-Plus 的基类完成

http://www.dtcms.com/a/335654.html

相关文章:

  • Unity进阶--C#补充知识点--【Unity跨平台的原理】了解.Net
  • Linux | i.MX6ULL网络通信-套字节 UDP(第十八章)
  • 【牛客刷题】后缀子串字母统计:O(n)高效算法详解
  • python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
  • 数学建模 15 逻辑回归与随机森林
  • 大上墨水屏显示器Paperlike253 Mac 特别版 使用体会
  • MySQL数据库初识
  • 黑马java八股文全集
  • AUTOSAR ARXML介绍
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • C++编程实战:高效解决算法与数据结构问题
  • 【CV 目标检测】Fast RCNN模型②——算法流程
  • 【递归、搜索与回溯算法】记忆化搜索
  • 图解希尔排序C语言实现
  • 分治-归并-315.计算右侧小于当前元素的个数-力扣(LeetCode)
  • Java基础 8.17
  • Debug马拉松:崩溃Bug的终极挑战
  • 一起Oracle 19c bug 导致的业务系统超时问题分析
  • JUC常用线程辅助类详解
  • Blender模拟结构光3D Scanner(二)投影仪内参数匹配
  • 积鼎科技CFD VirtualFlow:引领国产多相流仿真技术,赋能工业智造
  • (一)React企业级后台(Axios/localstorage封装/动态侧边栏)
  • 【React 性能】性能优化第一课:搞懂 `React.memo`, `useCallback`, `useMemo`
  • 重学React(六):脱围机制二
  • Spark03-RDD02-常用的Action算子
  • WebSocket DevTools 开发调试工具完全指南 – 实时监控、消息拦截、性能分析一站式解决方案
  • 【Java后端】Spring Boot 集成 MyBatis 全攻略
  • 遥感数字图像处理教程——第二章部分课后习题
  • Java零基础笔记20(Java高级技术:单元测试、反射、注解、动态代理)
  • Oracle Undo Tablespace 使用率暴涨案例分析