深度解析: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://www.pswp.cn/bicheng/96195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96195.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLO12 改進、魔改|通道自注意力卷積塊CSA-ConvBlock,通過動態建模特征圖通道間的依賴關系,優化通道權重分配,在強化有效特征、抑制冗余信息

在分割的研究中&#xff0c;傳統卷積神經網絡&#xff08;CNN&#xff09;存在兩大關鍵問題&#xff1a;一是池化操作雖能降低計算復雜度&#xff0c;卻會導致特征圖中有效空間信息丟失&#xff0c;尤其太陽暗條這類不規則、精細結構的特征易被削弱&#xff1b;二是傳統 CNN 對…

JuiceFS分布式文件系統

對象存儲雖然具備極高的擴展性和成本優勢&#xff0c;卻缺乏對POSIX語義的支持&#xff0c;導致許多應用無法直接使用。正是在這樣的背景下&#xff0c;JuiceFS 應運而生——它巧妙地融合了對象存儲的彈性與傳統文件系統的易用性&#xff0c;為現代應用提供了一種全新的存儲解決…

nginx配置前端請求轉發到指定的后端ip

nginx conf配置 配置把“前端靜態文件”和“后端接口”統一收在 同一個 server{} 塊 里&#xff0c;通過 兩條 location 做分流&#xff0c;其中 /api 這條 location 用到了一點“小技巧”把路徑裁掉后再轉發。下面按執行順序逐句拆解&#xff0c;告訴你“請求是怎么被轉發到 1…

HTML 各種標簽的使用說明書

HTML 各種標簽的使用說明書 1. HTML 簡介 HTML&#xff08;HyperText Markup Language&#xff0c;超文本標記語言&#xff09;是用于創建網頁的標準標記語言。它使用一系列標簽來描述網頁的結構和內容&#xff0c;這些標簽被瀏覽器解釋并渲染成用戶看到的網頁。HTML是構建We…

從關鍵詞到語義理解:小陌引擎如何重構AI搜索優化邏輯?

引言&#xff1a;AI搜索時代的范式轉變在傳統互聯網時代&#xff0c;SEO&#xff08;搜索引擎優化&#xff09;是企業數字營銷的核心策略&#xff0c;通過關鍵詞密度、外鏈建設等技術手段提升網頁在搜索引擎結果頁&#xff08;SERP&#xff09;中的排名。然而&#xff0c;隨著生…

ADE explorer遇到XVFB服務器的問題

遇到這個報錯&#xff0c;是因為服務器沒有安裝xvfb的原因。yum install Xvfb即可解決問題。

期權的套利怎么理解?

期權套利是利用期權價格之間的不合理偏差&#xff0c;通過構建對沖組合獲取無風險利潤的策略。其核心邏輯基于“無套利定價原則”——若存在價格偏差&#xff0c;市場力量會迅速修正&#xff0c;套利者通過反向操作鎖定利潤。期權的套利怎么理解&#xff1f;一、主要套利類型與…

RabbitMQ 重試機制 和 TTL

目錄 1. 重試機制 1.1 簡介 1.2 配置文件 1.3 消費者確認機制為 auto 時 1.4 消費者確認機制為 manual 時 2. TTL 2.1 設置消息的過期時間 2.2 設置隊列的過期時間 2.3 給過期隊列中消息設置過期時間 1. 重試機制 1.1 簡介 在消息傳遞過程中, 可能會遇到各種問題, …

四、FVP啟動linux

目錄 1 實驗目的及環境 1.1 實驗目的 1.2 實驗環境 1.2.1 拉取代碼 1.2.2搭建交叉編譯環境 2 相關鏡像編譯 2.1 TF-A鏡像編譯 2.2 U-Boot鏡像編譯 2.3 Linux Kernel鏡像編譯 2.4 構建跟文件系統 3 啟動linux內核 3.1 啟動腳本構建 3.2 啟動Linux內核 1 實驗目的及環境 1.1 實驗…

淺聊一下微服務的服務保護

在微服務架構里&#xff0c;服務間調用關系錯綜復雜&#xff0c;一個服務出問題很可能引發連鎖反應&#xff0c;也就是 “雪崩”。今天就帶大家從零開始學習 Sentinel&#xff0c;這款阿里開源的微服務保護工具&#xff0c;幫你解決雪崩難題&#xff0c;做好流量控制、隔離降級…

