一、MyBatis-Plus核心概念与原理
1.是什么?
MyBatis-Plus(简称MP)是MyBatis的增强工具,以无侵入性为核心设计理念,在MyBatis基础上仅做功能扩展而不修改原生逻辑。通过内置通用CRUD、代码生成器等模块,MP将单表操作效率提升至极致。
2.工作原理
- 动态SQL生成:基于实体类与数据库表的映射关系(通过注解如@TableName、@TableField),MP自动构建条件构造器(如QueryWrapper),生成动态SQL。
- 启动时注入:MP在应用启动时解析继承BaseMapper的接口,通过反射生成MappedStatement,并将通用CRUD方法注册到MyBatis的Configuration对象中5。
- 执行流程:通过MyBatis的Executor执行生成的SQL,结合分页插件、乐观锁等拦截器实现高级功能。
二、MyBatis-Plus的五大核心优势
1.开发效率革命
- 零SQL编码:单表CRUD无需手写SQL,通过BaseMapper内置17种通用方法(如selectList、updateById)实现快速开发。
- Lambda支持:避免字段硬编码错误,如:
- java
queryWrapper.lambda().eq(User::getName, "Tom").gt(User::getAge, 20);
2.功能扩展强大
- 代码生成器:一键生成Entity、Mapper、Service、Controller层代码,支持Freemarker/Velocity模板引擎。
- 插件体系:分页插件(支持多数据库)、性能分析插件、逻辑删除插件等开箱即用。
3.多场景适配
- 主键策略多样化:支持自增、UUID、雪花算法等,适配分布式场景。
- ActiveRecord模式:实体类继承Model可直接调用CRUD方法,简化DAO层。
三、核心配置详解
1.依赖引入
xml
com.baomidou
mybatis-plus-boot-starter
3.4.3
注意:避免同时引入MyBatis原生依赖,防止版本冲突。
2.YAML配置示例
yaml
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志
global-config:
db-config:
id-type: ASSIGN_ID # 主键策略为雪花算法
logic-delete-field: deleted # 逻辑删除字段
3.注解应用
- @TableName("user"):表名映射5
- @TableId(type = IdType.AUTO):主键自增6
- @TableLogic:逻辑删除字段标记9
四、十大避坑指南
1.条件构造器字段名陷阱
- 错误示例:wrapper.eq("userName", "Tom")(字段应为数据库列名user_name)
- 正确做法:使用Lambda表达式或确保字段名与数据库一致59。
2.逻辑删除配置遗漏
- 需在实体类添加@TableLogic,并在全局配置中指定逻辑删除值:
- yaml
mybatis-plus.global-config.db-config.logic-delete-value=1
logic-not-delete-value=0
3.分页插件未启用
- 必须配置分页拦截器:
- java
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
4.乐观锁版本号未加注解
- 实体类字段需添加@Version,并在更新时传入版本号。
5.事务管理疏忽
- MP默认不开启事务,需在Service层添加@Transactional。
五、性能优化与高级技巧
1.SQL性能监控
启用p6spy插件,输出带执行时间的完整SQL:
yaml
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/db
2.批量操作优化
使用SqlSession的批量模式:
java
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 批量插入
users.forEach(mapper::insert);
sqlSession.commit();
总结
MyBatis-Plus通过极简设计与功能扩展,成为Java持久层开发的效率利器。掌握其核心配置与避坑技巧,可避免80%的常见问题。关注我,获取更多架构师级干货!
你在使用MyBatis-Plus时踩过哪些坑?欢迎评论区互动讨论!