MybatisPlusPro來了,CURD開發效率直接拉滿~
兄弟們,今天給大家帶來一個能讓 CURD 開發效率直接起飛的神器 ——MybatisPlusPro!如果你還在為寫 Controller 層的增刪改查接口而頭疼,或者覺得 MybatisPlus 的通用功能還不夠 “解渴”,那這篇文章絕對能讓你直呼 “真香”!
一、MybatisPlusPro 是什么鬼?
先給大家講個扎心的故事:我司有個叫富貴的同學,天天用 MybatisPlus 寫 DAO 層,覺得這玩意兒確實香,CRUD 操作分分鐘搞定。但問題來了,上到 Controller 層,他發現每個接口都得重復寫 Service 和 Mapper 的調用,代碼像 “套娃” 一樣,搬磚搬得手都酸了。
于是,富貴同學一氣之下,擼了個MybatisPlusPro—— 說白了,就是在 MybatisPlus 的基礎上再封裝一層,把通用的 CURD 功能從 Service 擴展到 Controller。只要你的 Controller 繼承BaseController,所有的增刪改查接口自動擁有,連分頁、排序、統計都給你配得明明白白!
舉個栗子:
@RestController
@RequestMapping("/blog")
public class BlogController extends BaseController<Blog, BlogService> {
// 啥也不用寫,直接繼承BaseController
}
就這么簡單,前端直接調接口,媽媽再也不用擔心我的 CRUD!
二、核心功能解析:懶人福音
1. 一行代碼搞定 CRUD
BaseController 提供了標準的 REST 風格接口,增刪改查全搞定:
- 增:/insert 接口,直接傳實體對象就能插入數據庫。
- 刪:/deleteById 接口,支持批量刪除,傳個 ID 列表就行。
- 改:/updateById 接口,自動根據 ID 更新數據。
- 查:/getById 接口,根據 ID 查詢單條數據。
- 存:/save 接口,自動判斷是插入還是更新。
這一套組合拳下來,以前寫一個接口的時間,現在能寫十個!
2. 分頁查詢:前端直接 “抄作業”
分頁查詢是后端開發的 “家常便飯”,MybatisPlusPro 直接幫你封裝好了:
@PostMapping("/page")
public ResponseUtils page(@RequestBody PageParamDto<Blog> pageParamDto) {
// 自動處理分頁參數,限制每頁最大100條
Page<Blog> page = new Page<>(pageParamDto.getPage(), pageParamDto.getSize());
QueryWrapper<Blog> queryWrapper = new QueryWrapper<>();
// 處理升序、降序參數
if (!StrUtil.isEmpty(pageParamDto.getAsc())) {
queryWrapper.orderByAsc(pageParamDto.getAsc().split(","));
}
if (!StrUtil.isEmpty(pageParamDto.getDesc())) {
queryWrapper.orderByDesc(pageParamDto.getDesc().split(","));
}
return ResponseUtils.success(baseService.page(page, queryWrapper));
}
前端只需要傳個 JSON 參數:
{
"page": 1,
"size": 10,
"asc": "create_time",
"desc": "id"
}
就能拿到分頁數據,連排序都不用自己寫 SQL!
3. 動態查詢:反射幫你 “偷懶”
MybatisPlusPro 還支持動態查詢,通過反射自動構建查詢條件:
@PostMapping("/list")
public ResponseUtils list(@RequestBody Blog blog) {
QueryWrapper<Blog> queryWrapper = ApprenticeUtil.getQueryWrapper(blog);
return ResponseUtils.success(baseService.list(queryWrapper));
}
比如前端傳個{"title": "MybatisPlusPro"},就會自動生成WHERE title = 'MybatisPlusPro'的條件,是不是很神奇?
三、高級特性:讓 CRUD 更優雅
1. 數據審計:對賬不再頭大
Mybatis-Mate 模塊提供了數據審計功能,比如銀行流水對賬,自動對比兩個對象的屬性差異:
// 異步回調方式
applicationEventPublisher.publishEvent(new DataAuditEvent((t) -> {
List<Change> changes = t.apply(newVersion, oldVersion);
changes.forEach(change -> {
ValueChange valueChange = (ValueChange) change;
System.err.println(String.format("%s不匹配,期望值 %s 實際值 %s",
valueChange.getPropertyName(), valueChange.getLeft(), valueChange.getRight()));
});
}));
// 手動調用方式
DataAuditor.compare(obj1, obj2);
有了這個功能,再也不用擔心數據不一致的問題了!
2. 數據權限:精準控制訪問
通過@DataScope注解,可以實現行級粒度的權限控制,比如上級部門只能查看子部門的數據:
@DataScope(type = "test", value = {
@DataColumn(alias = "u", name = "department_id"),
@DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> page, Long id, @Param("name") String username);
最終生成的 SQL 會自動添加權限條件:
SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5')) AND u.mobile LIKE '%1533%'
3. 表結構自動維護:告別手動改表
Mybatis-Mate 還支持數據庫表結構的自動維護,比如新增字段、修改字段類型:
@Component
public class MysqlDdl implements IDdl {
@Override
public List<String> getSqlFiles() {
return Arrays.asList("db/tag-schema.sql", "D:\\db\\tag-data.sql");
}
}
首次執行會在數據庫中生成ddl_history表,記錄每次執行的 SQL 腳本,以后升級表結構就像 “傻瓜式安裝” 一樣簡單!
四、性能優化:讓 CRUD 飛起來
1. 批量插入:效率提升 2000%
傳統的逐條插入簡直是 “龜速”,MybatisPlusPro 提供了批量插入優化方案:
- 開啟 rewriteBatchedStatements 參數:
jdbc:mysql://localhost:3306/db_name?rewriteBatchedStatements=true
- 預先生成 ID:
long examId = zzidc.nextId(); // 雪花算法生成全局唯一ID
exam.setId(examId);
examMapper.insert(exam);
- 使用 saveBatch 方法:
List<Question> questionList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Question question = new Question();
question.setId(zzidc.nextId());
questionList.add(question);
}
questionService.saveBatch(questionList, 1000); // 分批插入,每批1000條
實測數據:傳統逐條插入 1 萬條數據需要 12 秒,而優化后僅需 0.5 秒,性能提升2000%!
2. 分頁優化:避免全表掃描
- 優化 Count 查詢:
// 用count(1)代替count(*)
queryWrapper.select("count(1) as total");
- 避免排序字段無索引:
// 確保排序字段有索引
@TableIndex("idx_create_time")
private Date create_time;
3. 樂觀鎖:高并發下的數據安全
在高并發場景下,樂觀鎖可以防止數據覆蓋:
// 實體類添加@Version注解
@Version
private Integer version;
// 配置樂觀鎖插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
當多個線程同時更新數據時,只有版本號一致的線程才能成功,避免了臟讀和幻讀。
五、實戰案例:考試系統中的批量插入
以考試系統為例,創建一份試卷需要插入試卷、題目、選項等多張表的數據。使用 MybatisPlusPro 的批量插入功能,輕松搞定:
@Service
publicclass ExamServiceImpl implements ExamService {
@Autowired
private ExamMapper examMapper;
@Autowired
private QuestionService questionService;
@Autowired
private OptionService optionService;
privatestaticfinalint BATCH_SIZE = 2000;
@Override
@Transactional(rollbackFor = Exception.class)
public void createExam(Exam exam, int questionCount, int optionCountPerQuestion) {
// 預先生成試卷ID
long examId = zzidc.nextId();
exam.setId(examId);
examMapper.insert(exam);
List<Question> questionList = new ArrayList<>();
List<Option> allOptionList = new ArrayList<>();
for (int i = 0; i < questionCount; i++) {
// 預先生成題目ID
long questionId = zzidc.nextId();
Question question = new Question();
question.setId(questionId);
question.setExamId(examId);
questionList.add(question);
// 生成選項數據
for (int j = 0; j < optionCountPerQuestion; j++) {
Option option = new Option();
option.setId(zzidc.nextId());
option.setQuestionId(questionId);
allOptionList.add(option);
}
}
// 批量插入題目和選項
questionService.saveBatch(questionList, BATCH_SIZE);
optionService.saveBatch(allOptionList, BATCH_SIZE);
}
}
整個過程行云流水,再也不用為批量插入的性能問題發愁了!
六、版本更新:2025 最新特性
MybatisPlusPro 在 2025 年 4 月發布的 3.5.12 版本中,新增了不少實用功能:
- 雪花 ID 配置:支持手動分配 workerId 和 datacenterId,或者指定網卡信息自動獲取,徹底解決分布式 ID 生成問題。
- 批量操作增強:BaseMapper 新增批量操作方法,返回值支持 List,方便處理批量操作結果。
- 邏輯刪除優化:Service 層邏輯刪除默認支持填充,避免手動處理刪除標記。
- SQL 注入防護:UpdateWrapper 增加 checkSqlInjection 方法,防止惡意 SQL 注入。
七、總結:MybatisPlusPro vs MybatisPlus
功能 | MybatisPlus | MybatisPlusPro |
Controller 層 | 需要手動編寫 CRUD 接口 | 繼承 BaseController 自動生成接口 |
分頁排序 | 需要手動處理 Page 和 Wrapper | 自動處理分頁參數,支持動態排序 |
批量操作 | 提供 saveBatch 方法 | 結合 rewriteBatchedStatements 優化 |
數據權限 | 需自定義攔截器 | 內置 @DataScope 注解,一鍵實現 |
表結構維護 | 需手動執行 SQL 腳本 | 自動維護表結構,支持多數據源 |
從表格可以看出,MybatisPlusPro 在開發效率和功能完整性上都更勝一籌,堪稱 CURD 開發的 “瑞士軍刀”!
八、寫在最后
MybatisPlusPro 的出現,徹底改變了我對 CURD 開發的認知。它不僅讓代碼量大幅減少,還通過各種高級特性和性能優化,讓開發變得更加優雅和高效。如果你還在為 Controller 層的 CRUD 接口而煩惱,不妨試試 MybatisPlusPro,相信你會和我一樣,愛上這種 “懶人式” 開發!