ECharts Gallery:Apache官方數據可視化模板庫,助你快速制作交互圖表并實現深度定制

你有沒有過這種時候&#xff1f;手里攥著一堆 Excel 數據&#xff0c;想做個直觀的圖表給同事看&#xff0c;用 Excel 自帶的圖表吧&#xff0c;樣式丑不說&#xff0c;稍微復雜點的交互&#xff08;比如點擊柱子顯示詳情&#xff09;根本做不了&#xff1b;想自己用代碼寫吧&a…

[數據結構——lesson3.單鏈表]

目錄 引言 學習目標&#xff1a; 1.什么是鏈表 2.鏈表的分類 2.1 單向鏈表和雙向鏈表 (1)單向鏈表 (2)雙向鏈表 2.2 帶頭結點鏈表和不帶頭結點鏈表 (1)帶頭結點鏈表 (2)不帶頭結點鏈表 2.3 循環鏈表和不循環鏈表 (1)循環鏈表 &#xff08;2)非循環鏈表 3.鏈表的實…

從零深入理解嵌入式OTA升級:Bootloader、IAP與升級流程全解析

引言&#xff08;Opening&#xff09;想象一下&#xff0c;你開發的一款智能水杯、一個環境監測設備或者一臺共享充電寶&#xff0c;已經部署到了成千上萬的用戶手中。突然&#xff0c;你發現了一個軟件bug&#xff0c;或者需要增加一個酷炫的新功能。你不可能派人跑到每個設備…

【Ansible】實施 Ansible Playbook知識點

1.清單概念與靜態清單文件是什么&#xff1f;答&#xff1a;Ansible 清單是被管理主機的列表&#xff0c;用于明確Ansible的管理范圍&#xff0c;分為靜態清單和動態清單。靜態清單是通過手動編輯的文本文件來定義被管主機&#xff0c;文件格式可以是INI格式或YAML格式。在INI格…

【Linux】vim工具篇

目錄一、vim的多模式1.1 命令模式1.1.1 光標移動1.1.2 復制及撤銷1.1.3 剪切及刪除1.1.4 替換1.1.5 批量化注釋/去注釋1.2 底行模式二、vim的配置個人主頁<—請點擊 Linux專欄<—請點擊 一、vim的多模式 vim是一款功能強大的文本編輯器&#xff0c;它編輯代碼主要圍繞命…

Spark 核心原理:RDD, DataFrame, DataSet 的深度解析

Apache Spark 是一個強大的分布式計算系統&#xff0c;以其內存計算、速度快、易用性強等特點&#xff0c;在大數據處理領域占據重要地位。理解 Spark 的核心原理&#xff0c;特別是其三種核心抽象——RDD, DataFrame, DataSet——對于高效地使用 Spark 至關重要。本文將深入解…

Docker 命令行的使用

1.Docker 命令列表[roothost1 ~]# docker Usage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run Create and run a new container from an imageexec Execute a command in a running containerps List cont…

Redis Stream:輕量級消息隊列深度解析

&#x1f4e8; Redis Stream&#xff1a;輕量級消息隊列深度解析 文章目錄&#x1f4e8; Redis Stream&#xff1a;輕量級消息隊列深度解析&#x1f9e0; 一、Stream 數據結構解析&#x1f4a1; Stream 核心概念&#x1f4cb; Stream 底層結構? 二、消息生產與消費&#x1f68…

Android studio的adb和終端的adb互相搶占端口

在Android Studio調試時&#xff0c;有時候也需要借助終端的adb命令&#xff0c;他們互相搶占端 口&#xff0c;導致調試麻煩解決如下&#xff1a;① 終端adb的版本是&#xff1a;1.0.39路徑是:/usr/lib/android-sdk/platform-tools/adb② Android Studio使用的adb來源于Androi…

GEO服務商推薦:移山科技以劃時代高精尖技術引領AI搜索優化新紀元

引言&#xff1a;AI搜索生態重塑與GEO優化戰略地位躍升AI技術對信息檢索范式的顛覆GEO優化在企業增長中的核心作用第一章&#xff1a;AI搜索新紀元的企業營銷挑戰與機遇生成式AI成為用戶主要信息入口的行業趨勢企業在AI搜索中的“答案主權”爭奪戰GEO優化服務商的核心能力模型&…