條件構造器
mybatisPlus支持各種復雜的where條件, 滿足日常的開發
wrapper類就是條件構造器
提供了很多子類
條件構造器的用法:
- QueryWrapper和LambdaQueryWrapper通常用來構建select、delete、update的where條件部分
- UpdateWrapper和LambdaUpdateWrapper通常只有在set語句比較特殊才使用
- 盡量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬編碼
自定義SQL
我們可以利用MyBatisPlus的Wrapper來構建復雜的Where條件,然后自己定義SQL語句中剩下的部分
① 基于Wrapper構建where條件
List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
// 1.構建條件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定義SQL方法調用
userMapper.updateBalanceByIds(wrapper, amount);
② 在mapper方法參數中用Param注解聲明wrapper變量名稱,必須是ew
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
③ 自定義SQL,并使用Wrapper條件
<update id="updateBalanceByIds">UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
service接口
接口使用流程:
1.自定義 Service 接口繼承 IService
- 作用:讓自定義的 Service 接口具備 MP
IService
中封裝的通用 CRUD(創建、讀取、更新、刪除 )等基礎方法,無需手動編寫簡單的增刪改查邏輯。 - 代碼示例:
// 自定義 IUserService 接口,繼承 MP 的 IService,泛型指定操作的實體類 User
public interface IUserService extends IService<User> { // 可在此擴展自定義業務方法,如復雜查詢、業務邏輯組合等
}
2.自定義 Service 實現類,繼承 ServiceImpl
并實現自定義接口
- 作用:
ServiceImpl
類已經實現了IService
接口的通用方法,繼承它后,自定義實現類可直接復用這些通用操作;同時實現自定義IUserService
接口,保證接口方法的實現與自定義業務邏輯補充。 - 代碼示例:
// UserServiceImpl 實現類,繼承 ServiceImpl(需指定對應的 Mapper 接口和實體類),并實現 IUserService
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {// 若 IUserService 有自定義方法,在此實現;也可直接使用父類 ServiceImpl 繼承來的通用方法,如 save、update、remove、list 等
}
常見CURD:
新增
方法 | 作用 |
| 保存單個實體對象到數據庫,返回是否成功( |
| 批量保存實體對象集合,默認批次大小,返回操作結果 |
| 帶自定義批次大小的批量保存,靈活控制批量操作頻次 |
| 批量保存或更新,根據實體主鍵判斷,存在則更新、不存在則新增 |
| 自定義批次大小的批量保存或更新 |
| 單個實體的保存或更新,依據主鍵判斷操作類型 |
| 結合條件的單個實體保存或更新,條件用于輔助判斷等場景 |
修改
方法 | 作用 |
| 根據實體對象的主鍵更新對應記錄,更新非 |
| 通過條件構造器 |
| 指定實體對象(設置要更新的字段值 )和條件構造器 |
| 批量根據主鍵更新實體對象集合,每條記錄更新非 |
| 自定義批次大小的批量主鍵更新 |
| 前面新增分類里也有,兼具保存或更新邏輯,依據主鍵判斷 |
查詢
方法 | 作用 |
| 根據主鍵 ID 查詢單個實體對象 |
| 通過條件構造器 |
| 帶是否拋出異常參數,結果多條時, |
| 根據主鍵 ID 集合,查詢對應的實體列表 |
| 根據 |
| 通過條件構造器 |
| 查詢對應實體類的全表數據列表 |
| 結合分頁參數 |
| 僅用分頁參數 |
| 獲取 Lambda 語法的查詢鏈 |
| 帶實體對象的 Lambda 查詢鏈,可基于實體初始值輔助構造條件 |
| 獲取 Lambda 語法的更新鏈 |
刪除
方法 | 作用 |
| 根據主鍵 ID 刪除對應的實體記錄 |
| 帶是否邏輯刪除(若開啟邏輯刪除 )的參數,控制刪除行為 |
| 通過實體對象(主要用主鍵 )刪除記錄 |
| 根據 |
| 用條件構造器 |
| 根據主鍵 ID 集合,批量刪除對應記錄 |
| 帶邏輯刪除控制參數的批量主鍵刪除 |
| 批量刪除主鍵對應記錄,內部處理批次等邏輯 |
| 帶邏輯刪除控制的批量主鍵刪除 |
| 自定義批次大小、帶邏輯刪除控制的批量主鍵刪除 |
| 更細粒度控制(批次大小、邏輯刪除 )的批量主鍵刪除 |
統計
方法 | 作用 |
| 統計對應實體類全表的記錄總數 |
| 根據條件構造器 |
分頁查詢
方法分類 | 方法簽名 | 功能說明 | 典型使用場景 |
分頁查詢 |
| 傳入分頁對象(如 | 分頁+條件(如年齡>25 歲)查詢用戶,同時獲取總條數、總頁數等分頁元數據 |
分頁查詢 |
| 僅通過分頁對象( | 對大數據量表(如系統操作日志)做全表分頁展示,按頁加載避免一次性查全表 |
列表查詢
方法分類 | 方法簽名 | 功能說明 | 典型使用場景 |
列表查詢 |
| 根據主鍵集合批量查詢,傳入 ID 集合,返回對應實體列表 | 批量獲取指定 ID 的用戶信息,如 |
列表查詢 |
| 用 | 按 |
列表查詢 |
| 結合 | 多條件組合(如年齡>18 且性別為男)查詢,滿足復雜業務篩選需求 |
列表查詢 |
| 查詢對應實體類全表數據,返回所有記錄 | 加載數據量小的字典表(如狀態枚舉表)全量內容 |
Lambda 操作
方法分類 | 方法簽名 | 功能說明 | 典型使用場景 |
Lambda 操作 |
| 獲取 Lambda 查詢鏈,支持鏈式調用+Lambda 表達式寫條件,簡化查詢構建 | 鏈式寫法: |
Lambda 操作 |
| 基于傳入實體的初始值,結合 Lambda 鏈補充條件查詢 | 已有部分實體數據(如姓名),再疊加年齡條件: |
Lambda 操作 |
| 獲取 Lambda 更新鏈,用鏈式+Lambda 表達式定義更新字段和條件 | 鏈式更新: |