MyBatis-Plus 入门到实战,极简实现单表 CRUD

张开发
2026/5/11 18:55:47 15 分钟阅读

分享文章

MyBatis-Plus 入门到实战,极简实现单表 CRUD
一、MyBatis-Plus 核心认知1.1 什么是 MyBatis-PlusMyBatis-Plus简称 MP是国内「苞米豆」团队开发的 MyBatis 增强工具核心理念是只做增强、不做改变基于 MyBatis 扩展引入后不影响原有 MyBatis 代码逻辑专注解决单表 CRUD 重复编码问题无需手写 XML / 注解 SQL大幅提升开发效率。1.2 核心特性对比原生 MyBatis 优势表格特性说明无侵入性完全兼容 MyBatis无需修改现有工程代码通用 CRUD 封装内置BaseMapper/IService继承即拥有全量单表 CRUD 方法主键自动生成支持自增、雪花算法、UUID 等 4 主键策略解决分布式 ID 问题Lambda 条件构造用 Lambda 写查询条件避免硬编码字段名导致的错误丰富内置功能物理分页、性能分析、逻辑删除、乐观锁、代码生成器等多数据库兼容支持 MySQL/Oracle/SQLServer 及达梦、人大金仓等国产数据库1.3 适用场景与多表处理核心场景单表 CRUD开发中 80% 以上的数据库操作场景多表处理方案沿用 MyBatis 方式编写 XML 文件实现关联查询Service 层组装通过多次单表条件查询手动拼接关联数据。二、快速集成 MPSpring Boot MySQL前置条件JDK 8、IDEA/Eclipse、Maven熟悉 Spring Boot 基础配置本地安装 MySQL 并创建测试数据库如boot。步骤 1创建数据库与测试表sql-- 删除原有表避免冲突 DROP TABLE IF EXISTS user; -- 创建 user 表 CREATE TABLE user ( id BIGINT(20) NOT NULL COMMENT 主键ID, name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名, age INT(11) NULL DEFAULT NULL COMMENT 年龄, email VARCHAR(50) NULL DEFAULT NULL COMMENT 邮箱, PRIMARY KEY (id) ); -- 插入测试数据 DELETE FROM user; INSERT INTO user (id, name, age, email) VALUES (1, Jone, 18, test1baomidou.com), (2, Jack, 20, test2baomidou.com), (3, Tom, 28, test3baomidou.com), (4, Sandy, 21, test4baomidou.com), (5, Billie, 24, test5baomidou.com);步骤 2引入核心依赖pom.xml⚠️ 注意不要同时导入 MyBatis 和 MP 依赖避免版本冲突xml!-- MySQL 驱动适配 MySQL 8 -- dependency groupIdmysql/groupId artifactIdmysql-connector-j/artifactId /dependency !-- Lombok简化实体类省去 get/set/构造方法 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- MyBatis-Plus 启动器核心依赖 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.2/version /dependency步骤 3配置数据库连接application.propertiesproperties# 数据源配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver # 注意修改数据库名boot、用户名root、密码root url: jdbc:mysql://localhost:3306/boot?serverTimezoneUTCuseUnicodetruecharacterEncodingUTF-8useSSLfalse username: root password: root # 可选配置 MP 日志控制台打印自动生成的 SQL mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl步骤 4编写核心代码实体类 Mapper 接口4.1 实体类 User与数据库表映射使用 Lombok 注解简化代码字段与数据库列一一对应import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 用户实体类 * 对应数据库 user 表 */ Data // 自动生成 get/set/toString/hashCode/equals 方法 AllArgsConstructor // 全参构造方法 NoArgsConstructor // 无参构造方法 public class User { private Long id; // 主键ID对应数据库 id 字段 private String name; // 姓名对应数据库 name 字段 private Integer age; // 年龄对应数据库 age 字段 private String email; // 邮箱对应数据库 email 字段 }4.2 Mapper 接口 UserMapper核心无需手写 CRUD 方法只需继承 MP 的BaseMapperT接口即可自动获得全量单表 CRUD 方法import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mp.pojo.User; import org.apache.ibatis.annotations.Mapper; /** * 用户 Mapper 接口 * 继承 BaseMapperUser 后自动拥有单表 CRUD 方法 */ Mapper // 标识为 MyBatis Mapper 接口可替换为启动类的 MapperScan public interface UserMapper extends BaseMapperUser { // 无需编写任何方法BaseMapper 已封装所有单表操作 }可选批量扫描 Mapper替代 Mapper 注解在 Spring Boot 启动类添加MapperScan指定 Mapper 包路径无需每个接口加Mapperimport org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Spring Boot 启动类 */ MapperScan(com.mp.mapper) // 扫描 com.mp.mapper 包下所有 Mapper 接口 SpringBootApplication public class MpDemoApplication { public static void main(String[] args) { SpringApplication.run(MpDemoApplication.class, args); } }步骤 5测试 MP 的 CRUD 功能编写 Spring Boot 测试类注入UserMapper直接调用内置方法import com.mp.mapper.UserMapper; import com.mp.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; /** * MP 基础 CRUD 测试 */ SpringBootTest // 标识为 Spring Boot 测试类 public class MpBasicTest { // 自动注入 UserMapperSpring 容器管理 Autowired private UserMapper userMapper; /** * 测试查询所有用户 * selectList(null)null 表示无查询条件查询全表 */ Test public void testSelectAll() { ListUser userList userMapper.selectList(null); // 遍历输出所有用户 userList.forEach(System.out::println); } }执行结果控制台输出数据库中 5 条用户数据同时打印 MP 自动生成的 SQLplaintext Preparing: SELECT id,name,age,email FROM user Parameters: Columns: id, name, age, email Row: 1, Jone, 18, test1baomidou.com Row: 2, Jack, 20, test2baomidou.com Row: 3, Tom, 28, test3baomidou.com Row: 4, Sandy, 21, test4baomidou.com Row: 5, Billie, 24, test5baomidou.com Total: 5 User(id1, nameJone, age18, emailtest1baomidou.com) User(id2, nameJack, age20, emailtest2baomidou.com) User(id3, nameTom, age28, emailtest3baomidou.com) User(id4, nameSandy, age21, emailtest4baomidou.com) User(id5, nameBillie, age24, emailtest5baomidou.com)三、解决实体类与数据库表 / 字段不一致问题实际开发中实体类名 / 字段名常与数据库表名 / 列名不一致通过 MP 注解快速解决3.1 表名不一致TableName作用指定实体类对应的数据库表名。示例实体类SysUser对应数据库表sys_userimport com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(sys_user) // 显式指定数据库表名 public class SysUser { private Long id; private String name; private Integer age; private String email; }3.2 字段名不一致TableField作用指定实体类字段对应的数据库列名。示例实体类字段userName对应数据库列user_nameimport com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(sys_user) public class SysUser { private Long id; TableField(user_name) // 字段 userName 对应列 user_name private String userName; private Integer age; TableField(user_email) // 字段 userEmail 对应列 user_email private String userEmail; }四、核心扩展BaseMapper 内置常用 CRUD 方法表格方法名功能说明示例selectList(Wrapper)根据条件查询多条数据selectList(null)→ 查询全表selectById(主键)根据主键查询单条数据selectById(1L)→ 查询 id1insert(实体)新增数据insert(new User(null, Lucy, 22, lucytest.com))updateById(实体)根据主键更新数据updateById(new User(1L, Jone, 19, test1baomidou.com))deleteById(主键)根据主键删除数据deleteById(5L)→ 删除 id5selectCount(Wrapper)根据条件统计数量selectCount(null)→ 统计全表行数五、总结核心要点MP 定位MyBatis 增强工具无侵入、专注简化单表 CRUD多表操作仍可沿用 MyBatis 方式核心简化点继承BaseMapperT即可获得全量单表 CRUD 方法无需手写 SQL关键配置日志配置通过mybatis-plus.configuration.log-impl查看自动生成的 SQL方便调试映射注解TableName解决表名不一致TableField解决字段名不一致集成流程建库建表 → 引入依赖 → 配置数据源 → 编写实体类 / Mapper → 测试 CRUD。后续进阶方向主键生成策略雪花算法、自增等Lambda 条件构造器复杂条件查询分页查询物理分页替代 MyBatis 分页插件逻辑删除软删除保留数据记录通用 ServiceIService/ServiceImpl封装更上层的业务逻辑。

更多文章