MybatisPlusPro让CURD开发效率直接拉满

 更新时间:2026年06月03日 09:36:09   作者:隔壁老王的代码  
MybatisPlusPro 的出现,彻底改变了我对 CURD 开发的认知,它不仅让代码量大幅减少,还通过各种高级特性和性能优化,让开发变得更加优雅和高效

一、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

功能MybatisPlusMybatisPlusPro
Controller 层需要手动编写 CRUD 接口继承 BaseController 自动生成接口
分页排序需要手动处理 Page 和 Wrapper自动处理分页参数,支持动态排序
批量操作提供 saveBatch 方法结合 rewriteBatchedStatements 优化
数据权限需自定义拦截器内置 @DataScope 注解,一键实现
表结构维护需手动执行 SQL 脚本自动维护表结构,支持多数据源

从表格可以看出,MybatisPlusPro 在开发效率和功能完整性上都更胜一筹,堪称 CURD 开发的 “瑞士军刀”!

八、写在最后

MybatisPlusPro 的出现,彻底改变了我对 CURD 开发的认知。它不仅让代码量大幅减少,还通过各种高级特性和性能优化,让开发变得更加优雅和高效。如果你还在为 Controller 层的 CRUD 接口而烦恼,不妨试试 MybatisPlusPro,相信你会和我一样,爱上这种 “懒人式” 开发!

到此这篇关于MybatisPlusPro让CURD开发效率直接拉满的文章就介绍到这了,更多相关MybatisPlusPro CURD开发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论