MyBatis-Plus 概述
什么是 MyBatis-Plus
MyBatis-Plus
- 核心特性
- 无侵入
只做增强不做改变: - 损耗小
启动即会自动注入基本 CURD: 性能基本无损耗, - 强大的 CRUD 操作
内置通用 Mapper: 通用 Service、 - 支持 Lambda 形式调用
通过 Lambda 表达式: 方便的编写各类查询条件, - 支持主键自动生成
支持多达 4 种主键策略: - 支持 ActiveRecord 模式
支持 ActiveRecord 形式调用: - 支持自定义全局通用操作
支持全局通用方法注入: - 内置代码生成器
采用代码或者 Maven 插件可快速生成 Mapper: Model、 Service、 Controller 层代码、 - 内置分页插件
基于 MyBatis 物理分页: 开发者无需关心具体操作, - 分页插件支持多种数据库
支持 MySQL: MariaDB、 Oracle、 DB2、 H2、 HSQL、 SQLite、 Postgre、 SQLServer 等多种数据库、 - 内置性能分析插件
可输出 SQL 语句以及其执行时间: 建议开发测试时启用该功能, 能快速揪出慢查询, - 内置全局拦截插件
提供全表 delete: update 操作智能分析阻断、 也可自定义拦截规则, 预防误操作,
- 无侵入
MyBatis-Plus vs MyBatis
| 特性 | MyBatis | MyBatis-Plus |
|---|---|---|
| CRUD 操作 | 需要手动编写 | 内置通用 Mapper |
| 分页功能 | 需要第三方插件 | 内置分页插件 |
| 代码生成 | 需要第三方工具 | 内置代码生成器 |
| 条件构造 | 需要手动拼接 SQL | 支持 Wrapper 条件构造器 |
| 学习成本 | 较低 | 低 |
| 灵活性 | 高 | 高 |
1 | 细节注意 |
MyBatis-Plus 的核心组件
BaseMapper
- 提供基础的 CRUD 操作
- 包含 17 个常用方法
- 支持泛型
类型安全,
IService
- Service 层的通用接口
- 封装了常用的业务逻辑
- 支持批量操作
Wrapper
- 条件构造器
- 支持 Lambda 表达式
- 链式调用
简洁优雅,
AutoGenerator
- 代码生成器
- 支持自定义模板
- 一键生成多层代码
环境搭建
Spring Boot 整合
添加依赖
1 | <!-- MyBatis-Plus --> |
配置文件
1 | # application.yml |
创建数据库表
1 | -- 创建用户表 |
创建实体类
1 | package com.example.entity; |
常用注解说明
| 注解 | 说明 | 示例 |
|---|---|---|
| @TableName | 指定表名 | @TableName("sys_user") |
| @TableId | 主键注解 | @TableId(type = IdType.AUTO) |
| @TableField | 字段注解 | @TableField("user_name") |
| @TableLogic | 逻辑删除 | @TableLogic |
| @Version | 乐观锁 | @Version |
创建 Mapper 接口
1 | package com.example.mapper; |
配置类
1 | package com.example.config; |
CRUD 操作
插入操作
1 |
|
删除操作
1 | // 根据 ID 删除 |
更新操作
1 | // 根据 ID 更新 |
查询操作
基本查询
1 | // 根据 ID 查询 |
条件查询
1 | // QueryWrapper 条件构造器 |
分页查询
1 |
|
1 | <!-- Mapper XML 中的分页查询 --> |
条件构造器
QueryWrapper
用于查询条件构造
1 | // 基本用法 |
LambdaQueryWrapper
类型安全的查询条件构造
1 | LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); |
UpdateWrapper
用于更新条件构造
1 | UpdateWrapper<User> wrapper = new UpdateWrapper<>(); |
LambdaUpdateWrapper
类型安全的更新条件构造
1 | LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>(); |
常用条件方法
| 方法 | 说明 | SQL 等价 |
|---|---|---|
| eq | 等于 | = |
| ne | 不等于 | <> |
| gt | 大于 | > |
| ge | 大于等于 | >= |
| lt | 小于 | < |
| le | 小于等于 | <= |
| like | 模糊查询 | LIKE '%value%' |
| in | IN 查询 | IN (v1, v2, ...) |
| between | 范围查询 | BETWEEN v1 AND v2 |
| orderByDesc | 降序排序 | ORDER BY ... DESC |
Service 层封装
IService 接口
MyBatis-Plus 提供了 IService 接口
创建 Service 接口
1 | package com.example.service; |
创建 Service 实现类
1 | package com.example.service.impl; |
常用方法
保存操作
1 | // 插入一条记录 |
删除操作
1 | // 根据 ID 删除 |
更新操作
1 | // 根据 ID 更新 |
查询操作
1 | // 根据 ID 查询 |
使用示例
1 |
|
代码生成器
添加依赖
1 | <!-- 代码生成器 --> |
生成代码
1 | package com.example.generator; |
生成的代码结构
1 | src/main/java/com/example/system/ |
高级功能
逻辑删除
配置
1 | mybatis-plus: |
实体类
1 |
|
使用
1 | // 删除操作会转换为更新操作 |
乐观锁
数据库添加版本字段
1 | ALTER TABLE `user` ADD COLUMN `version` INT DEFAULT 1 COMMENT '版本号'; |
实体类
1 |
|
配置插件
1 |
|
使用
1 | // 1. 查询数据 |
自动填充
创建元数据处理器
1 | package com.example.handler; |
实体类
1 |
|
枚举处理
创建枚举
1 | package com.example.enums; |
实体类
1 | private GenderEnum gender; |
配置
1 | mybatis-plus: |
SQL 注入器
自定义全局操作方法
1 | // 自定义方法 |
性能优化
分页优化
1 | // 使用 CountOptimizer 优化 COUNT 查询 |
批量操作优化
1 | // 使用 saveBatch 代替循环插入 |
缓存优化
1 | <!-- 开启二级缓存 --> |
SQL 性能分析
1 | mybatis-plus: |
1 | // 开发环境启用性能分析插件 |
最佳实践
命名规范
1 | Mapper 接口 |
代码规范
1 | // 1. 优先使用 LambdaQueryWrapper |
性能建议
1 | // 1. 避免 N+1 查询问题 |
常见问题
主键策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
| AUTO | 数据库自增 | MySQL |
| INPUT | 用户输入 | 需要手动设置 ID |
| ASSIGN_ID | 雪花算法 | 分布式系统 |
| ASSIGN_UUID | UUID | 需要唯一标识 |
字段映射问题
1 | // 问题 |
分页不生效
1 | // 确保配置了分页插件 |
报错处理
💗💗 MyBatis-Plus 报错: Invalid bound statement
1 | 错误信息 |
💗💗 MyBatis-Plus 报错: Table ‘xxx’ doesn’t exist
1 | 错误信息 |
💗💗 MyBatis-Plus 报错: Failed to process
1 | 错误信息 |
学习资源
- 视频
- MyBatisPlus 教程
: https://www.bilibili.com/video/BV12R4y157Be
- MyBatisPlus 教程
- 官方文档
- MyBatis-Plus 官方文档
: https://baomidou.com/ - MyBatis-Plus GitHub
: https://github.com/baomidou/mybatis-plus
- MyBatis-Plus 官方文档
- 书籍
MyBatis-Plus 从入门到精通《 》 社区编著:
- 教程
- MyBatis-Plus 入门教程
: https://baomidou.com/pages/24112f/ - Baeldung MyBatis-Plus 教程
: https://www.baeldung.com/mybatis-plus
- MyBatis-Plus 入门教程
- 工具
- MyBatis-Plus Generator
代码生成器: - MyBatisX
IDEA 插件:
- MyBatis-Plus Generator
- 社区
- MyBatis-Plus Gitee
: https://gitee.com/baomidou/mybatis-plus - Stack Overflow MyBatis-Plus 标签
: https://stackoverflow.com/questions/tagged/mybatis-plus
- MyBatis-Plus Gitee