成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MybatisPlusPro來了,CURD開發效率直接拉滿~

開發 前端
MybatisPlusPro 的出現,徹底改變了我對 CURD 開發的認知。它不僅讓代碼量大幅減少,還通過各種高級特性和性能優化,讓開發變得更加優雅和高效。如果你還在為 Controller 層的 CRUD 接口而煩惱,不妨試試 MybatisPlusPro,相信你會和我一樣,愛上這種 “懶人式” 開發!

兄弟們,今天給大家帶來一個能讓 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 版本中,新增了不少實用功能:

  1. 雪花 ID 配置:支持手動分配 workerId 和 datacenterId,或者指定網卡信息自動獲取,徹底解決分布式 ID 生成問題。
  2. 批量操作增強:BaseMapper 新增批量操作方法,返回值支持 List,方便處理批量操作結果。
  3. 邏輯刪除優化:Service 層邏輯刪除默認支持填充,避免手動處理刪除標記。
  4. 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,相信你會和我一樣,愛上這種 “懶人式” 開發!

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2025-05-13 09:31:27

2025-06-05 00:00:00

項目接口合并

2022-12-29 08:43:43

項目接口請求

2025-05-26 08:10:49

2025-03-04 00:00:00

2019-10-18 09:08:35

Vue組件驗證碼

2019-10-12 10:09:41

Vue 組件對象

2024-01-12 17:06:50

字節面試題目

2025-04-09 12:48:13

模型AI數據

2025-04-25 08:15:00

軟件系統裝機

2025-04-16 00:00:00

2021-11-15 07:45:06

CSS 技巧背景光動畫

2023-04-26 19:22:26

2021-04-16 16:21:02

鴻蒙HarmonyOS應用開發

2024-10-08 13:46:08

2025-05-29 04:15:00

SoraAI視頻

2025-03-27 08:10:19

Spring開發架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 玖玖色在线视频 | av在线免费观看不卡 | 一区二区在线免费观看 | 日韩不卡视频在线观看 | 亚洲综合色自拍一区 | 天天爽网站 | 国产精品亚洲综合 | 国产欧美视频一区 | 国产精品不卡一区 | 国产伦精品一区二区三区照片91 | 91欧美激情一区二区三区成人 | 一区二区三区不卡视频 | 美女毛片免费看 | 日本不卡一区 | 国产精品亚洲片在线播放 | 夜夜久久 | 免费的一级视频 | 亚洲成人免费观看 | 欧美一区二区三区久久精品 | 亚洲欧美中文日韩在线v日本 | 在线国产视频观看 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 国产综合精品 | 欧美精品一区二区三区在线 | 欧美精品91| 亚洲精品亚洲人成人网 | 日本精品网站 | 免费电影av | 狠狠干影院| 伊人伊人 | 精品婷婷 | 97超碰成人| 亚洲高清在线播放 | 91超碰在线 | 成人精品视频在线观看 | 亚洲视频在线免费观看 | 视频在线亚洲 | 国产精品福利一区二区三区 | 免费观看羞羞视频网站 | 亚洲欧美日韩网站 | 美女久久视频 |