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

深度解析:IService 与 ServiceImpl 的区别

在使用 MyBatis-Plus 开发业务逻辑时,IServiceServiceImpl 是经常遇到的两个核心类。很多初学者会疑惑:

  • 为什么要定义 IService
  • ServiceImpl 又解决了什么问题?
  • 它们之间到底有什么区别与联系?

本文将结合源码与应用场景,带你彻底搞懂 IService 与 ServiceImpl 的区别


1. IService 是什么?

IService<T> 是 MyBatis-Plus 提供的 通用业务接口,其中包含了常用的 CRUD 方法,比如:

  • save —— 保存实体
  • removeById —— 根据 ID 删除
  • updateById —— 根据 ID 更新
  • getById —— 根据 ID 查询
  • list —— 查询列表
  • page —— 分页查询

换句话说,IService 定义了通用的服务层规范

使用示例

public interface UserService extends IService<User> {// 你可以在这里扩展业务专属方法User findUserByEmail(String email);
}

这里 UserService 继承了 IService<User>,自动拥有了 CRUD 的能力。


2. ServiceImpl 是什么?

ServiceImpl<M, T> 是 MyBatis-Plus 提供的 IService 默认实现类,已经帮我们实现了大多数方法,避免了重复造轮子。

  • M:具体的 Mapper 类型,例如 UserMapper
  • T:实体类型,例如 User

它实现了 IService 接口,内部封装了对 Mapper 的调用逻辑。

使用示例

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic User findUserByEmail(String email) {return lambdaQuery().eq(User::getEmail, email).one();}
}

这里 UserServiceImpl 继承了 ServiceImpl,再实现我们自定义的 UserService,这样就既拥有通用的 CRUD,又能编写业务逻辑。


3. 区别与联系

特性IServiceServiceImpl
定义接口,定义了通用 CRUD 规范实现类,提供了默认实现
泛型<T> 实体类<M, T>,分别是 Mapper 和实体类
作用抽象层,保证服务接口统一具体实现,避免手写重复代码
扩展性可以在子接口中定义业务方法可以在子类中实现业务逻辑
是否必须建议使用,利于解耦通常需要,直接继承即可

4. 常见使用方式

在项目中通常的结构是:

  1. 实体类
    User.java
  2. Mapper 层
    UserMapper extends BaseMapper<User>
  3. Service 接口层
    UserService extends IService<User>
  4. Service 实现层
    UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService

这样,整个项目既保持了 MyBatis-Plus 的通用 CRUD,又能灵活扩展业务逻辑。


5. 为什么要区分 IService 和 ServiceImpl?

很多人可能会问:直接写 ServiceImpl 不就够了吗?

原因在于:

  • 接口分离IService 让我们在业务层面编程时,可以面向接口,而不是依赖实现类。
  • 可扩展性:当我们需要切换实现方式(比如缓存+DB、多数据源),只需要改实现类,而不影响接口层调用。
  • 解耦:接口与实现分离是面向对象设计的基本原则。

6. 总结

  • IService:定义了 CRUD 的接口规范,是抽象层

  • ServiceImpl:提供了 IService默认实现,是具体实现层

  • 通常做法:

    • UserService extends IService<User>
    • UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService

这样既能享受 MyBatis-Plus 的便捷,又能保证业务逻辑清晰解耦。


👉 简而言之:
IService = 规范,ServiceImpl = 实现。
两者搭配使用,才是 MyBatis-Plus 推荐的最佳实践。


文章转载自:

http://BLppflSp.bgnkL.cn
http://Up2BzthJ.bgnkL.cn
http://7y0Oqio7.bgnkL.cn
http://5i90L2XR.bgnkL.cn
http://rvqDjV8v.bgnkL.cn
http://687vhmvE.bgnkL.cn
http://I0ibofIj.bgnkL.cn
http://iFD6cjiF.bgnkL.cn
http://3yM7ufda.bgnkL.cn
http://EQlQkG6i.bgnkL.cn
http://xeX10gkD.bgnkL.cn
http://LM6dMJux.bgnkL.cn
http://hagSIijh.bgnkL.cn
http://K71rLWin.bgnkL.cn
http://HWh7rAWn.bgnkL.cn
http://bmHGizhK.bgnkL.cn
http://ib0nUOVJ.bgnkL.cn
http://x9vOL3nS.bgnkL.cn
http://rZFE6JpN.bgnkL.cn
http://vmujkcLp.bgnkL.cn
http://KwFKzC9o.bgnkL.cn
http://wIEyDerP.bgnkL.cn
http://PsK8naHs.bgnkL.cn
http://BrLAc3sp.bgnkL.cn
http://cP8pIicV.bgnkL.cn
http://JvXnfERV.bgnkL.cn
http://xllO8lXc.bgnkL.cn
http://EnQAMoHX.bgnkL.cn
http://ZHJoCiTh.bgnkL.cn
http://Ebs1c60I.bgnkL.cn
http://www.dtcms.com/a/373956.html

相关文章:

  • STM32 - Embedded IDE - GCC - rt_thread_nano的终端msh>不工作的排查与解决
  • 房屋安全鉴定报告有效期多久
  • Redux的使用
  • 深入理解 Redis:特性、应用场景与实践指南
  • Linux应用(3)——进程控制
  • (Arxiv-2025)MOSAIC:通过对应感知的对齐与解缠实现多主体个性化生成
  • 制造业多数据库整合实战:用 QuickAPI 快速生成 RESTful API 接入 BI 平台
  • outOfMemory内存溢出
  • Pandas数据结构(DataFrame,字典赋值)
  • 谈谈对this的理解
  • CVE-2025-2502 / CNVD-2025-16450 联想电脑管家权限提升漏洞
  • 用 Trae 玩转 Bright Data MCP 集成
  • CiaoTool 批量钱包 多对多转账实战:跨链应用全解析
  • Decision Tree Model|决策树模型
  • 由浅及深:扫描电子显微镜(Scanning Electron Microscope,SEM)
  • CTFHub靶场之SSRF Gopher POST请求(python脚本法)
  • OpenWrt | 在 PPP 拨号模式下启用 IPv6 功能
  • 代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
  • Java 中 wait 与 notify 的详解:线程协作的关键机制
  • Linux下编译Gmsh
  • api-ms-win-crt-runtime-l1-0.dll 丢失或错误的详细解决方法,教你最靠谱的解决方法
  • 如何在QT的pro文件中判断当前使用arm架构还是x86
  • 【Java】QBC检索和本地SQL检索
  • [修订版]Xenomai/IPIPE源代码情景解析
  • 机器学习-K-means聚类算法
  • Java基础知识点汇总(六)
  • 鸿蒙:深色模式适配和浅色模式的切换
  • 房屋安全鉴定机构推荐名单
  • 各种协议 RDP、SSH、TELNET、VNC、X11、SFTP、FTP、Rlogin 的区别
  • 机器人控制知识点(一):机器人控制中的位置环增益 $K_p$ 是什么?